Olá a todos, estou tendo um problema ao enviar E-mail, o corpo do email, está sendo enviado duplicado. Esse é o resultado:
O código é composto pelo método dispararAlerta, no controller
@SuppressWarnings("resource")
public void dispararAlerta(Alerta alerta, Chamado chamado, String variavel1, String variavel2, String variavel3, String usuario) {
Alerta a = alertaDao.findById(alerta.getAlertaID());
try {
String link = "";
String tituloPadrao = "";
link = "juichamados";
String mensagemFinal = a.getMensagem();
String titulo = "Chamado " + tituloPadrao;
if (chamado != null && chamado.getSlaTipo().getDescricao() != null) {
titulo += " - " + chamado.getSlaTipo().getDescricao();
}
Email e = new Email();
List<String> destinatarios = new ArrayList<String>();
e.setAssunto("Chamados " + tituloPadrao + " - " + a.getTitulo());
e.setConteudo("<h2>" + titulo + "</h2>" + mensagemFinal + "<br><p>Protocolo do chamado: " + chamado.getProtocolo() + "<p><a href=\"http://" + link + ".plataforma.com.br\">Clique aqui para acessar a ferramenta</a></p>Atenciosamente,<br/><b>nomeEmpresa</b>");
for (Perfil p : a.getPerfis()) {
// PEGA TODOS
for (Usuario u : usuarioDao.listaPorPerfil(p.getPerfilID())) {
if (!destinatarios.contains(u.getEmail())) {
destinatarios.add(u.getEmail());
}
}
}
for (Usuario u : a.getUsuarios()) {
if (!destinatarios.contains(u.getEmail())) {
destinatarios.add(u.getEmail());
}
}
e.setEmailRemetente(chamado.getCliente().getEmailEnvio());
e.setEmailDestinatarios(destinatarios);
EmailService es = new EmailService();
System.out.println(e+ "tem");
es.enviarEmail(e);
} catch (Exception e) {
e.printStackTrace();
}
}
O enviarEmail é um método da classe EmailService
public void enviarEmail(
final Email email )
throws EmailException
{
try {
final Message message = new MimeMessage( session );
message.setFrom( new InternetAddress( email.getEmailRemetente() ) );
if(email.getEmailRemetente() != null){
InternetAddress[] rt = {new InternetAddress( email.getEmailRemetente() )};
message.setReplyTo( rt);
}
InternetAddress[] addressTo = new InternetAddress[email.getEmailDestinatarios().size()];
for(int i = 0; i < email.getEmailDestinatarios().size(); i++){
addressTo[i] = new InternetAddress(email.getEmailDestinatarios().get(i)) ;
}
message.setRecipients(Message.RecipientType.TO, addressTo);
if(email.getEmailDestinatariosCC().size() > 0) {
InternetAddress[] addressToCC = new InternetAddress[email.getEmailDestinatariosCC().size()];
for(int i = 0; i < email.getEmailDestinatariosCC().size(); i++){
addressToCC[i] = new InternetAddress(email.getEmailDestinatariosCC().get(i)) ;
}
message.setRecipients(Message.RecipientType.CC, addressToCC);
}
if(email.getEmailDestinatariosBCC().size() > 0) {
InternetAddress[] addressToBCC = new InternetAddress[email.getEmailDestinatariosBCC().size()];
for(int i = 0; i < email.getEmailDestinatariosBCC().size(); i++){
addressToBCC[i] = new InternetAddress(email.getEmailDestinatariosBCC().get(i)) ;
}
message.setRecipients(Message.RecipientType.BCC, addressToBCC);
}
message.setSubject( email.getAssunto() );
message.setContent( email.getConteudo(), "text/html; charset=ISO-8859-1" );
message.setSentDate( new java.util.Date() );
//transporte.connect( email.getHostNome(), email.getUsuario(), email.getSenha() );
transporte.connect(HOST, SMTP_USERNAME, SMTP_PASSWORD);
transporte.sendMessage( message, message.getAllRecipients() );
transporte.close();
} catch( AddressException e ) {
throw new EmailException( e );
} catch( MessagingException e ) {
throw new EmailException( e );
}
}
As credenciais para envio do email, estão na classe EmailService também.
O Alerta que possui as informações passadas, está abaixo:
Caso a imagem esteja difícil de enxergar, é um registro no banco com as colunas:
AlertaID = 9
Ativo = 1
dataAlteracao = 2021-06-14 11:56:56.297
dataCadastro = 2021-03-04 14:08:10.730
mensagem =
tipo = novo chamado
titulo = Novo Chamado
alteradoPor_ID = 1
Este mesmo método, funciona perfeitamente quando o usuário abre um chamado pela plataforma WEB do sistema, esse método é acessado via um /aplicativo e por algum motivo, ao gerar um chamado, ele envia duas vezes no mesmo email, o conteúdo, como se estivesse parecido com algo como:
e.setConteudo("<h2>" + titulo + "</h2>" + mensagemFinal + mensagemFinal + "<br><p>Protocolo do chamado: " + chamado.getProtocolo() + "<p><a href=\"http://" + link + ".nomeDaPlataforma.com.br\">Clique aqui para acessar a ferramenta</a></p>Atenciosamente,<br/><b>nomeEmpresa</b>");
Mas não é o caso, já debuguei a aplicação diversas vezes, e até o momento em que o conteúdo é definido no
e.setConteudo
e no
message.setContent( email.getConteudo(), "text/html; charset=ISO-8859-1" );
é o conteúdo correto que está no campo mensagem do registro Alerta
Não sei qual pode ser o problema, ou se é alguma comunicação web, mas não encontrei ninguém com um erro como este por aqui. Agradeço desde já pela ajuda
Edição:
Me preocupei tanto explicando o problema que não passei algumas informações básicas
- Utilizo o Eclipse como ambiente de desenvolvimento
- O servidor é o Apache Tomcat 7.5
- Hibernate
- VRaptor