Быстрый старт: Docker + SMTP + Java/Go
- четверг, 25 июля 2024 г. в 00:00:12
 
Не так давно у меня появилась необходимость на нескольких проектах сделать регистрацию с подтверждением email, так же хотелось минимизировать затраты и исключить лишние телодвижения, так сказать методом ctrl+c ctrl+v, без танцев с бубном. Так же нам не нужно принимать почту и прочее, просто отправка, не более
P.s. Для прожженных отцов разработки ничего нового тут не будет
Итак, поехали ;-)
Самое важное чтоб был открыт порт - 465 (Многие их или закрывают полностью, или нужно пройти 7 кругов ада)
Так же ресурсы, опытным путем было выявлено что необходимо 2 ядра CPU и 2 GB RAM, на меньших ресурсах зависает даже в простое, про минимальные рассылки и вовсе стоит забыть
У одного известного немецкого хостера можно взять так (конечно есть проблемы с оплатой из РФ, но если заморочиться то это выгоднее чем переплачивать реселлерам х3-х4)

Девственно чистая Ubuntu последних версий из коробки
Установка Mailu, у них есть классный конфигуратор
Как конфигурировать ?
Добавить А запись аля mail.example.com A ваш_ip (иначе letsencrypt не подтянет сертификат)
У хостера добавить к IP адресу PTR запись которая будет ссылаться на mail.example.com
Далее



По сути все, далее конфигуратор нам даст набор команд

Выполняем команды, заходим в админку https://mail.example.com
Единственное что важно, на последнем этапе вместо PASSWORD можно указать свой_пароль, чтоб потом его не менять через UI
Зайти в админку указав admin@mail.example.com и свой_пароль
В самой админке переходим на вкладку - Почтовые домены - Действия


Тут нам важно Сгенерировать ключи и скачать все настройки (Download zonefile)
Далее импортируем zonefile в свой домен
И последний этап создать пользователя - указать логин (например noreply) и пароль

На выходе получится noreply@mail.example.com и пароль
По сути все, почтовый сервер настроен и готов к использованию, остается только использовать его в приложении
Используем Spring Boot, в зависимости добавим
implementation 'org.springframework.boot:spring-boot-starter-mail'В application.yml
spring:
  mail:
    host: mail.example.com
    port: 465
    username: noreply@mail.example.com
    password: qwer1234
    properties:
      mail:
        smtp:
          auth: true
          ssl:
            enable: trueИ само использование
import lombok.RequiredArgsConstructor;
import org.springframework.boot.autoconfigure.mail.MailProperties;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;
@Service
@RequiredArgsConstructor
public class MailService {
    private final MailProperties mailProperties;
    private final JavaMailSender mailSender;
    public Mono<Boolean> send(String email, String title, String text) {
        return Mono.fromCallable(() -> {
            try {
                MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mailSender.createMimeMessage(), true);
                mimeMessageHelper.setFrom("BestCompany <" + mailProperties.getUsername() + ">");
                mimeMessageHelper.setTo(email);
                mimeMessageHelper.setSubject(title);
                mimeMessageHelper.setText(text, true);
                mailSender.send(mimeMessageHelper.getMimeMessage());
            } catch (Exception e) {
                e.printStackTrace();
            }
            return true;
        });
    }
}Добавим пакет
go get gopkg.in/gomail.v2Инициализируем клиент
	mailDialer := gomail.NewDialer(
		"mail.exmaple.com",
		465,
		"noreply@mail.exmaple.com",
		"qwer1234",
	)
	mailDialer.SSL = trueОтправим письмо
	m := gomail.NewMessage()
	m.SetHeader("From", "noreply@mail.exmaple.com")
	m.SetHeader("To", to)
	m.SetHeader("Subject", subject)
	m.SetBody("text/plain", body)
	err := mailDialer.DialAndSend(m)Профит ;-)
Мой Telegram канал — Синдром ИТшника