Как настроить Spring JavaMailSenderImpl для Gmail - PullRequest
38 голосов
/ 07 января 2010

Я пытаюсь найти правильные свойства для подключения к серверу SMTP Gmail с помощью класса JavaMailSenderImpl.

Позвольте мне сначала сказать, что я попробовал найденный подход здесь . Это работало нормально. Но когда я попробовал приведенную ниже конфигурацию с той же информацией аутентификации, я получил исключение javax.mail.AuthenticationFailedException.

Моя текущая конфигурация выглядит следующим образом.

<bean id="mailSender" class ="org.springframework.mail.javamail.JavaMailSenderImpl" >
    <property name="username" value="XXX@gmail.com" />
    <property name="password" value="XXX" />
    <property name="javaMailProperties">
    <props>
        <prop key="mail.smtp.host">smtp.gmail.com</prop>
        <prop key="mail.smtp.port">587</prop>
        <prop key="mail.smtp.auth">true</prop>
        <prop key="mail.smtp.starttls.enable">true</prop>
    </props>
    </property>
</bean>

Почему я все еще получаю это исключение javax.mail.AuthenticationFailedException, если я знаю, что мои учетные данные верны.

Обновление

Вот мой обновленный код, основанный на ответах ниже. Я все еще получаю то же исключение.

<bean id="mailSender" class ="org.springframework.mail.javamail.JavaMailSenderImpl" >
    <property name="username" value="XXX@gmail.com" />
    <property name="password" value="XXX" />
    <property name="javaMailProperties">
    <props>
        <prop key="mail.smtp.from">XXX@gmail.com</prop>
        <prop key="mail.smtp.user">XXX@gmail.com</prop>
        <prop key="mail.smtp.password">XXX</prop>
        <prop key="mail.smtp.host">smtp.gmail.com</prop>
        <prop key="mail.smtp.port">587</prop>
        <prop key="mail.smtp.auth">true</prop>
        <prop key="mail.smtp.starttls.enable">true</prop>
    </props>
    </property>
</bean>

Ответы [ 12 ]

33 голосов
/ 18 июня 2010

Это сработало для меня:

        <property name="host"><value>smtp.gmail.com</value></property>
        <property name="port"><value>587</value></property>
        <property name="protocol"><value>smtp</value></property>
        <property name="username"><value>${mail.username}</value></property>
        <property name="password"><value>${mail.password}</value></property>
        <property name="javaMailProperties">
            <props>
                <prop key="mail.smtp.auth">true</prop>
                <prop key="mail.smtp.starttls.enable">true</prop>
                <prop key="mail.smtp.quitwait">false</prop>
            </props>
        </property>

Реальный трюк для меня оказался в том, что значение «protocol» должно быть «smtp» (не «smtps»).

12 голосов
/ 19 января 2016

Я в течение часа пытался найти правильные настройки для отправки электронной почты из Gmail с помощью javamailsender и, наконец, сделал это. Я публикую это, так как не могу найти исчерпывающий пример для отправки через gmail через javamailsender, так что, надеюсь, это поможет кому-то, кто хочет сделать то же самое:

ШАГ 1:

Добавьте следующие настройки в mail.properties:

mail.protocol=smtp
mail.host=smtp.gmail.com
mail.port=465
mail.smtp.socketFactory.port=465
mail.smtp.auth=true
mail.smtp.starttls.enable=true
mail.smtp.debug=true
mail.smtp.starttls.required=true
mail.smtp.socketFactory.fallback=false
mail.from=XXX@gmail.com
mail.username=XXX@gmail.com
mail.password=my_password

И затем в вашем классе mailConfiguration @Value их в:

@Configuration
@PropertySource("classpath:mail.properties")
public class MailConfiguration {

    @Value("${mail.protocol}")
    private String protocol;
    @Value("${mail.host}")
    private String host;
    @Value("${mail.port}")
    private int port;
    @Value("${mail.smtp.socketFactory.port}")
    private int socketPort;
    @Value("${mail.smtp.auth}")
    private boolean auth;
    @Value("${mail.smtp.starttls.enable}")
    private boolean starttls;
    @Value("${mail.smtp.starttls.required}")
    private boolean startlls_required;
    @Value("${mail.smtp.debug}")
    private boolean debug;
    @Value("${mail.smtp.socketFactory.fallback}")
    private boolean fallback;
    @Value("${mail.from}")
    private String from;
    @Value("${mail.username}")
    private String username;
    @Value("${mail.password}")
    private String password;

    @Bean
    public JavaMailSender javaMailSender() {
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();

        Properties mailProperties = new Properties();
        mailProperties.put("mail.smtp.auth", auth);
        mailProperties.put("mail.smtp.starttls.enable", starttls);
        mailProperties.put("mail.smtp.starttls.required", startlls_required);
        mailProperties.put("mail.smtp.socketFactory.port", socketPort);
        mailProperties.put("mail.smtp.debug", debug);
        mailProperties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        mailProperties.put("mail.smtp.socketFactory.fallback", fallback);

        mailSender.setJavaMailProperties(mailProperties);
        mailSender.setHost(host);
        mailSender.setPort(port);
        mailSender.setProtocol(protocol);
        mailSender.setUsername(username);
        mailSender.setPassword(password);
        return mailSender;
    }
}

Обратите внимание, что на моем сервере Spring включен SSL, поэтому я использую порт 465. Для SSL используется порт 465. Если вы используете 487, вы должны использовать TLS.

ШАГ 2:

Перейдите по этой ссылке и выберите , чтобы включить доступ к менее защищенным приложениям.

https://www.google.com/settings/security/lesssecureapps

ШАГ 3:

Отключите AVAST, если он установлен на вашем компьютере. AVAST Mail Shield конфликтует с рассылкой писем. Если вы не выключите его, вы получите следующую ошибку:

Servlet.service () для сервлета [dispatcherServlet] в контексте с путем [] выдало исключение [Ошибка обработки запроса; вложенное исключение org.springframework.mail.MailSendException: соединение с почтовым сервером не удалось; Вложенным исключением является javax.mail.MessagingException: Exception чтение ответа; Вложенное исключение: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: не удалось построить путь PKIX: sun.security.provider.certpath.SunCertPathBuilderException: невозможно найти действительный путь сертификации к запрошенной цели.

5 голосов
/ 11 июля 2013

Для работы Gmail с TLS или SSL:

Порт для TLS / STARTTLS: 587
Порт для SSL: 465

Оба обязательных параметра имеют значение javax.net.ssl.SSLSocketFactory, mail.smtp.socketFactory.fallback и делают mail.smtp.starttls.enable ложным.

<beans>
    <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="host"><value>smtp.gmail.com</value></property>
        <property name="port"><value>465</value></property>
        <property name="protocol"><value>smtp</value></property>
        <property name="username"><value>XXXXX@gmail.com</value></property>
        <property name="password"><value>XXXX</value></property>
        <property name="javaMailProperties">
            <props>
                <prop key="mail.smtp.auth">true</prop>
                <prop key="mail.smtp.starttls.enable">false</prop>
                <prop key="mail.smtp.quitwait">false</prop>
                <prop key="mail.smtp.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop>
                <prop key="mail.smtp.socketFactory.fallback">false</prop>
                <prop key="mail.debug">true</prop>
            </props>
        </property>
    </bean>
    <bean id="mailMail" class="com.embitel.service.email.EmailService">
        <property name="mailSender" ref="mailSender" />
        <property name="simpleMailMessage" ref="customeMailMessage" />
    </bean>
    <bean id="customeMailMessage" class="org.springframework.mail.SimpleMailMessage">
        <property name="from" value="XXXX@gmail.com" />
        <property name="to" value="yyyyy@gmail.com" />
        <property name="subject" value="Testing Subject Line for email senind.." />
        <property name="text">
            <value>
        <![CDATA[
            Dear %s,
            Mail Content : %s
        ]]>
            </value>
        </property>
    </bean>
</beans>

работал как шарм !!!

4 голосов
/ 11 июня 2013

Иногда / впервые Google запрещает вход в вашу учетную запись любым сторонним приложением или с помощью вашего кода. когда вы войдете в свою учетную запись в браузере, вы получите сообщение « Google предотвращает подозрительную попытку входа в вашу учетную запись », см. Скриншот ниже. enter image description here

нажмите «Был ли это вы» и разрешите вход.

4 голосов
/ 08 июля 2010

Единственное свойство, необходимое для GMail -

<prop key="mail.smtp.starttls.enable">true</prop>
3 голосов
/ 03 марта 2017

Конфиг ниже (формат yaml) работал для меня после


spring.mail:
  host: smtp.gmail.com
  port: 465
  protocol: smtp
  username: xyz@gmail.com
  password: abc
  test-connection: true
  properties:
    "mail.smtp.auth": true
    "mail.smtp.starttls.enable": true
    "mail.smtp.starttls.required": true
    "mail.smtp.socketFactory.class": javax.net.ssl.SSLSocketFactory
    "mail.debug": true
2 голосов
/ 20 августа 2015

Вот javaConfig, который работал для меня:

    public JavaMailSender getJavaMailSender()
    {
        JavaMailSenderImpl sender = new JavaMailSenderImpl();
        sender.setProtocol("smtp");
        sender.setHost("smtp.gmail.com");
        sender.setPort(587);
        sender.setUsername("username");
        sender.setPassword("password");

        Properties mailProps = new Properties();
        mailProps.put("mail.smtps.auth", "true");
        mailProps.put("mail.smtp.starttls.enable", "true");
        mailProps.put("mail.smtp.debug", "true");

        sender.setJavaMailProperties(mailProps);

        return sender;
    }

Я думаю, вам нужно использовать порт 587 для работы TLS.

1 голос
/ 13 апреля 2012

Это сработало для меня :

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
    <property name="host" value="smtp.gmail.com" />
    <property name="port" value="465" />
    <property name="protocol" value="smtps" />
    <property name="username" value="my_email@domain.tld" />
    <property name="password" value="my_password" />
    <property name="javaMailProperties">
    <props>
        <prop key="mail.smtps.auth">true</prop>
    </props>
    </property>
</bean>

Обратитесь в службу поддержки Google для получения дополнительной информации: http://support.google.com/mail/bin/answer.py?hl=en&answer=78799

0 голосов
/ 03 января 2015

Я также столкнулся с этим исключением аутентификации, и это из-за безопасности Gmail. Откройте следующий URL

https://www.google.com/settings/security/lesssecureapps

и включите функцию менее безопасности.

0 голосов
/ 22 июля 2013

Я решил ваш вопрос.

как реализовать асинхронную почтовую службу весной

Обратите внимание, это работает с пружиной 3, поэтому я не уверен с пружиной 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...