Java 如何使用Spring4使用动态凭据发送电子邮件

Java 如何使用Spring4使用动态凭据发送电子邮件,java,spring,email,Java,Spring,Email,我在appconfig中注册下面的bean。如何在我的服务中使用构造函数注入来使用这个bean?我需要动态地传递用户ID和密码 @Bean public JavaMailSender getMailSender(JavaMailerDTO javaMailer){ JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); mailSender.setJavaMailProperties(mailProperties(ja

我在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自动连线发送电子邮件吗?

我建议您创建一个工厂,为您创建一个单独的实例
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(...);
    }
}
现在您可以这样使用它:

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(...);
    }
}
参考