golang

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

  • четверг, 25 июля 2024 г. в 00:00:12
https://habr.com/ru/articles/831230/

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

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

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

Аренда VPS

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

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

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

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

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

  • Docker

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

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

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

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

  • Далее

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

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

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

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

Настройка Mailu

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

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

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

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

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

На выходе получится 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<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

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

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