【问题标题】:Is it possible to have more than one bean id (JavaMailSenderImpl) to enable having multiple email senders?是否可以有多个 bean id (JavaMailSenderImpl) 来启用多个电子邮件发件人?
【发布时间】:2019-01-15 12:26:05
【问题描述】:

我在配置文件中设置了一个邮件发件人: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>

]

还有一个负责邮件发送的Java类:

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 函数无济于事,因为它们只在 recipent 的邮箱中设置 visual "to" 和 "from")

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

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

这可能吗?
如果是,那怎么办?

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

简单的解决方案是为每个发送者使用单独的会话,并一次发送一条消息。

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

谢谢

【问题讨论】:

  • 我不知道您是如何使用这些 bean 的,但是您必须将另一个 bean 添加到您的 Java 类中。就像你对 mailSender 所做的一样,这次使用 anotherMailSender 然后你就可以在你的函数中使用它了。
  • to @AmirM : 1. 我假设当我定义 JavaMailSender foo 时,它会自动创建带有在 xml 配置文件中定义的属性的 mailSender 对象。因此,我无法按照您的建议做我所理解的事情。 2.查看我的问题的更新,以了解我寻求答案的方向。 3. 谢谢你
  • 1.不,不是那样的,如果你有不同类型的bean,你可以实例化它们。有办法,为此。你只需要以某种方式实例化它。也许另一个像setSimpleMailMessage这样的二传手?也许通过构造函数?自动装配? 2. 我不建议这样做。我不知道该怎么做。

标签: java xml spring dependency-injection jakarta-mail


【解决方案1】:

您的问题似乎是关于Spring的依赖注入,以及如何注入同一类的两个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>

通过这种方式,您可以轻松地注入两个相同类型的字段。

【讨论】:

  • 太棒了!我会试一试。谢谢,同时
【解决方案2】:

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

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

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

【讨论】:

  • 主要问题是 - 我不知道如何创建这个 otherSender。我知道配置文件中的 mailSender 和 Java 代码中的 mailSender 具有相同的名称可能会令人困惑,但是它们之间有什么联系?
猜你喜欢
  • 2017-10-21
  • 2012-10-11
  • 2012-01-02
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 2019-11-12
相关资源
最近更新 更多