Ler Arquivo txt verificar aniversario e enviar email em Java

10 respostas
Fernanda_Gomes1

Estou em duvida de como fazer o seguinte exercicio:
Um program em Java que leia as informações (nome, e-mail, data de nascimento) de um arquivo de entrada denominado “clientes.txt”, processe os dados verificando se o dia atual (execução do programa) possui aniversariantes. Caso exista aniversariantes envie um e-mail contendo uma mensagem de felicitação ao estilo cartão de aniversário (e-mail HTML com estilização e imagem) após o envio das mensagens utilize um JOptionPane para comunicar o sucesso ao enviar. No caso contrário, utilize do JOptionPane para informa a inexistência de aniversariantes no dia.

10 Respostas

JulioCesarSF

Em que formato os clientes estão dentro do txt?
Para enviar o email tem o JavaMail (não sei se tem algo mais novo).
Verificar a data é uma simples comparação.

Fernanda_Gomes1

Exemplo de como estaria no arquivo:

Fernanda [email removido] 12/04/2012
Joaquim [email removido] 09/08/2015
Marcos [email removido] 16/11/2014

Tem como me ajuda a ler o arquivo para fazer a comparação de datas?

B
public static void main(String[] args) {
        String x = "Fernanda [email removido] 12/04/2012";

        Pattern pa = Pattern.compile("([0-9]{2}\\/[0-9]{2}\\/[0-9]{4})$");

        Matcher matcher = pa.matcher(x);

        if (matcher.find()) {
            String data = matcher.group(1);

            pa = Pattern.compile("[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+");

            matcher = pa.matcher(x);

            if (matcher.find()) {
                String email = matcher.group();

                String aniversario= "12/04/2012";

                if (data.equals(aniversario)) {
                    //envia email
                }
            }
        }
    }
JulioCesarSF
import java.io.BufferedReader;
import java.io.FileReader;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class Principal {

	private static final String ARQUIVO = "lista.txt";
	
	public static void main(String[] args) {		
		try(BufferedReader br = new BufferedReader(new FileReader(ARQUIVO))){
			String line;
			while((line = br.readLine()) != null){
				String[] info = line.split(" ");
				if(info[2] != null){
					DateTimeFormatter fmt = DateTimeFormatter.ofPattern("dd/MM/yyyy");
					LocalDate aniversario = LocalDate.parse(info[2], fmt);
					if(aniversario.getMonth().equals(LocalDate.now().getMonth()) && aniversario.getDayOfMonth() == LocalDate.now().getDayOfMonth()){
						System.out.println("Aniversário de " + info[0] + " é hoje!");
					}else{
						System.out.println(info[0] + " não faz aniversário hoje. [" + aniversario.toString() + "]");
					}
				}
			}
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
}
Fernanda_Gomes1

Li o arquivo assim e funcionou a leitura e pedi para mostrar funcionou, falta entender e codificar para buscar a data dentro do arquivo…

package main;

import java.io.FileInputStream;
import java.io.FileReader;
import main.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) throws IOException {
        File arquivo = new File("C:\\Users\\Fer Gomes\\Documents\\NetBeansProjects\\Daniel\\src\\main\\clientes.txt");

        //CONTAR TANTO DE LINHA PARA COLOCAR NO FOR
        LineNumberReader linha = new LineNumberReader(new InputStreamReader(new FileInputStream("C:\\Users\\Fer Gomes\\Documents\\NetBeansProjects\\Daniel\\src\\main\\clientes.txt")));
        String nextLine = null;
        FileReader fr = new FileReader("C:\\Users\\Fer Gomes\\Documents\\NetBeansProjects\\Daniel\\src\\main\\clientes.txt");
        LineNumberReader lnr = new LineNumberReader(fr);
        int linenumber = 0;
        while (lnr.readLine() != null) {
            linenumber++;
        }
        lnr.close();

        String textoArq = arquivo.read();
        System.out.println(textoArq);

        int qtdLinha = 0;
        int mesA = 0, dia = 0;
        int diaA = 0 ;
        for (int i = 0; qtdLinha <= linenumber; i++) {
            if (dia == diaA) {
                //ENVIAR EMAIL AO ANIVERSARIANTE
            } else {
                //DIZER QUE NÃO EXISTE ANIVERSARIANTES NO DIA
            }

            final int tamanhoCodigo = 10;
            String s = ".com ";

         
        }
        Scanner sc = new Scanner("C:\\Users\\Fer Gomes\\Documents\\NetBeansProjects\\Daniel\\src\\main\\clientes.txt");
        String linhas = sc.nextLine();
        final int tamanhoCodigo = 10;
        String bs = "@gmail.com ";
        int pos = linhas.indexOf(bs);
        String saida = linhas.substring(pos + bs.length(), pos + bs.length() + tamanhoCodigo);
        System.out.println(saida);
        
        
    }
}

Estou construindo o email com imagem em outra classe.

Felipe_Carli

Tenho uma pergunta para dentro do tópico que seria pertinente, porque também era uma dúvida minha quando li essa postagem, porque preciso fazer isso em meu trabalho e queria saber como seria no caso das informações no txt não estarem totalmente ordenados, como faço no código para fazer a busca dessas informações?

JulioCesarSF

No código postei, como você informou o formato da linhas separados por um espaço, a data é o último sempre. Eu dou um split e pego o info[2] que é data e faço a conversão.

Fernanda_Gomes1

Teria como explicar o que é split e como eu faço?

JulioCesarSF

Split é um método da classe String que vai dividir a sua string de acordo com o regex/valor que você passar.

Então, por exemplo, no seu caso cada linha é da seguinte forma:
Fernanda [email removido] 12/04/2012

Cada dado está separado por um espaço. Se você der um split nesta string (linha toda) usando o espaço ele vai te retornar um vetor de String.
Eu sei que na última posição está a data.

JulioCesarSF

Qual seria o formato?

Dá para usar o meu código até a parte do split e depois você busca o quer com Pattern usando regex por exemplo.

Criado 24 de novembro de 2017
Ultima resposta 2 de dez. de 2017
Respostas 10
Participantes 4