Как отправить электронное письмо через почтовый сервер smtp.mail.ru?

Как настроить отправку электронных писем из проекта, развернутого на сервере nginx, с бэкендом в докере на Spring Boot, чтобы избежать проблем с доставкой сообщений почтовыми сервисами? При тестировании на localhost письма успешно отправляются на порт 587 (ранее работал и порт 465), однако после деплоя проекта письма не доходят и в логах фиксируется превышение времени ожидания от smtp-серверов mail.ru. Попытки указать соединение через защищенный порт 465 и использовать SSL не привели к успеху. Docker не блокирует соединения, поскольку обращение к сторонним API работает. Ответ от службы поддержки mail.ru не помог, так как они отказались помочь, указав на подключение через код, а не через специализированные почтовые сервисы. Как можно решить эту проблему?
  • 23 мая 2024 г. 17:01
Ответы на вопрос 2
Для отправки электронного письма через почтовый сервер smtp.mail.ru, необходимо настроить соответствующие настройки в вашем проекте. Ниже приведен пример кода на Java, который позволит отправить письмо через smtp.mail.ru:

```java
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class MailSender {

    public static void sendEmail(String recipient, String subject, String body) {
        final String username = "[email protected]";
        final String password = "your_password";

        Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.mail.ru");
        props.put("mail.smtp.port", "587");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");

        Session session = Session.getInstance(props, new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
        });

        try {
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(username));
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipient));
            message.setSubject(subject);
            message.setText(body);

            Transport.send(message);

            System.out.println("Email sent successfully");

        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) {
        sendEmail("[email protected]", "Test Subject", "Test Body");
    }
}
```

Что касается проблемы с доставкой сообщений почтовыми сервисами после деплоя проекта на сервере nginx с бэкендом в докере на Spring Boot, можно попробовать следующие способы:

1. Проверить, не блокируют ли файрволы сервера nginx соединения на порт 587. Убедитесь, что порт открыт и доступен для обмена данными.
2. Попробуйте указать корректный хост smtp.mail.ru в настройках почтового сервера.
3. Проверьте, не блокирует ли docker контейнер соединение с почтовым сервером. Можно попробовать настроить дополнительные правила в фаерволе docker.
4. Проверьте, не идет ли перегрузка сети или сервера, что может привести к превышению времени ожидания от smtp-серверов.
5. Попробуйте использовать другой smtp-сервер для отправки писем, например, Gmail.

Если проблема все еще сохраняется, стоит обратиться к специалистам по области сетевых технологий или к специалистам по работе с почтовыми серверами для подробного анализа проблемы и ее решения. Также можно попробовать обратиться к специалистам команды поддержки софтвера, в том числе и самой команде Spring Boot, чтобы получить более детальную информацию о проблеме и методы ее решения.
Разумеется, поддержка помогать не станет. Твой код же их рекламу не показывает. 
А если код не работает после деплоя - хорошая вероятность, что mail.ru тупо режет обращения с диапазонов не из обычных провайдерских сетей. Попробуй развернуть прокси на хосте, где делаешь деплой, и сконнектиться с домашнего компа через него - если обломаешься, то дело в этом.
Похожие вопросы