package br.edu.cesmac.sic.core.domain.util;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.mail.Address;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.HtmlEmail;
import br.edu.cesmac.core.exception.NegocioException;
import br.edu.cesmac.core.util.ArquivoUtil;
import br.edu.cesmac.core.util.EmailBuilder;
import br.edu.cesmac.core.util.VerificadorUtil;
import br.edu.cesmac.sic.core.domain.model.Arquivo;
import br.edu.cesmac.sic.core.domain.model.ProjetoPesquisaRelatorio;
public class EmailUtil
{
private static final String MENSAGEM_TEXTO_SOBRE_MUDANCAS_SITUACAO_INSCRICAO_SISTEMA_INICIACAO_CIENTIFICA =
"Houve atualização da situação da inscrição do projeto de pesquisa submetido. Para mais detalhes acesse o Sistema de Iniciação Científica.";
private static final String ASSUNTO_EMAIL_SISTEMA_INICIACAO_CIENTIFICA =
"SISTEMA DE INICIAÇÃO CIENTÍFICA";
private static final String NOME_PROPRIEDADE_EMAIL_EMAILORIGEM =
"email.emailorigem";
private static final String NOME_PROPRIEDADE_EMAIL_SENHA =
"email.senha";
private static final String NOME_PROPRIEDADE_EMAIL_USUARIO =
"email.usuario";
private static final String NOME_PROPRIEDADE_EMAIL_PORTA =
"email.porta";
private static final String NOME_PROPRIEDADE_EMAIL_HOSTNAME =
"email.hostname";
private static final String NOME_ARQUIVO_EMAIL_PROPERTY =
"/email.properties";
private static final String NOME_ARQUIVO_PADRAO_EMAIL =
"/mensagemPadrao.html";
public static void enviarEmailComInformacoesSobreInscricao
(String emailDestino,
String observacao
) {
try {
HtmlEmail email = criarEmailHtmlIhAdicionarPropriedadePadrao
();
email.
addTo(emailDestino
);
email.
setSubject(ASSUNTO_EMAIL_SISTEMA_INICIACAO_CIENTIFICA
);
// String textoHtml = gerarHtmlMensagemDoEmail(usuario, senha);
// email.setHtmlMsg(textoHtml.toString());
// email.setHtmlMsg(observacao);
StringBuilder texto =
new StringBuilder(MENSAGEM_TEXTO_SOBRE_MUDANCAS_SITUACAO_INSCRICAO_SISTEMA_INICIACAO_CIENTIFICA
);
if (VerificadorUtil.
naoEstaNuloOuVazio(observacao
)) {
texto.
append("\n\nOBSERVAÇÕES:\n");
texto.
append(observacao
);
}
email.
setTextMsg(texto.
toString());
email.
send();
} catch (EmailException |
IOException e
) {
throw new NegocioException
("Erro ao enviar email: "+ e.
getMessage());
}
}
public static void enviarEmailComInformacoesSobreInscricao
(String emailDestino,
String mensagemPrincipal,
String observacao
) {
try {
HtmlEmail email = criarEmailHtmlIhAdicionarPropriedadePadrao
();
email.
addTo(emailDestino
);
email.
setSubject(ASSUNTO_EMAIL_SISTEMA_INICIACAO_CIENTIFICA
);
StringBuilder texto =
new StringBuilder(mensagemPrincipal
);
if (VerificadorUtil.
naoEstaNuloOuVazio(observacao
)) {
texto.
append("\n\nOBSERVAÇÕES:\n");
texto.
append(observacao
);
}
email.
setTextMsg(texto.
toString());
email.
send();
} catch (EmailException |
IOException e
) {
throw new NegocioException
("Erro ao enviar email: "+ e.
getMessage());
}
}
public static void enviarEmailParaContatoProjetoPesquisa
(String emailDestino,
String tituloProjetoPesquisa,
String conteudo
) {
try {
HtmlEmail email = criarEmailHtmlIhAdicionarPropriedadePadrao
();
email.
addTo(emailDestino
);
email.
setSubject(ASSUNTO_EMAIL_SISTEMA_INICIACAO_CIENTIFICA +
" : " + tituloProjetoPesquisa
);
// email.setHtmlMsg(conteudo);
email.
setTextMsg(conteudo
);
email.
send();
} catch (EmailException |
IOException e
) {
throw new NegocioException
("Erro ao enviar email: "+ e.
getMessage());
}
}
public static void enviarEmailRelatorioFinal
(String emailDestino, ProjetoPesquisaRelatorio projetoPesquisaRelatorio,
String legendaArquivo, Arquivo arquivo
) {
try {
final PropertiesUtil propertiesUtil =
new PropertiesUtil
(NOME_ARQUIVO_EMAIL_PROPERTY
);
MimeMessage email =
new EmailBuilder
(propertiesUtil.
retornarPropriedadeDoArquivo(NOME_PROPRIEDADE_EMAIL_HOSTNAME
),
propertiesUtil.
retornarPropriedadeDoArquivo(NOME_PROPRIEDADE_EMAIL_PORTA
),
propertiesUtil.
retornarPropriedadeDoArquivo(NOME_PROPRIEDADE_EMAIL_EMAILORIGEM
),
propertiesUtil.
retornarPropriedadeDoArquivo(NOME_PROPRIEDADE_EMAIL_SENHA
))
.
comEmailOrigem(new PropertiesUtil
(NOME_ARQUIVO_EMAIL_PROPERTY
).
retornarPropriedadeDoArquivo(NOME_PROPRIEDADE_EMAIL_EMAILORIGEM
))
.
comDataEnvio(new Date())
.
comEmailDestino(emailDestino
)
.
comAssunto(projetoPesquisaRelatorio.
getProjetoPesquisa().
getDescricaoDoProcessoSeletivo())
.
comConteudoHtml("<html>Código HTML da mensagem ")
.
adicionarAnexo(legendaArquivo, arquivo.
getArquivo(), arquivo.
getExtensao())
.
build();
Transport.
send(email
);
} catch (Exception e
) {
e.
printStackTrace();
}
}
private static Session criarSessaoPropriedadePadrao
() throws IOException, EmailException
{
try {
final PropertiesUtil propertiesUtil =
new PropertiesUtil
(NOME_ARQUIVO_EMAIL_PROPERTY
);
Properties props =
new Properties();
props.
put("mail.smtp.host", propertiesUtil.
retornarPropriedadeDoArquivo(NOME_PROPRIEDADE_EMAIL_HOSTNAME
));
props.
put("mail.smtp.auth",
"true");
props.
put("mail.smtp.port", propertiesUtil.
retornarPropriedadeDoArquivo(NOME_PROPRIEDADE_EMAIL_PORTA
));
props.
put("mail.smtp.starttls.enable",
"true");
props.
put("mail.smtp.socketFactory.port", propertiesUtil.
retornarPropriedadeDoArquivo(NOME_PROPRIEDADE_EMAIL_PORTA
));
props.
put("mail.smtp.socketFactory.fallback",
"false");
props.
put("mail.smtp.socketFactory.class",
"javax.net.ssl.SSLSocketFactory");
return Session.
getDefaultInstance(props,
new javax.
mail.
Authenticator() {
protected PasswordAuthentication getPasswordAuthentication
() {
try {
return new PasswordAuthentication(propertiesUtil.
retornarPropriedadeDoArquivo(NOME_PROPRIEDADE_EMAIL_EMAILORIGEM
), propertiesUtil.
retornarPropriedadeDoArquivo(NOME_PROPRIEDADE_EMAIL_SENHA
));
} catch (IOException e
) {
e.
printStackTrace();
}
return null;
}
});
} catch (Exception e
) {
e.
printStackTrace();
}
return null;
}
/*
private static String gerarHtmlMensagemDoEmail(String usuario, String senha) {
AbrirArquivo abrirArquivo = new AbrirArquivo();
return abrirArquivo.retornarConteudoDoArquivo(NOME_ARQUIVO_PADRAO_EMAIL);
}
*/
private static HtmlEmail criarEmailHtmlIhAdicionarPropriedadePadrao
() throws IOException, EmailException
{
PropertiesUtil propertiesUtil =
new PropertiesUtil
(NOME_ARQUIVO_EMAIL_PROPERTY
);
String hostname = propertiesUtil.
retornarPropriedadeDoArquivo(NOME_PROPRIEDADE_EMAIL_HOSTNAME
);
String porta = propertiesUtil.
retornarPropriedadeDoArquivo(NOME_PROPRIEDADE_EMAIL_PORTA
);
String usuarioEmail =propertiesUtil.
retornarPropriedadeDoArquivo( NOME_PROPRIEDADE_EMAIL_USUARIO
);
String senha = propertiesUtil.
retornarPropriedadeDoArquivo( NOME_PROPRIEDADE_EMAIL_SENHA
);
String emailOrigem = propertiesUtil.
retornarPropriedadeDoArquivo(NOME_PROPRIEDADE_EMAIL_EMAILORIGEM
);
HtmlEmail email =
new HtmlEmail
();
email.
setHostName(hostname
);
email.
setSmtpPort(new Integer(porta
));
email.
setAuthentication(usuarioEmail, senha
);
email.
setSSLOnConnect(true);
email.
setFrom(emailOrigem
);
return email
;
}
public static void enviarEmailComParecerDoRecurso
(String emailDestino,
String conteudo,
Object object
) {
try {
HtmlEmail email = criarEmailHtmlIhAdicionarPropriedadePadrao
();
email.
addTo(emailDestino
);
email.
setSubject(ASSUNTO_EMAIL_SISTEMA_INICIACAO_CIENTIFICA +
" : PARECER");
email.
setTextMsg(conteudo
);
email.
send();
} catch (EmailException |
IOException e
) {
throw new NegocioException
("Erro ao enviar email: "+ e.
getMessage());
}
}
public static class MailSenderPlus
{
//o tratamento de excessoes foi simplificado (throws MessagingException)
//para facilitar o entendimento do exemplo
public static void main
(String[] args
) throws MessagingException,
FileNotFoundException,
IOException {
/*
String hostname = propertiesUtil.retornarPropriedadeDoArquivo(NOME_PROPRIEDADE_EMAIL_HOSTNAME);
String porta = propertiesUtil.retornarPropriedadeDoArquivo(NOME_PROPRIEDADE_EMAIL_PORTA);
String usuarioEmail =propertiesUtil.retornarPropriedadeDoArquivo( NOME_PROPRIEDADE_EMAIL_USUARIO);
String senha = propertiesUtil.retornarPropriedadeDoArquivo( NOME_PROPRIEDADE_EMAIL_SENHA);
String emailOrigem = propertiesUtil.retornarPropriedadeDoArquivo(NOME_PROPRIEDADE_EMAIL_EMAILORIGEM);
HtmlEmail email = new HtmlEmail();
email.setHostName(hostname);
email.setSmtpPort(new Integer(porta));
email.setAuthentication(usuarioEmail, senha);
email.setSSLOnConnect(true);
email.setFrom(emailOrigem);
*/
//objeto para definicao das propriedades de configuracao do provider
// PropertiesUtil propertiesUtil = new PropertiesUtil(NOME_ARQUIVO_EMAIL_PROPERTY);
Properties props =
new Properties();
//o valor "smtp.host.com.br" deve ser alterado para o seu servidor SMTP
// props.put("mail.host",propertiesUtil.retornarPropriedadeDoArquivo(NOME_PROPRIEDADE_EMAIL_HOSTNAME));
props.
put("mail.smtp.host",
"smtp.gmail.com");
props.
put("mail.smtp.auth",
"true");
props.
put("mail.smtp.port",
"465");
props.
put("mail.smtp.starttls.enable",
"true");
props.
put("mail.smtp.socketFactory.port",
"465");
props.
put("mail.smtp.socketFactory.fallback",
"false");
props.
put("mail.smtp.socketFactory.class",
"javax.net.ssl.SSLSocketFactory");
//obtendo um Session com a configuração
//do servidor SMTP definida em props
Session session = Session.
getDefaultInstance(props,
new javax.
mail.
Authenticator() {
protected PasswordAuthentication getPasswordAuthentication
() {
return new PasswordAuthentication("brunolopespeixoto@gmail.com",
"bruno0910");
}
});
//criando a mensagem
MimeMessage message =
new MimeMessage
(session
);
//substituir pelos e-mails desejados
// Address from = new InternetAddress(propertiesUtil.retornarPropriedadeDoArquivo(NOME_PROPRIEDADE_EMAIL_EMAILORIGEM));
Address from =
new InternetAddress
("brunolopespeixoto@gmail.com");
Address to =
new InternetAddress
("brunolopespeixoto@hotmail.com");
//configurando o remetente e o destinatario
message.
setFrom(from
);
message.
addRecipient(RecipientType.
TO, to
);
//configurando a data de envio, o assunto e o texto da mensagem
message.
setSentDate(new Date());
message.
setSubject("Enviando uma mensagem formatada com anexo");
// conteudo html que sera atribuido a mensagem
String htmlMessage =
"< h t m l > Código HTML da mensagem ";
//criando a Multipart
Multipart multipart =
new MimeMultipart
();
//criando a primeira parte da mensagem
MimeBodyPart attachment0 =
new MimeBodyPart
();
//configurando o htmlMessage com o mime type
attachment0.
setContent(htmlMessage,
"text/html; charset=UTF-8");
//adicionando na multipart
multipart.
addBodyPart(attachment0
);
//arquivo que será anexado
String pathname =
"C:/Users/bruno/Downloads/teste.jpeg";//pode conter o caminho
File file =
new File(pathname
);
// ByteArrayDataSource dataSource = new ByteArrayDataSource(arquivo.getArquivo(), ArquivoUtil.retornarContentTypeArquivo(arquivo.getExtensao()));
ByteArrayDataSource dataSource =
new ByteArrayDataSource
(new Arquivo
().
getArquivo(),
"");
//criando a segunda parte da mensagem
MimeBodyPart attachment1 =
new MimeBodyPart
();
//configurando o DataHandler para o arquivo desejado
//a leitura dos bytes, descoberta e configuracao do tipo
//do arquivo serão resolvidos pelo JAF (DataHandler e FileDataSource)
// attachment1.setDataHandler(new DataHandler(new FileDataSource(file)));
attachment1.
setDataHandler(new DataHandler
(dataSource
));
//configurando o nome do arquivo que pode ser diferente do arquivo
//original Ex: setFileName("outroNome.png")
// attachment1.setFileName(file.getName());
attachment1.
setFileName("legendaArquivo");
//adicionando o anexo na multipart
multipart.
addBodyPart(attachment1
);
//adicionando a multipart como conteudo da mensagem
message.
setContent(multipart
);
//enviando
Transport.
send(message
);
System.
out.
println("E-mail enviado com sucesso!");
}
}
}