package com.fp.general.mail.impl; import java.util.Map; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import com.fp.general.mail.EnvioMail; import com.fp.general.mail.dto.EnvioCorreoDTO; import com.fp.general.mail.exception.EnvioMailException; import com.fp.general.mail.logger.EnvioMailLogger; import com.fp.general.mail.resources.MailMessages; /** * Esta clase implementa {@link EnvioMail} y que determina el envío por default de correos * * @author dcruz * */ public abstract class EnvioMailBaseImpl implements EnvioMail, EnvioMailLogger{ @Override public void envioMail(EnvioCorreoDTO correo) throws EnvioMailException{ log.info("Ingreso a envio mail"); try { long tiempoInicial = System.currentTimeMillis(); MimeMessage message = new MimeMessage(this.getEnvioMailSession()); message.setSubject(correo.getAsunto()); message.setFrom(new InternetAddress(correo.getCorreoDesde())); message.addRecipients(Message.RecipientType.TO, obtenerDireccionesCorreo(correo.getCorreoPara())); if(correo.getCorreoCC() != null && correo.getCorreoCC().length > 0){ message.addRecipients(MimeMessage.RecipientType.CC, obtenerDireccionesCorreo(correo.getCorreoCC())); } if(correo.getCorreoCCO() != null && correo.getCorreoCCO().length > 0){ message.addRecipients(MimeMessage.RecipientType.BCC, obtenerDireccionesCorreo(correo.getCorreoCCO())); } message.setContent(obtenerDetallesCorreo(correo)); Transport.send(message); long tiempoFinal = System.currentTimeMillis(); log.info("Tiempo de envio mail: {}ms", tiempoFinal-tiempoInicial); } catch (AddressException e) { log.info(e.getMessage(), e); throw new EnvioMailException(MailMessages.getInstancia().getString("mensajeria.mensaje.error.direccion.incorrecta"), e); } catch (MessagingException e) { log.info(e.getMessage(), e); throw new EnvioMailException(MailMessages.getInstancia().getString("mensajeria.mensaje.error.mensaje.creacion"), e); } catch (Throwable e) { log.info(e.getMessage(), e); throw new EnvioMailException(MailMessages.getInstancia().getString("mensajeria.mensaje.error.mensaje.creacion"), e); } } /** * A partir de un arreglo de correos los devuelve transformados en un arreglo de {@link InternetAddress} * @param direcciones * @return * @throws AddressException */ private InternetAddress[] obtenerDireccionesCorreo(String[] direcciones) throws AddressException{ InternetAddress[] direccionesCorreo = new InternetAddress[direcciones.length]; int i = 0; for (String direccionCorreo : direcciones) { direccionesCorreo[i] = new InternetAddress(direccionCorreo); i++; } return direccionesCorreo; } /** * Este método agrega los detalles faltantes al correo como son adjuntos, imágenes y mensaje del correo en html * @throws MessagingException * @return */ private Multipart obtenerDetallesCorreo(EnvioCorreoDTO correo) throws MessagingException{ Multipart multipart = new MimeMultipart(); MimeBodyPart contenidoHTML = new MimeBodyPart(); contenidoHTML.setContent(correo.getMensajeHTML(), MailMessages.getInstancia().getString("mensajeria.tipo.contenido.html")); multipart.addBodyPart(contenidoHTML); if(correo.getAdjuntos() != null && !correo.getAdjuntos().isEmpty()){ for (Map.Entry entradaAdjunto : correo.getAdjuntos().entrySet()) { MimeBodyPart adjuntoCorreo = new MimeBodyPart(); adjuntoCorreo.setFileName(entradaAdjunto.getKey()); adjuntoCorreo.setContent(entradaAdjunto.getValue(), MailMessages.getInstancia().getString("mensajeria.tipo.contenido.general")); multipart.addBodyPart(adjuntoCorreo); } } return multipart; } @Override public void registraLogError(EnvioCorreoDTO envioCorreo){ if(envioCorreo != null){ log.error("Error al enviar el mail"); log.error("Datos de mail fallido"); log.error("-------------------"); log.error("Envio desde: {}", envioCorreo.getCorreoDesde()); log.error("Envio para: {}", envioCorreo.getCorreoPara()); log.error("Envio cc: {}", envioCorreo.getCorreoCC()); log.error("Envio cco: {}", envioCorreo.getCorreoCCO()); log.error("Asunto correo: {}", envioCorreo.getAsunto()); log.error("-------------------"); } } }