Oi pessoal, estou desenvolvendo um sistema de envio de emails automaticos alertando com 60, 30, 15 e 7 dias de antecedência sobre a data de expiracao de convenios. Então eu fiz um Timer que deve verificar as datas de expiracao dos convênios uma vez por dia e comparar com a data atual para saber se é para enviar email naquele dia. Isso está OK. Porém quando eu vou buscar na lista de emails o endereco correspondente a um contrato especifico estou tendo dificuldades.
Ele está buscando todos os enderecos da lista e mandando os emails para todo mundo. O que estou fazendo de errado? Segue o código abaixo:
package br.ufpa.ctic.sicc.email.logica;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.SimpleEmail;
import br.ufpa.ctic.sicc.email.dao.DataExpiracaoDao;
import br.ufpa.ctic.sicc.email.dao.EnderecoEmailDAO;
import br.ufpa.ctic.sicc.email.modelo.DataExpiracao;
import br.ufpa.ctic.sicc.email.modelo.EnderecoEmail;
public class SiccEmailTimerConv {
private final Timer timer = new Timer();
private final int minuto = 60000;
private final int dia = minuto * 60 * 24;
public void start() {
// Timer que inicia a partir da data atual e itera a cada dia
timer.schedule(new TimerTask() {
public void run() {
try {
// Pesquisa as datas e verifica se eh para mandar os emails
pesquisaDatas();
} catch (SQLException e) {
e.printStackTrace();
}
}
public void pesquisaDatas() throws SQLException {
// Seta o calendario para a data atual
Date dataAtual = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(dataAtual);
DataExpiracaoDao dao = new DataExpiracaoDao();
//Lista com a data de expiracao de todos os convenios
List<DataExpiracao> listaDatas = new ArrayList<DataExpiracao>();
listaDatas = dao.getDataExpConvenios();
for (DataExpiracao dataExpiracao : listaDatas) {
dataExpiracao = dao.getDataExpConvenio(dataExpiracao.getIdAjuste()); //
System.out.println("### ID CONVÊNIO: " + dataExpiracao.getIdAjuste() + " ###");
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date dataExp = dataExpiracao.getData();
// *** Calculo dos dias ***
Date testa60Dias = addDias(dataExp, -60);
Date testa30Dias = addDias(dataExp, -30);
Date testa15Dias = addDias(dataExp, -15);
Date testa7Dias = addDias(dataExp, -7);
// *** Transfoma as datas para String para poder comparar ***
String dataAtualForm = dateFormat.format(dataAtual);
String testa60DiasForm = dateFormat.format(testa60Dias);
String testa30DiasForm = dateFormat.format(testa30Dias);
String testa15DiasForm = dateFormat.format(testa15Dias);
String testa7DiasForm = dateFormat.format(testa7Dias);
// Se a data de expiracao do contrato - 60 dias for igual a data atual
// Ou seja, se faltar 60 dias para o termino do contrato
if(testa60DiasForm.compareTo(dataAtualForm) == 0) {
enviaEmail();
}
// Se a data de expiracao do contrato - 30 dias for igual a data atual
// Ou seja, se faltar 30 dias para o termino do contrato
else if(testa30DiasForm.compareTo(dataAtualForm) == 0) {
enviaEmail();
}
// Se a data de expiracao do contrato - 15 dias for igual a data atual
// Ou seja, se faltar 15 dias para o termino do contrato
else if(testa15DiasForm.compareTo(dataAtualForm) == 0) {
enviaEmail();
}
// Se a data de expiracao do contrato - 7 dias for igual a data atual
// Ou seja, se faltar 7 dias para o termino do contrato
else if (testa7DiasForm.compareTo(dataAtualForm) == 0) {
enviaEmail();
}
else {
System.out.println("Não é para enviar email!");
}
System.out.println("-----------------------------------------------------------------");
}
}
public Date addDias(Date data, int dias) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(data);
calendar.add(calendar.DATE, dias);
return calendar.getTime();
}
public void enviaEmail() throws SQLException {
//proad-ccc@ufpa.br
try {
// Itera sob a lista de emails dos convenios
EnderecoEmailDAO dao = new EnderecoEmailDAO();
List<EnderecoEmail> listaEndEmails = new ArrayList<EnderecoEmail>();
listaEndEmails = dao.getEnderecoEmailsConv();
System.out.println("##### CHECA CONVÊNIOS #####");
SimpleEmail email = new SimpleEmail();
for (EnderecoEmail enderecoEmail : listaEndEmails) {
// Seta o calendario para a data atual
Date dataAtual = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(dataAtual);
// Seta o formato da data como esta no banco
SimpleDateFormat formatoBanco = new SimpleDateFormat("yyyy-MM-dd");
Date data = enderecoEmail.getDataFimVig();
// Pega o email de uma instituicao especifica
enderecoEmail = dao.getEnderecoEmailConv(enderecoEmail.getIdAjuste(), enderecoEmail.getIdInstituicao(), formatoBanco.format(data));
email.setHostName("smtp.ufpa.br");
if (enderecoEmail.getDestinatario() != null) {
// tah listando todos os enderecos como destinatario
email.addTo(enderecoEmail.getDestinatario());
System.out.println("Enviado para: " + enderecoEmail.getIdAjuste());
}
else {
System.out.println("Endereço não informado!");
}
email.setFrom("sicc@ufpa.br");
email.setSubject("Teste do SiccEmailTimer");
email.setMsg("Caro usuário, \n"
+ " \n"
+ "Informamos que o prazo de vigência de seu convênio está perto de expirar. \n"
+ "Favor entrar em contato com a instituição contratada. \n"
+ " \n"
+ "Atenciosamente, \n"
+ " \n"
+ "A Direção");
email.send();
}
} catch (EmailException e) {
System.out.println("Ocorreu um erro no envio!");
}
}
}, new Date(), dia);
}
public static void main(String[] args) {
SiccEmailTimerConv emailTimer = new SiccEmailTimerConv();
emailTimer.start();
}
}