Быстрый старт: 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 канал — Синдром ИТшника