package br.com.centralit.citcorpore.negocio;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.search.MessageIDTerm;
import javax.mail.search.SearchTerm;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringEscapeUtils;
import br.com.centralit.citajax.html.DocumentHTML;
import br.com.centralit.citcorpore.bean.ClienteEmailCentralServicoDTO;
import br.com.centralit.citcorpore.bean.ClienteEmailCentralServicoMessagesDTO;
import br.com.centralit.citcorpore.bean.EmailSolicitacaoServicoDTO;
import br.com.centralit.citcorpore.util.Enumerados;
import br.com.centralit.citcorpore.util.ParametroUtil;
import br.com.centralit.citcorpore.util.WebUtil;
import br.com.citframework.integracao.CrudDAO;
import br.com.citframework.service.CrudServiceImpl;
import br.com.citframework.service.ServiceLocator;
import br.com.citframework.util.UtilI18N;
public class ClienteEmailCentralServicoServiceEjb extends CrudServiceImpl implements ClienteEmailCentralServicoService {
String CONEXAO_EMAIL_SERVIDOR = ParametroUtil.getValorParametroCitSmartHashMap(Enumerados.ParametroSistema.SMTP_LEITURA_Servidor, ""); //Servidor (ex: imap.gmail.com)
String CONEXAO_EMAIL_PROVIDER = ParametroUtil.getValorParametroCitSmartHashMap(Enumerados.ParametroSistema.SMTP_LEITURA_Provider, ""); //Provedor (ex: imaps, pop3s, imap, pop3, etc)
String CONEXAO_EMAIL_PORTA = ParametroUtil.getValorParametroCitSmartHashMap(Enumerados.ParametroSistema.SMTP_LEITURA_Porta, ""); // Porta
String CONEXAO_EMAIL_CAIXA = ParametroUtil.getValorParametroCitSmartHashMap(Enumerados.ParametroSistema.SMTP_LEITURA_Caixa, ""); //Usuario
String CONEXAO_EMAIL_SENHA = ParametroUtil.getValorParametroCitSmartHashMap(Enumerados.ParametroSistema.SMTP_LEITURA_Senha, ""); //Senha
String CONEXAO_EMAIL_PASTA = ParametroUtil.getValorParametroCitSmartHashMap(Enumerados.ParametroSistema.SMTP_LEITURA_Pasta, ""); //Pasta de entrada
String CONEXAO_EMAIL_LIMITE = ParametroUtil.getValorParametroCitSmartHashMap(Enumerados.ParametroSistema.SMTP_LEITURA_LIMITE_, "10"); //Limite de e-mails
public ClienteEmailCentralServicoDTO getMessages(DocumentHTML document, HttpServletRequest request, HttpServletResponse response) throws Exception {
ClienteEmailCentralServicoDTO clienteEmailCentralServicoDto = new ClienteEmailCentralServicoDTO();
clienteEmailCentralServicoDto.setResultSucess(true);
try {
if (CONEXAO_EMAIL_SERVIDOR.equals("") || CONEXAO_EMAIL_PROVIDER.equals("") || CONEXAO_EMAIL_CAIXA.equals("") || CONEXAO_EMAIL_SENHA.equals("") || CONEXAO_EMAIL_PASTA.equals("")) {
clienteEmailCentralServicoDto.setResultSucess(false);
clienteEmailCentralServicoDto.setResultMessage(UtilI18N.internacionaliza(request, "clienteEmailCentralServico.problemasRealizarleituraEmailsParametros"));
} else {
Properties props = new Properties();
props.setProperty("mail.store.protocol", CONEXAO_EMAIL_PROVIDER);
props.setProperty("mail.imaps.auth.plain.disable","true");
props.setProperty("mail.imaps.ssl.trust", "*");
//props.setProperty("mail.debug", "true");
if (!CONEXAO_EMAIL_PORTA.equals("")) props.setProperty("mail." + CONEXAO_EMAIL_PROVIDER + ".port", CONEXAO_EMAIL_PORTA);
Session session = Session.getInstance(props, null);
Store store = session.getStore();
store.connect(CONEXAO_EMAIL_SERVIDOR, CONEXAO_EMAIL_CAIXA, CONEXAO_EMAIL_SENHA);
Folder inbox = store.getFolder(CONEXAO_EMAIL_PASTA);
inbox.open(Folder.READ_WRITE);
Message[] messages = inbox.getMessages();
if (messages != null && messages.length > 0) {
ArrayList<ClienteEmailCentralServicoMessagesDTO> emailMessages = new ArrayList<ClienteEmailCentralServicoMessagesDTO>();
for (Message message : messages) {
ClienteEmailCentralServicoMessagesDTO clienteEmailMessagesDto = new ClienteEmailCentralServicoMessagesDTO();
MimeMessage m = (MimeMessage) inbox.getMessage(message.getMessageNumber());
clienteEmailMessagesDto.setMessageId(m.getMessageID());
clienteEmailMessagesDto.setMessageNumber(message.getMessageNumber());
Address[] in = message.getFrom();
clienteEmailMessagesDto.setMessageEmail((in == null ? null : ((InternetAddress) in[0]).getAddress()));
clienteEmailMessagesDto.setMessageSubject(message.getSubject());
clienteEmailMessagesDto.setMessageReceivedDate(message.getReceivedDate());
//clienteEmailMessagesDto.setSeen(message.isSet(Flags.Flag.SEEN));
clienteEmailMessagesDto.setSeen(true);
emailMessages.add(clienteEmailMessagesDto);
}
clienteEmailCentralServicoDto.setEmailMessages(emailMessages);
}
}
} catch (Exception e) {
e.printStackTrace();
clienteEmailCentralServicoDto.setResultSucess(false);
clienteEmailCentralServicoDto.setResultMessage(UtilI18N.internacionaliza(request, "clienteEmailCentralServico.problemasRealizarleituraEmails"));
}
return clienteEmailCentralServicoDto;
}
public ClienteEmailCentralServicoDTO getMessagesByLimitAndNoRequest(DocumentHTML document, HttpServletRequest request, HttpServletResponse response) throws Exception {
EmailSolicitacaoServicoService emailSolicitacaoServicoService = (EmailSolicitacaoServicoService) ServiceLocator.getInstance().getService(EmailSolicitacaoServicoService.class, WebUtil.getUsuarioSistema(request));
ClienteEmailCentralServicoDTO clienteEmailCentralServicoDto = new ClienteEmailCentralServicoDTO();
clienteEmailCentralServicoDto.setResultSucess(true);
try {
if (CONEXAO_EMAIL_SERVIDOR.equals("") || CONEXAO_EMAIL_PROVIDER.equals("") || CONEXAO_EMAIL_CAIXA.equals("") || CONEXAO_EMAIL_SENHA.equals("") || CONEXAO_EMAIL_PASTA.equals("")) {
clienteEmailCentralServicoDto.setResultSucess(false);
clienteEmailCentralServicoDto.setResultMessage(UtilI18N.internacionaliza(request, "clienteEmailCentralServico.problemasRealizarleituraEmailsParametros"));
} else {
Properties props = new Properties();
props.setProperty("mail.store.protocol", CONEXAO_EMAIL_PROVIDER);
props.setProperty("mail.imaps.auth.plain.disable","true");
props.setProperty("mail.imaps.ssl.trust", "*");
//props.setProperty("mail.debug", "true");
if (!CONEXAO_EMAIL_PORTA.equals("")) props.setProperty("mail." + CONEXAO_EMAIL_PROVIDER + ".port", CONEXAO_EMAIL_PORTA);
Session session = Session.getInstance(props, null);
Store store = session.getStore();
store.connect(CONEXAO_EMAIL_SERVIDOR, CONEXAO_EMAIL_CAIXA, CONEXAO_EMAIL_SENHA);
Folder inbox = store.getFolder(CONEXAO_EMAIL_PASTA);
inbox.open(Folder.READ_WRITE);
Message[] messages = inbox.getMessages();
if (messages != null && messages.length > 0) {
ArrayUtils.reverse(messages);
Integer limiteEmails = 10;
try {
limiteEmails = Integer.parseInt(CONEXAO_EMAIL_LIMITE);
} catch (NumberFormatException e) {
e.printStackTrace();
limiteEmails = 10;
}
ArrayList<ClienteEmailCentralServicoMessagesDTO> emailMessages = new ArrayList<ClienteEmailCentralServicoMessagesDTO>();
for (Message message : messages) {
if (emailMessages.size() < limiteEmails) {
MimeMessage m = (MimeMessage) inbox.getMessage(message.getMessageNumber());
EmailSolicitacaoServicoDTO colEmailDto = emailSolicitacaoServicoService.getEmailByIdMessage(m.getMessageID());
if (colEmailDto == null) {
ClienteEmailCentralServicoMessagesDTO clienteEmailMessagesDto = new ClienteEmailCentralServicoMessagesDTO();
clienteEmailMessagesDto.setMessageId(m.getMessageID());
clienteEmailMessagesDto.setMessageNumber(message.getMessageNumber());
Address[] in = message.getFrom();
clienteEmailMessagesDto.setMessageEmail((in == null ? null : ((InternetAddress) in[0]).getAddress()));
clienteEmailMessagesDto.setMessageSubject(message.getSubject());
clienteEmailMessagesDto.setMessageReceivedDate(message.getReceivedDate());
//clienteEmailMessagesDto.setSeen(message.isSet(Flags.Flag.SEEN)); //Atrapalha a performance
clienteEmailMessagesDto.setSeen(true);
emailMessages.add(clienteEmailMessagesDto);
}
} else {
break;
}
}
clienteEmailCentralServicoDto.setEmailMessages(emailMessages);
}
}
} catch (Exception e) {
e.printStackTrace();
clienteEmailCentralServicoDto.setResultSucess(false);
clienteEmailCentralServicoDto.setResultMessage(UtilI18N.internacionaliza(request, "clienteEmailCentralServico.problemasRealizarleituraEmails"));
}
return clienteEmailCentralServicoDto;
}
public ClienteEmailCentralServicoDTO readMessage(DocumentHTML document, HttpServletRequest request, HttpServletResponse response, String messageId) throws Exception {
ClienteEmailCentralServicoDTO clienteEmailCentralServicoDto = new ClienteEmailCentralServicoDTO();
clienteEmailCentralServicoDto.setResultSucess(true);
try {
if (CONEXAO_EMAIL_SERVIDOR.equals("") || CONEXAO_EMAIL_PROVIDER.equals("") || CONEXAO_EMAIL_CAIXA.equals("") || CONEXAO_EMAIL_SENHA.equals("") || CONEXAO_EMAIL_PASTA.equals("")) {
clienteEmailCentralServicoDto.setResultSucess(false);
clienteEmailCentralServicoDto.setResultMessage(UtilI18N.internacionaliza(request, "clienteEmailCentralServico.problemasRealizarleituraEmailsParametros"));
} else {
Properties props = new Properties();
props.setProperty("mail.store.protocol", CONEXAO_EMAIL_PROVIDER);
props.setProperty("mail.imaps.auth.plain.disable","true");
props.setProperty("mail.imaps.ssl.trust", "*");
//props.setProperty("mail.debug", "true");
if (!CONEXAO_EMAIL_PORTA.equals("")) props.setProperty("mail." + CONEXAO_EMAIL_PROVIDER + ".port", CONEXAO_EMAIL_PORTA);
Session session = Session.getInstance(props, null);
Store store = session.getStore();
store.connect(CONEXAO_EMAIL_SERVIDOR, CONEXAO_EMAIL_CAIXA, CONEXAO_EMAIL_SENHA);
Folder inbox = store.getFolder(CONEXAO_EMAIL_PASTA);
inbox.open(Folder.READ_WRITE);
SearchTerm searchTerm = new MessageIDTerm(messageId);
Message[] messages = inbox.search(searchTerm);
if (messages != null && messages.length > 0) {
ArrayList<ClienteEmailCentralServicoMessagesDTO> emailMessages = new ArrayList<ClienteEmailCentralServicoMessagesDTO>();
for (Message message : messages) {
ClienteEmailCentralServicoMessagesDTO clienteEmailMessagesDto = new ClienteEmailCentralServicoMessagesDTO();
MimeMessage m = (MimeMessage) inbox.getMessage(message.getMessageNumber());
clienteEmailMessagesDto.setMessageId(m.getMessageID());
clienteEmailMessagesDto.setMessageNumber(message.getMessageNumber());
Address[] in = message.getFrom();
clienteEmailMessagesDto.setMessageEmail((in == null ? null : ((InternetAddress) in[0]).getAddress()));
clienteEmailMessagesDto.setMessageSubject(message.getSubject());
clienteEmailMessagesDto.setMessageReceivedDate(message.getReceivedDate());
clienteEmailMessagesDto.setSeen(message.isSet(Flags.Flag.SEEN));
Object objRef = message.getContent();
String content = "";
if (!(objRef instanceof Multipart)) {
content = (String) message.getContent();
} else {
Multipart mp = (Multipart) message.getContent();
BodyPart bp = mp.getBodyPart(0);
content = getContent(bp);
}
if (content != null) {
//content = content.replaceAll("(\r\n|\r|\n)", "<br />");
content = StringEscapeUtils.escapeJavaScript(content);
clienteEmailMessagesDto.setMessageContent(content);
}
emailMessages.add(clienteEmailMessagesDto);
}
clienteEmailCentralServicoDto.setEmailMessages(emailMessages);
}
}
} catch (Exception e) {
e.printStackTrace();
clienteEmailCentralServicoDto.setResultSucess(false);
clienteEmailCentralServicoDto.setResultMessage(UtilI18N.internacionaliza(request, "clienteEmailCentralServico.problemasRealizarleituraEmails"));
}
return clienteEmailCentralServicoDto;
}
/**
* Return the primary text content of the message.
*/
public String getContent(Part p) throws MessagingException, IOException {
if (p.isMimeType("text/*")) {
String s = (String)p.getContent();
return s;
}
if (p.isMimeType("multipart/alternative")) {
// prefer html text over plain text
Multipart mp = (Multipart)p.getContent();
String text = null;
for (int i = 0; i < mp.getCount(); i++) {
Part bp = mp.getBodyPart(i);
if (bp.isMimeType("text/plain")) {
if (text == null)
text = getContent(bp);
continue;
} else if (bp.isMimeType("text/html")) {
String s = getContent(bp);
if (s != null)
return s;
} else {
return getContent(bp);
}
}
return text;
} else if (p.isMimeType("multipart/*")) {
Multipart mp = (Multipart)p.getContent();
for (int i = 0; i < mp.getCount(); i++) {
String s = getContent(mp.getBodyPart(i));
if (s != null)
return s;
}
}
return null;
}
@Override
protected CrudDAO getDao() {
return null;
}
}