All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.payneteasy.superfly.email.impl.EmailServiceImpl Maven / Gradle / Ivy

package com.payneteasy.superfly.email.impl;

import com.payneteasy.superfly.email.EmailService;
import com.payneteasy.superfly.email.RuntimeMessagingException;
import com.payneteasy.superfly.service.JavaMailSenderPool;
import com.payneteasy.superfly.service.JavaMailSenderPool.ConfiguredSender;
import org.apache.velocity.app.VelocityEngine;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.mail.MailException;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.ui.velocity.VelocityEngineUtils;

import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.HashMap;
import java.util.Map;

public class EmailServiceImpl implements EmailService {

    private VelocityEngine velocityEngine;
    private JavaMailSenderPool javaMailSenderPool;
    private String templatePrefix = "velocity/";
    private boolean enableHotpEmails = true;

    @Required
    public void setVelocityEngine(VelocityEngine velocityEngine) {
        this.velocityEngine = velocityEngine;
    }

    @Required
    public void setJavaMailSenderPool(JavaMailSenderPool javaMailSenderPool) {
        this.javaMailSenderPool = javaMailSenderPool;
    }

    public void setTemplatePrefix(String templatePrefix) {
        this.templatePrefix = templatePrefix;
    }

    public void setEnableHotpEmails(boolean enableHotpEmails) {
        this.enableHotpEmails = enableHotpEmails;
    }

    @Override
    public void sendHOTPTable(String subsystemIdentifier, String to, String fileName, final byte[] table) throws RuntimeMessagingException {
        if (enableHotpEmails) {
            ConfiguredSender sender = javaMailSenderPool.get(subsystemIdentifier);
            if (sender != null) {
                try {
                    String subject = "Your one-time passwords table";
                    Map model = createEmptyModel();
                    String body = getMessageBody("hotp-table.vm", model);

                    MimeMessage message = createMessage(sender);
                    MimeMessageHelper helper = createMultipartHelper(message);
                    initHelper(sender, to, subject, body, helper);
                    addOctetStreamAttachment(helper, fileName, table);
                    sender.getSender().send(message);
                } catch (MessagingException e) {
                    throw new RuntimeMessagingException(e);
                } catch (MailException e) {
                    throw new RuntimeMessagingException(e);
                }
            }
        }
    }

    @Override
    public void sendNoPublicKeyMessage(String subsystemIdentifier, String email)
            throws RuntimeMessagingException {
        if (enableHotpEmails) {
            ConfiguredSender sender = javaMailSenderPool.get(subsystemIdentifier);
            if (sender != null) {
                try {
                    String subject = "Your public key is not submitted";
                    Map model = createEmptyModel();
                    String body = getMessageBody("no-public-key.vm", model);

                    MimeMessage message = createMessage(sender);
                    MimeMessageHelper helper = createSimpleHelper(message);
                    initHelper(sender, email, subject, body, helper);
                    sender.getSender().send(message);
                } catch (MessagingException e) {
                    throw new RuntimeMessagingException(e);
                } catch (MailException e) {
                    throw new RuntimeMessagingException(e);
                }
            }
        }
    }

    @Override
    public void sendTestMessage(long serverId, String email)
            throws RuntimeMessagingException {
        ConfiguredSender sender = javaMailSenderPool.get(serverId);
        try {
            String subject = "Test message";
            Map model = createEmptyModel();
            String body = getMessageBody("test-message.vm", model);

            MimeMessage message = createMessage(sender);
            MimeMessageHelper helper = createSimpleHelper(message);
            initHelper(sender, email, subject, body, helper);
            sender.getSender().send(message);
        } catch (MessagingException e) {
            throw new RuntimeMessagingException(e);
        } catch (MailException e) {
            throw new RuntimeMessagingException(e);
        }
    }

    private MimeMessageHelper createSimpleHelper(MimeMessage message) throws MessagingException {
        return new MimeMessageHelper(message, false);
    }

    @Override
    public void sendPassword(String subsystemIdentifier, String to, String fileName, byte[] encryptedPasswordBytes) {
        ConfiguredSender sender = javaMailSenderPool.get(subsystemIdentifier);
        if (sender != null) {
            try {
                String subject = "Your new password";
                Map model = createEmptyModel();
                String body = getMessageBody("password.vm", model);

                MimeMessage message = createMessage(sender);
                MimeMessageHelper helper = createMultipartHelper(message);
                initHelper(sender, to, subject, body, helper);
                addOctetStreamAttachment(helper, fileName, encryptedPasswordBytes);
                sender.getSender().send(message);
            } catch (MessagingException e) {
                throw new RuntimeMessagingException(e);
            } catch (MailException e) {
                throw new RuntimeMessagingException(e);
            }
        }
    }

    private void addOctetStreamAttachment(MimeMessageHelper helper, String fileName,
            byte[] data) throws MessagingException {
        helper.addAttachment(fileName + ".pgp", new ByteArrayResource(data),
                "application/octet-stream");
    }

    private void initHelper(ConfiguredSender sender, String to, String subject, String body,
            MimeMessageHelper helper) throws MessagingException {
        helper.setFrom(new InternetAddress(sender.getFrom()));
        helper.setSubject(subject);
        helper.setText(body, false);
        helper.setTo(new InternetAddress(to));
    }

    private MimeMessageHelper createMultipartHelper(MimeMessage message) throws MessagingException {
        return new MimeMessageHelper(message, true);
    }

    private MimeMessage createMessage(ConfiguredSender sender) {
        return sender.getSender().createMimeMessage();
    }

    private HashMap createEmptyModel() {
        return new HashMap();
    }

    private String getMessageBody(String template, Map model) {
        return VelocityEngineUtils.mergeTemplateIntoString(velocityEngine,
                templatePrefix + template, "utf-8", model);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy