Skip to content

Refact HtmlEmailSenderImpl #90

Open
@lanen

Description

@lanen
public class HtmlEmailSenderImpl implements HtmlEmailSender {


    private final static String TEMPLATE_PATH = "templates/email";

    private static final String CHARSET = "UTF-8";

    /**
     *
     * 邮件配置
     */
    private EmailConfig emailConfig;


    /**
     *
     */
    private JavaMailSender javaMailSender;

    /**
     *
     */
    private Configuration freemarkerMailConfiguration;


    @Override
    public void send(Email email) throws Exception {

        final String eml = email.getFrom();
        final String from = email.getFromEmail();
        final String to = email.getTo();
        final String subject = email.getSubject();
        final String tmpl = email.getTemplateName();

        final Map<String,String> templateTokens = email.getTemplateTokens();

        MimeMessagePreparator preparator = new MimeMessagePreparator() {
            public void prepare(MimeMessage mimeMessage)
                    throws MessagingException, IOException {


                mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(to));

                InternetAddress inetAddress = new InternetAddress();

                inetAddress.setPersonal(eml);
                inetAddress.setAddress(from);

                mimeMessage.setFrom(inetAddress);
                mimeMessage.setSubject(subject);

                // Create a "text" Multipart message
                //final Multipart multipart = createMultipart(email, "alternative", "text/plain");
                //mimeMessage.setContent(multipart);


                // Create a "HTML" Multipart message
                final Multipart htmlContent = createMultipart(email, "related", "text/html");
                mimeMessage.setContent(htmlContent);

                //BodyPart htmlPart = new MimeBodyPart();
                //htmlPart.setContent(htmlContent);
                //multipart.addBodyPart(htmlPart);


                // if(attachment!=null) {
                // MimeMessageHelper messageHelper = new
                // MimeMessageHelper(mimeMessage, true);
                // messageHelper.addAttachment(attachmentFileName, attachment);
                // }

            }
        };

        javaMailSender.send(preparator);

    }


    /**
     *
     * @param email
     * @param subtype
     * @return
     */
    private Multipart createMultipart(Email email,String subtype, String contentType){

        final String tmpl = email.getTemplateName();

        final Map<String,String> templateTokens = email.getTemplateTokens();

        Multipart multipart = new MimeMultipart(subtype);

        final StringWriter stringWriter = new StringWriter();
        processTemplate(tmpl, templateTokens, stringWriter);

        try {
            BodyPart bodyPart = createMimeBodyPart(stringWriter,contentType);
            multipart.addBodyPart(bodyPart);
        } catch (MessagingException e) {
            e.printStackTrace();
        }

        return multipart;

    }

    /**
     *
     * @param stringWriter
     * @param contentType
     * @return
     * @throws MessagingException
     */
    private MimeBodyPart createMimeBodyPart(final StringWriter stringWriter,String contentType) throws MessagingException {

        MimeBodyPart bodyPart = new MimeBodyPart();
        bodyPart.setDataHandler(new javax.activation.DataHandler(
                new javax.activation.DataSource() {
                    public InputStream getInputStream()
                            throws IOException {

                        return new ByteArrayInputStream(stringWriter
                                .toString().getBytes(CHARSET));
                    }

                    public OutputStream getOutputStream()
                            throws IOException {
                        throw new IOException("Read-only data");
                    }

                    public String getContentType() {
                        return contentType;
                    }

                    public String getName() {
                        return "main";
                    }
                }));


        return bodyPart;
    }

    /**
     *
     * @param templateName
     * @param templateTokens
     * @param htmlWriter
     */
    private void processTemplate(String templateName,Map<String,String> templateTokens, final StringWriter htmlWriter){

        freemarkerMailConfiguration.setClassForTemplateLoading(HtmlEmailSenderImpl.class, "/");
        Template htmlTemplate = null;
        try {
            htmlTemplate = freemarkerMailConfiguration.getTemplate(new StringBuilder(TEMPLATE_PATH).append("").append("/").append(templateName).toString());
        } catch (IOException e) {
            e.printStackTrace();
        }

        if(null == htmlTemplate){
            return;
        }
        try {
            htmlTemplate.process(templateTokens, htmlWriter);
        } catch (TemplateException e) {
            throw new MailPreparationException(
                    "Can't generate HTML mail", e);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void initEmailConfig(EmailConfig emailConfig) {
        this.emailConfig = emailConfig;

        JavaMailSenderImpl impl = (JavaMailSenderImpl)javaMailSender;
        // if email configuration is present in Database, use the same
        if(emailConfig != null) {
            impl.setProtocol(emailConfig.getProtocol());
            impl.setHost(emailConfig.getHost());
            impl.setPort(Integer.parseInt(emailConfig.getPort()));
            impl.setUsername(emailConfig.getUsername());
            impl.setPassword(emailConfig.getPassword());

            Properties prop = new Properties();
            prop.put("mail.smtp.auth", emailConfig.isSmtpAuth());
            prop.put("mail.smtp.starttls.enable", emailConfig.isStarttls());
            impl.setJavaMailProperties(prop);
        }
    }

    public JavaMailSender getJavaMailSender() {
        return javaMailSender;
    }

    public void setJavaMailSender(JavaMailSender javaMailSender) {
        this.javaMailSender = javaMailSender;
    }

    public Configuration getFreemarkerMailConfiguration() {
        return freemarkerMailConfiguration;
    }

    public void setFreemarkerMailConfiguration(Configuration freemarkerMailConfiguration) {
        this.freemarkerMailConfiguration = freemarkerMailConfiguration;
    }

}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions