Мне нужно было написать сервис для отправки писем, но сколько источников я не просматривал документацию по Java-мейлеру, ничего не выходит и вылетает с неожиданной ошибкой:
"Mail server connection failed. Failed messages: org.eclipse.angus.mail.util .MailConnectException: Couldn't connect to host, port: smtp.gmail.com, 587; timeout -1;\n nested exception is:\n\tjava.net.ConnectException: Connection timed out: connect".
Подскажите пожалуйста, может я где-то что-то упустил. Вот мой сервис, который встроен в другой через DI с помощью интерфейса, ошибок там быть не может:
@Service
public class EmailService implements IEmailService{
private static final Logger log = LoggerFactory.getLogger(EmailService.class);
private final JavaMailSender _javaMailSender;
public EmailService(JavaMailSender javaMailSender){
_javaMailSender=javaMailSender;
}
@Value("${spring.mail.username}") private String sender;
@Override
public ServiceResponse<String> sendEmail(String recipientEmail, String subject, String message) throws Exception {
var serviceResponse = new ServiceResponse<String>();
try {
MimeMessage messageM = _javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(messageM, true);
mimeMessageHelper.setFrom(sender);
mimeMessageHelper.setTo(recipientEmail);
mimeMessageHelper.setSubject(subject);
mimeMessageHelper.setText(message);
_javaMailSender.send(messageM);
serviceResponse.data=null;
serviceResponse.success=true;
serviceResponse.message=String.format("Security code for %s successfully sent to your email.", subject);
}
catch (Exception ex) {
serviceResponse.data=null;
serviceResponse.success=false;
serviceResponse.message=ex.getMessage();
}
return serviceResponse;
}
Вот мой application.yml
:
mail:
host: smtp.gmail.com
username: [email protected]
password: **** **** **** ****
port: 587
protocol: smtp
properties:
"mail.transport.protocol": smtp
"mail.smtp.auth": true
"mail.smtp.starttls.enable": true
pom.xml
пакет:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
ожидал, что сообщение будет отправлено по электронной почте, но вместо этого произошла вышеуказанная ошибка
application.yml
spring:
mail:
host: smtp.gmail.com
port: 587
username: [email protected]
password: your_app_password_here
properties:
mail:
smtp:
auth: true
starttls:
enable: true
Добавьте их в application.yml, чтобы включить ведение журнала отладки для отправителя почты.
logging:
level:
org.springframework.mail: DEBUG
org.apache.commons.mail: DEBUG
Обновите EmailService Также:
@Service
public class EmailService implements IEmailService {
private static final Logger log = LoggerFactory.getLogger(EmailService.class);
private final JavaMailSender javaMailSender;
@Value("${spring.mail.username}")
private String sender;
public EmailService(JavaMailSender javaMailSender) {
this.javaMailSender = javaMailSender;
}
@Override
public ServiceResponse<String> sendEmail(String recipientEmail, String subject, String message) {
var serviceResponse = new ServiceResponse<String>();
try {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
mimeMessageHelper.setFrom(sender);
mimeMessageHelper.setTo(recipientEmail);
mimeMessageHelper.setSubject(subject);
mimeMessageHelper.setText(message);
javaMailSender.send(mimeMessage);
serviceResponse.data = null;
serviceResponse.success = true;
serviceResponse.message = String.format("Security code for %s successfully sent to your email.", subject);
} catch (Exception ex) {
log.error("Error sending email: {}", ex.getMessage(), ex);
serviceResponse.data = null;
serviceResponse.success = false;
serviceResponse.message = ex.getMessage();
}
return serviceResponse;
}
}
Что ты изменил? Что было не так раньше?
заменил мои файлы на ваши и включил ведение журнала, ошибки остались прежними
Сообщение об ошибке «Ошибка подключения к почтовому серверу» на самом деле указывает на проблему с сетевым подключением, которая может быть вызвана множеством причин или проблем.
Вы можете попробовать закрепить сервер с вашего локального компьютера следующим образом:
ping smtp.gmail.com
или
telnet smtp.gmail.com 587
spring:
mail:
host: smtp.gmail.com
port: 587
username: [email protected]
password: yourpassword
properties:
mail.smtp.auth: true
mail.smtp.starttls.enable: true
mail.transport.protocol: smtp
Я написал эту конфигурацию, вы также можете использовать ее для проверки правильности настройки вашего JavaMailSender bean:
@Configuration
public class MailConfig {
@Bean
public JavaMailSender javaMailSender() {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setHost("smtp.gmail.com");
mailSender.setPort(587);
mailSender.setUsername("[email protected]");
mailSender.setPassword("yourpassword");
Properties props = mailSender.getJavaMailProperties();
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.debug", "true");
return mailSender;
}
}
Не забудьте проверить настройки брандмауэра/прокси-сервера, чтобы убедиться, что ваш компьютер или сеть не блокирует исходящие соединения через порт 587. Вы можете проверить настройки брандмауэра или прокси-сервера, которые могут мешать этому соединению.
Надеюсь, это поможет.
привет, спасибо, все поменял, но ошибки остались прежние. 2024-07-14T14:29:12.578+03:00 ОШИБКА 14272 --- [io-8080-exec-10] h.service.emailService.EmailService: Ошибка отправки электронной почты: не удалось подключиться к почтовому серверу. Неудачные сообщения: org.eclipse.angus.mail.util.MailConnectException: не удалось подключиться к хосту, порт: smtp.gmail.com, 587; тайм-аут -1; и на сайте Google говорится, что они отключили функцию менее безопасных приложений с 2024 года.
У меня та же проблема. SMTP-сервер доступен. Команда ping не показывает потерю пакетов. Более того, я могу зайти в почту и отправлять с нее сообщения вручную. Все настройки в файле выставлены правильно. Со специальным паролем для приложения проблем не возникает. Попробовал установить правила для порта 587 в брандмауэре. Ничего не помогает, ошибка та же. По-прежнему "Тайм-аут соединения истек", как будто SMTP-сервер недоступен, хотя он доступен.
В качестве теста или альтернативы вы можете попробовать использовать другого поставщика услуг электронной почты. SMTP2GO предлагает бесплатные уровни и может быть быстрым способом проверить, является ли проблема специфичной для Gmail. @ushkdn
Проблема решилась заменой интернет-провайдера (изначально не получалось, так как я подключался к Wi-Fi другой сети со вставленным патч-кордом текущей сети (не знаю, проблема была в винде или сама сетевая карта, что она не могла переключить сигнал, но после переключения) в другую сеть и полного отключения от предыдущей смтп сразу встала и работает)).
привет, спасибо, все поменял, но ошибки остались прежние. 2024-07-14T14:29:12.578+03:00 ОШИБКА 14272 --- [io-8080-exec-10] h.service.emailService.EmailService: Ошибка отправки электронной почты: не удалось подключиться к почтовому серверу. Неудачные сообщения: org.eclipse.angus.mail.util.MailConnectException: не удалось подключиться к хосту, порт: smtp.gmail.com, 587; тайм-аут -1;