如何使用动态凭据使用Spring 4发送电子邮件

时间:2017-06-28 19:01:37

标签: java spring email

我在appconfig中注册了以下的bean。如何在我的服务中使用构造函数注入来使用这个bean?我需要动态传递用户ID,密码。

@Bean
public JavaMailSender getMailSender(JavaMailerDTO javaMailer){
    JavaMailSenderImpl mailSender = new JavaMailSenderImpl();

    mailSender.setJavaMailProperties(mailProperties(javaMailer));

    mailSender.setHost(javaMailer.getHost());
    mailSender.setUsername(javaMailer.getEmailId());
    mailSender.setPassword(javaMailer.getEmailPassword());
    mailSender.setPort(Integer.parseInt(javaMailer.getPort()));
    return mailSender;
}

private Properties mailProperties(JavaMailerDTO javaMailer){
    Properties properties = new Properties();
    properties.put(ApplicationConstant.MAIL_AUTH, ApplicationConstant.TRUE);
    // .....
    properties.put(ApplicationConstant.MAIL_SMTPPORT,javaMailer.getPort());
    return properties;
}

你能帮我用上面的bean自动装配发送电子邮件吗?

1 个答案:

答案 0 :(得分:0)

我建议您创建一个工厂,为您构建一个单独的实例JavaMailSender以获取不同的凭据。

这样的事情:

public interface MailSenderFactory {
    JavaMailSender getSender(String email, String password);
}

@Component
public static class MailSenderFactoryImpl implements MailSenderFactory {

    private final JavaMailerDTO javaMailer;

    @Autowired
    public MailSenderFactoryImpl(JavaMailerDTO javaMailer) {
        this.javaMailer = javaMailer;
    }

    @Override
    public JavaMailSender getSender(final String email, final String password) {
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();

        mailSender.setJavaMailProperties(mailProperties(javaMailer));

        mailSender.setHost(javaMailer.getHost());
        mailSender.setUsername(email);
        mailSender.setPassword(password);
        mailSender.setPort(Integer.parseInt(javaMailer.getPort()));
        return mailSender;
    }

    private Properties mailProperties(JavaMailerDTO javaMailer) {
        Properties properties = new Properties();
        properties.put(ApplicationConstant.MAIL_AUTH, ApplicationConstant.TRUE);
        // .....
        properties.put(ApplicationConstant.MAIL_SMTPPORT, javaMailer.getPort());
        return properties;
    }
}

现在您可以像这样使用它:

@Service
public static class MailService {
    private final MailSenderFactory mailSenderFactory;

    public MailService(MailSenderFactory mailSenderFactory) {
        this.mailSenderFactory = mailSenderFactory;
    }

    public void sendMail() {
        JavaMailSender mailSender = mailSenderFactory.getSender("john.smith@gmail.com", "123456");
        mailSender.send(...);
    }
}