В этой статье я бы хотел рассказать, как настроить отправку почты со своей личной почты, используя яндекс и Spring boot. Видел много статей по настройке smtp сервера на Spring boot, но без связки с яндексом. А это ключевой момент, так как найти бесплатные smtp сервера не так то просто.

Для начала, нам понадобится почта яндекс. После смотрим, какие конфиги нам нужны тут. Яндекс предлагает создать пароль для нашего приложения. Что мы и делаем по ссылке. При создании пароля, копируем его себе, так как виден он только первый раз.

По сути, с яндексом мы закончили.

Переходим в наш проект. Я предполагаю что у вас уже настроен Spring boot. Так что нужно добавить зависимость для почты. Я использую Gradle, так что у меня это выглядит так:

implementation("org.springframework.boot:spring-boot-starter-mail:3.1.5")

Помимо этого, нужно будет добавить конфиги в файл application.properties.

#email
spring.mail.host=smtp.yandex.ru
spring.mail.port=465
spring.mail.protocol=smtps
spring.mail.username=яндекс_логин
spring.mail.password=яндекс_пароль
mail.debug=false - #опционально, можно выключать если не нужно

Далее нам нужно вручную создать имплементацию класса JavaMailSender. В нем мы укажем все конфиги для нашей почты.

import org.springframework.beans.factory.annotation.Value
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.mail.javamail.JavaMailSender
import org.springframework.mail.javamail.JavaMailSenderImpl
@Configuration
class MailConfig {
@Value("${spring.mail.host}")
private val host: String? = null
@Value("\${spring.mail.username}")
private val username: String? = null

@Value("\${spring.mail.password}")
private val password: String? = null

@Value("\${spring.mail.port}")
private val port: Int = 0

@Value("\${spring.mail.protocol}")
private val protocol: String? = null

@Value("\${mail.debug}")
private val debug: String? = null

@Bean
fun getMailSender(): JavaMailSender {
    val mailSender = JavaMailSenderImpl()
    mailSender.host = host
    mailSender.port = port
    mailSender.username = username
    mailSender.password = password
    val properties = mailSender.javaMailProperties
    properties.setProperty("mail.transport.protocol", protocol)
    properties.setProperty("mail.debug", debug)
    return mailSender
}

}

С помощью аннотации @Value мы поттягиваем данные из конфигов. И в Котлине это выглядит немного по уродски, но выхода нет. Либо забивать конфиги вручную, а мы можем захотеть изменить их в зависимости от среды.

И класс, задача которого будет — отправлять письма. Назовем его MailSender.

import org.springframework.beans.factory.annotation.Value
import org.springframework.mail.SimpleMailMessage
import org.springframework.mail.javamail.JavaMailSender
import org.springframework.stereotype.Service
@Service
class MailSender(
private  val mailSender: JavaMailSender
) {
@Value("\${spring.mail.username}")
private val username: String? = null

fun send(emailTo: String, subject: String, message: String) {
    val mailMessage = SimpleMailMessage()
    mailMessage.from = username
    mailMessage.setTo(emailTo)
    mailMessage.subject = subject
    mailMessage.text = message
    mailSender.send(mailMessage)
}

}

Вот и все. Такими нехитрыми действиями мы создали класс, который может отправлять почту пользователям от нашего имени. Это бесплатно, просто и эффективно. Можем успешно решать такие задачи, как оповещения по почте, или подтверждение почты пользователей.

Спасибо что дочитали. Надеюсь было полезно.

Комментарии (6)


  1. turbo_nyasha
    10.08.2024 17:35
    +5

    И в Котлине это выглядит немного по уродски

    Чтобы это не выглядело по-уродски и было в лучших стилях private final сделайте @ConfigurationProperties.

    А вообще, есть сомнения насколько эту стать можно считать уникальной в плане контента.


  1. Folko85
    10.08.2024 17:35

    Вроде бы встречал такую инструкцию много раз в сети. Как насчёт того, чтобы настроить не только отправку, но и приём писем для автоматической обработки в приложении? Это более редкий случай, но зато хоть что-то новое было бы.


  1. LeshaRB
    10.08.2024 17:35
    +1

    Видел много статей по настройке smtp сервера на Spring boot, но без связки с яндексом

    А в чем существенная разница то? Например между тем же Gmail?


  1. ma1uta
    10.08.2024 17:35

    Про @ConfigurationProperties уже написали, более того, весь класс MailConfig можно удалять, так как он не нужен, в автоконфигурации https://github.com/spring-projects/spring-boot/blob/main/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mail/MailSenderPropertiesConfiguration.java объявляется бин JavaMailSender .


  1. WhiteApfel
    10.08.2024 17:35

    Нуууу, назвать это почтовым сервером... Когда это почтовый клиент, причём только smtp...


  1. sarkhan69
    10.08.2024 17:35

    При использовании spring boot starter mail, автоматически создаётся bean, javaMailSender, его можно напрямую заинжектить и не проставлять параметры соединения, так же не нужен отдельный проперти класс, если не требуется какое-то специфическое использование, выглядит как пустая статья, ради упоминания, код можно было уместить в один класс