Как настроить 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>
Ответы
Ответ 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
Ответ 10
Я решил ваш вопрос.
как реализовать асинхронную службу электронной почты в spring
Обратите внимание, что это работает на spring 3, поэтому я не уверен с spring 2.
Ответ 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