Eğitim Portalı/Spring Boot/Spring Boot ile E-posta Gönderme
Spring Boot03-spring-boot/36-sending-email

Spring Boot ile E-posta Gönderme

> ⚠️ Bu konuda çalıştırılabilir örnek yoktur. spring-boot-starter-mail + bir SMTP sunucusu > gerektirir; portalda çalışmaz. Kod tanıtım amaçlıdır. (E-postanın genel/saf Java tarafı için > Java bölümündeki "E-posta Gön…

Spring Boot ile E-posta Gönderme

⚠️ Bu konuda çalıştırılabilir örnek yoktur. spring-boot-starter-mail + bir SMTP sunucusu gerektirir; portalda çalışmaz. Kod tanıtım amaçlıdır. (E-postanın genel/saf Java tarafı için Java bölümündeki "E-posta Gönderme" konusuna da bakabilirsin.)

Kayıt onayı, parola sıfırlama, bildirim, fatura... Spring Boot, e-posta gönderimini spring-boot-starter-mail ve JavaMailSender ile çok kolaylaştırır: yapılandırmayı application.yml'e yazarsın, gönderici otomatik hazırlanır.

Kurulum ve yapılandırma

implementation 'org.springframework.boot:spring-boot-starter-mail'
spring:
  mail:
    host: smtp.gmail.com
    port: 587
    username: ${MAIL_USER}          # ortam değişkeninden (sırrı koda gömme!)
    password: ${MAIL_PASSWORD}      # Gmail'de "uygulama parolası"
    properties:
      mail.smtp.auth: true
      mail.smtp.starttls.enable: true

Spring Boot, bu ayarlardan bir JavaMailSender bean'i otomatik oluşturur.

Basit metin e-posta

@Service
class EpostaServisi {
    private final JavaMailSender sender;     // Spring enjekte eder
    EpostaServisi(JavaMailSender sender) { this.sender = sender; }

    public void gonder(String kime, String konu, String govde) {
        SimpleMailMessage m = new SimpleMailMessage();
        m.setTo(kime);
        m.setSubject(konu);
        m.setText(govde);
        sender.send(m);
    }
}

HTML e-posta ve ekler (MimeMessageHelper)

Zengin içerik (HTML, ek, gömülü görsel) için MimeMessage + MimeMessageHelper:

public void htmlGonder(String kime, String konu, String html) throws MessagingException {
    MimeMessage mesaj = sender.createMimeMessage();
    MimeMessageHelper h = new MimeMessageHelper(mesaj, true, "UTF-8");  // multipart=true
    h.setTo(kime);
    h.setSubject(konu);
    h.setText(html, true);                                    // true -> HTML
    h.addAttachment("fatura.pdf", new ClassPathResource("fatura.pdf"));
    sender.send(mesaj);
}

Şablonlu e-posta (Thymeleaf)

HTML'i koda gömmek yerine bir şablon motoruyla üret (topiklerde Thymeleaf):

Context ctx = new Context();
ctx.setVariable("ad", "Ada");
String html = templateEngine.process("hosgeldin-email", ctx);  // hosgeldin-email.html şablonu
h.setText(html, true);

Böylece tasarım (HTML) ile kod ayrılır; e-posta görünümü kolayca düzenlenir.

Üretim pratikleri

  • Asenkron gönder: E-posta gönderimi yavaştır (SMTP gidiş-dönüşü). Ana isteği bekletmemek için @Async (topic 05) veya bir mesaj kuyruğu (Kafka/RabbitMQ — topic 32) ile arka planda gönder.
  • Sırları koruma: SMTP parolası/anahtarı ortam değişkeni veya secret yöneticisinden gelsin; application.yml'e düz metin yazma.
  • Uygulama parolası / OAuth2: Gmail gibi sağlayıcılarda normal parola değil, "uygulama parolası" ya da OAuth2 gerekir.
  • E-posta servisleri: Üretimde doğrudan SMTP yerine genelde SendGrid / Amazon SES / Mailgun kullanılır (teslimat oranı, spam yönetimi, ölçek, geri bildirim).
  • Hata/yeniden deneme: Gönderim başarısız olabilir; retry + ölü mektup (dead letter) mantığı kur.

Özet

Spring Boot'ta e-posta gönderimini öğrendik: spring-boot-starter-mail + JavaMailSender yapılandırması, basit metin (SimpleMailMessage), HTML/ek (MimeMessageHelper) ve Thymeleaf şablonlu e-posta; asenkron gönderim, sır yönetimi ve e-posta servisleri (SES/SendGrid) gibi üretim pratikleri. Sırada, dağıtık sistemlerde dayanıklılık: devre kesici (Resilience4j / Hystrix).