Можно ли иметь более одного идентификатора компонента (JavaMailSenderImpl), чтобы иметь возможность иметь несколько отправителей электронной почты? - PullRequest
0 голосов
/ 15 января 2019

У меня настроен отправитель почты в конфигурационном файле: spring / servlet-context.xml который имеет имя пользователя и пароль.
У меня есть конкретный вариант использования, в котором мне нужно отправить почту с на другую учетную запись электронной почты.
Можно ли настроить это в этом же файле конфигурации.

Сначала я подумал, что это будет означать просто добавить другой идентификатор компонента, в котором будут заданы имя пользователя и пароль другой учетной записи электронной почты, но тогда мне не было никакого смысла, как 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, потому что они только устанавливают visual"в" и "из" в почтовом ящике получателя)

В настоящий момент mailSender каким-то образом «знает», как указано выше в настройках конфигурации, отправлять электронную почту на адрес электронной почты, заданный в servlet-context.xml.

Я хотел бы добавить функцию sendMailFromSpecialSender, которая будет отправлять электронную почту от другого отправителя.

Возможно ли это?
Если это так, то как?

UPDATE:
После публикации этого вопроса я нашел частичный ответ на мой вопрос Билла Шеннона:

Простое решение - использовать отдельный сеанс для каждого отправителя и отправлять каждое сообщение по одному.

Итак ...
1. Как мне создать отдельный сеанс для моего другого дела отправителя?
2. Позволяет ли конфигурация в servlet-context.xml иметь отдельный сеанс с другой конфигурацией, или я могу оставить это как есть?

Спасибо-вы

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Ваш вопрос, по-видимому, связан с внедрением зависимостей Spring и с тем, как внедрить два bean-компонента одного класса.

Один хороший способ сделать это - использовать @Qualifier:

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

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

, а затем в определениях вашего компонента:

<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>

Таким образом, вы можете легко ввести два поля одного типа.

0 голосов
/ 15 января 2019

Вам просто нужно использовать другой mailSender в вашем методе sendMail (). В этом методе вы можете иметь условную проверку что-то вроде

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

Подобная проверка в вашем внутреннем классе может помочь вам решить, какого отправителя использовать.

...