是否可以使用多个 bean id (JavaMailSenderImpl) 来启用多个电子邮件发件人?

Is it possible to have more than one bean id (JavaMailSenderImpl) to enable having multiple email senders?

我在配置文件中设置了邮件发件人:spring/servlet-context。xml 其中设置了用户名和密码。
我想出了一个特定的用例,我需要从 另一个电子邮件帐户 发送邮件。
是否可以在同一个配置文件中进行设置。

起初,我认为这只是简单地添加另一个在其中设置了其他电子邮件帐户的用户名和密码的 bean id,但后来我不明白 JavaMailSender 是怎么回事每次都告诉我想要哪个发件人?!

我的代码:
在 servlet-context.xml 中:

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
    <property name="host" value="smtp.gmail.com" />
    <property name="port" value="587" />
    <property name="username" value="default_email@gmail.com" />
    <property name="password" value="***1***" />
    <property name="javaMailProperties">
        <props>
            <prop key="mail.transport.protocol">smtp</prop>
            <prop key="mail.smtp.auth">true</prop>
            <prop key="mail.smtp.starttls.enable">true</prop>
            <prop key="mail.debug">false</prop>
            <prop key="mail.smtp.sendpartial">true</prop>
        </props>
    </property>
</bean>

[我想在这里添加:

<bean id="anotherMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
    ...
    <property name="username" value="another_email@gmail.com" />
    <property name="password" value="***2***" />
    ...
</bean>

]

还有一个JavaClass负责邮件发送:

public class MailService {
    private static JavaMailSender mailSender;

    @SuppressWarnings("static-access")
    public void setMailSender(JavaMailSender mailSender) {
        this.mailSender = mailSender;
    }

    public void sendMail(final String aSubject, final String aContent, final String toMail, final List<String> attachedFileUrls, String aFilename) {
        MimeMessage message = mailSender.createMimeMessage();
        try {
            MimeMessageHelper helper = new MimeMessageHelper(message, true,"UTF-8");
            helper.setFrom(simpleMailMessage.getFrom());
            helper.setTo(toMail);
            helper.setSubject("A subject");
            helper.setText("some content", true);
        } catch (Exception e) {...}
        Thread thread = new SendMail1(message);
        thread.start();
}

    class SendMail1 extends Thread {
        MimeMessage message;

        SendMail1(MimeMessage message) {
            this.message = message;
        }

        public void run() {
            mailSender.send(message);
        }
    }
}  

(更改setFrom和setTo功能没有帮助,因为它们只设置了visual "to"和"from"在收件人的邮箱中)

目前 mailSender "knows" 以某种方式通过上面的配置设置将电子邮件发送到 servlet-context.xml 中设置的电子邮件。

我想添加 sendMailFromSpecialSender 函数,该函数将从其他发件人发送电子邮件。

这可能吗?
如果是,那又如何呢?

更新:
发布这个问题后,我找到了 Bill Shannon 对我的问题的部分回答:

The simple solution is to use a separate Session for each sender and send each message one at a time.

所以...
1. 如何为我的其他发件人案例创建一个单独的会话?
2. servlet-context.xml 中的配置是否启用与其他配置的单独会话,或者我可以保持原样吗?

谢谢

您只需在 sendMail() 方法中使用另一个 mailSender。 在那种方法中,您可以进行条件检查,例如

if(condtion){
  MimeMessage=mailSender.createMimeMessage();
 else {
    MimeMessage=otherSender.createMimeMessage()
 }

在你的内部进行类似的检查 class 可以帮助你决定使用哪个发件人。

你的问题好像是关于Spring的依赖注入,以及如何注入两个相同class的bean。

一个好的方法是 use a @Qualifier:

public void setPrimaryMailSender(@Qualifier("primary") JavaMailSender mailSender) {
    this.mailSender = mailSender;
}

public void setSecondaryMailSender(@Qualifier("secondary") JavaMailSender mailSender) {
    this.secondaryMailSender = mailSender;
}

然后在你的 bean 定义中:

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
    <qualifier value="primary"/>
    ...
</bean>

<bean id="anotherMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
    <qualifier value="secondary"/>
    ...
</bean>

这样就可以很方便地注入两个相同类型的字段。