Быстрый старт: Docker + SMTP + Java/Go

Не так давно у меня появилась необходимость на нескольких проектах сделать регистрацию с подтверждением email, так же хотелось минимизировать затраты и исключить лишние телодвижения, так сказать методом ctrl+c ctrl+v, без танцев с бубном. Так же нам не нужно принимать почту и прочее, просто отправка, не более

P.s. Для прожженных отцов разработки ничего нового тут не будет

Итак, поехали ;-)

Аренда VPS

Самое важное чтоб был открыт порт — 465 (Многие их или закрывают полностью, или нужно пройти 7 кругов ада)

Так же ресурсы, опытным путем было выявлено что необходимо 2 ядра CPU и 2 GB RAM, на меньших ресурсах зависает даже в простое, про минимальные рассылки и вовсе стоит забыть

У одного известного немецкого хостера можно взять так (конечно есть проблемы с оплатой из РФ, но если заморочиться то это выгоднее чем переплачивать реселлерам х3-х4)

3e75cc7c902ab8dd58115fc7c69f496d.png

Настройка ОС и SMTP

  • Девственно чистая Ubuntu последних версий из коробки

  • Docker

  • Установка Mailu, у них есть классный конфигуратор

Как конфигурировать ?

  • Добавить А запись аля mail.example.com A ваш_ip (иначе letsencrypt не подтянет сертификат)

  • У хостера добавить к IP адресу PTR запись которая будет ссылаться на mail.example.com

  • Далее

5cca6b35581c1f9586f2a214faf09efc.pngНам нужна только отправка, ничего более

Нам нужна только отправка, ничего более

03b09bd3063cd14fb9ada06e0bb2d9bd.png

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

fc73708d8a247af4584f395dfc379d49.png

Выполняем команды, заходим в админку https://mail.example.com

Единственное что важно, на последнем этапе вместо PASSWORD можно указать свой_пароль, чтоб потом его не менять через UI

Настройка Mailu

Зайти в админку указав admin@mail.example.com и свой_пароль

В самой админке переходим на вкладку — Почтовые домены — Действия

9ca5ed30e241543016f608128bcc5acb.jpgc3d64cba3f74099b940a9cc11077ac46.png

Тут нам важно Сгенерировать ключи и скачать все настройки (Download zonefile)

Далее импортируем zonefile в свой домен

И последний этап создать пользователя — указать логин (например noreply) и пароль

87afe470d7179e16e0f3327adae31237.jpg

На выходе получится noreply@mail.example.com и пароль

По сути все, почтовый сервер настроен и готов к использованию, остается только использовать его в приложении

Java

Используем 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 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

Добавим пакет

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 канал — Синдром ИТшника

© Habrahabr.ru