Подтвердить что ты не робот

Как настроить Spring JavaMailSenderImpl для Gmail

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

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

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

<bean id="mailSender" class ="org.springframework.mail.javamail.JavaMailSenderImpl" >
    <property name="username" value="[email protected]" />
    <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, если я знаю, что мои учетные данные верны.

Update

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

<bean id="mailSender" class ="org.springframework.mail.javamail.JavaMailSenderImpl" >
    <property name="username" value="[email protected]" />
    <property name="password" value="XXX" />
    <property name="javaMailProperties">
    <props>
        <prop key="mail.smtp.from">[email protected]</prop>
        <prop key="mail.smtp.user">[email protected]</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>
4b9b3361

Ответ 1

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

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

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

Ответ 2

Я боролся в течение часа, чтобы найти правильные настройки для отправки электронной почты из 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
[email protected]
[email protected]
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: Исключение чтение ответа; Вложенное исключение:   javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: Не удалось создать путь PKIX: sun.security.provider.certpath.SunCertPathBuilderException: невозможно найдите действительный путь сертификации для запрошенной цели.

Ответ 3

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

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

Оба параметра manditory: javax.net.ssl.SSLSocketFactory, mail.smtp.socketFactory.fallback и делают mail.smtp.starttls.enable равными false.

<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>[email protected]</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="[email protected]" />
        <property name="to" value="[email protected]" />
        <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

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

<prop key="mail.smtp.starttls.enable">true</prop>

Ответ 5

Когда-то/первый раз Google предотвращает вход в вашу учетную запись любым сторонним приложением или используя ваш код. когда вы войдете в свою учетную запись в браузере, вы получите сообщение " Google предотвращает подозрительную попытку входа в вашу учетную запись", см. снимок экрана ниже. enter image description here

нажмите "Это вы" и разрешите вход.

Ответ 6

Здесь 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.

Ответ 7

Это не кажется существенно другим, но, возможно, попробуйте:

<bean id="mailSender" class ="org.springframework.mail.javamail.JavaMailSenderImpl" >
    <property name="username" value="[email protected]" />
    <property name="password" value="XXX" />
    <property name="javaMailProperties">
    <props>
        <prop key="mail.smtp.user" value="[email protected]" />
        <prop key="mail.smtp.password" value="XXX" />
        <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>

Ответ 8

Вы должны указать свой адрес "from", либо как <prop key="mail.smtp.from">[email protected]</prop>, либо при создании сообщения.

Ответ 9

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

<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="[email protected]" />
    <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

Ответ 11

Я также столкнулся с этой ошибкой аутентификации, и это связано с защитой gmail. Откройте следующий URL

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

и включите функцию защиты менее.

Ответ 12

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


spring.mail:
  host: smtp.gmail.com
  port: 465
  protocol: smtp
  username: [email protected]
  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