Eğitim Portalı/Java/E-posta Gönderme
Java01-java/95-eposta-gonderme

E-posta Gönderme

Birçok uygulama e-posta gönderir: kayıt onayı, parola sıfırlama, bildirim, fatura. Java'da bu, standart kütüphanede değil, Jakarta Mail (eski adıyla JavaMail) kütüphanesiyle yapılır; Spring kullanıyorsan JavaMailSende…

E-posta Gönderme

Birçok uygulama e-posta gönderir: kayıt onayı, parola sıfırlama, bildirim, fatura. Java'da bu, standart kütüphanede değil, Jakarta Mail (eski adıyla JavaMail) kütüphanesiyle yapılır; Spring kullanıyorsan JavaMailSender bunu daha da kolaylaştırır. Bu konu, e-posta gönderim akışını ve gerçek kodu ele alır.

Not: Gerçek e-posta gönderimi bir SMTP sunucusu (Gmail, kurumsal mail, SendGrid...) ve harici bir kütüphane gerektirir; portalda bunu çalıştıramayız. Bu yüzden örnek, akışı taklit eder; gerçek kod aşağıdadır.

E-posta gönderim akışı

  1. Mesajı oluştur: Kimden, kime (bir veya çok alıcı, CC/BCC), konu, gövde (düz metin veya HTML), varsa ekler.
  2. Bir göndericiyle ilet: Bir SMTP sunucusuna bağlan, kimlik doğrula, mesajı gönder.

Örnek 1 (./Ornek1.java) bu akışı sahte bir SMTP göndericisiyle simüle eder (düz metin, HTML, çok alıcı, hata durumu).

Gerçek kod 1: Jakarta Mail (saf Java)

// build.gradle: implementation 'org.eclipse.angus:angus-mail:2.0.x'  (Jakarta Mail uygulaması)
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "587");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");

Session session = Session.getInstance(props, new Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication("kullanici", "uygulama-parolasi");
    }
});

Message mesaj = new MimeMessage(session);
mesaj.setFrom(new InternetAddress("ben@site.com"));
mesaj.setRecipients(Message.RecipientType.TO, InternetAddress.parse("ada@site.com"));
mesaj.setSubject("Merhaba");
mesaj.setText("E-posta gövdesi");          // HTML için: setContent(html, "text/html; charset=utf-8")
Transport.send(mesaj);

Gerçek kod 2: Spring Boot (JavaMailSender)

Spring Boot, e-posta gönderimini çok kolaylaştırır:

# application.yml
spring:
  mail:
    host: smtp.gmail.com
    port: 587
    username: kullanici
    password: uygulama-parolasi
    properties.mail.smtp.starttls.enable: true
@Service
public class EpostaServisi {
    private final JavaMailSender sender;   // Spring otomatik sağlar
    public 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/ek için MimeMessageHelper kullan
    }
}

Önemli pratikler

  • Asenkron gönder: E-posta gönderimi yavaş ve hata-eğilimlidir; ana isteği bekletmemek için @Async veya bir mesaj kuyruğu (RabbitMQ/Kafka) ile arka planda gönder.
  • Uygulama parolası / API anahtarı: Gmail gibi sağlayıcılarda normal parola değil, uygulama parolası veya OAuth gerekir. Sırları koda gömme — ortam değişkeni/secret yöneticisi kullan.
  • Şablonlar: HTML e-postaları Thymeleaf/Freemarker şablonlarıyla üret.
  • Teslimat: Üretimde doğrudan SMTP yerine genelde e-posta servisleri (SendGrid, Amazon SES, Mailgun) kullanılır — teslimat oranı, spam yönetimi ve ölçeklenme için.

Özet

E-posta gönderim akışını (mesaj oluştur → SMTP ile ilet) simülasyonla (Örnek 1) ve gerçek kodu — hem saf Jakarta Mail hem Spring'in JavaMailSender'ı — öğrendik; asenkron gönderim, sır yönetimi ve e-posta servisleri gibi üretim pratiklerine değindik. Bu, standart kütüphane dışı ama çok yaygın bir ihtiyaçtır.

Kod Örnekleri(1)

Ornek1

çalıştırılabilir
Ornek1.java
1// Ornek1: E-posta gönderme — mesaj oluşturma ve gönderim akışı SİMÜLASYONU.
2// (Gerçek e-posta jakarta.mail kütüphanesi + SMTP sunucusu gerektirir; portalda modeli taklit ediyoruz.
3//  Gerçek kod README'de.)
4// Çalıştırma: java Ornek1.java
5import java.util.ArrayList;
6import java.util.List;
7
8public class Ornek1 {
9
10    // Gerçek MimeMessage'ın minik karşılığı:
11    record Eposta(String kimden, List<String> kime, String konu, String govde, boolean html) {}
12
13    // Gerçek Transport/JavaMailSender'ın yerine geçen sahte gönderici.
14    static class SahteSmtp {
15        private final List<Eposta> gonderilenler = new ArrayList<>();
16        void gonder(Eposta e) {
17            // Gerçekte: SMTP sunucusuna bağlan, kimlik doğrula, mesajı ilet.
18            if (e.kime().isEmpty()) throw new IllegalArgumentException("alıcı yok");
19            gonderilenler.add(e);
20            System.out.println("  [SMTP] gönderildi -> " + e.kime() + " | konu: " + e.konu()
21                    + " | " + (e.html() ? "HTML" : "düz metin"));
22        }
23        int gonderilenSayisi() { return gonderilenler.size(); }
24    }
25
26    public static void main(String[] args) {
27        SahteSmtp smtp = new SahteSmtp();
28
29        // 1) Basit düz metin e-posta
30        smtp.gonder(new Eposta("sistem@site.com", List.of("ada@site.com"),
31                "Hoş geldiniz", "Kaydınız tamamlandı.", false));
32
33        // 2) Birden çok alıcıya HTML e-posta
34        smtp.gonder(new Eposta("sistem@site.com", List.of("ada@site.com", "burak@site.com"),
35                "Haftalık bülten", "<h1>Yenilikler</h1><p>...</p>", true));
36
37        // 3) Hata: alıcısız
38        try {
39            smtp.gonder(new Eposta("x@site.com", List.of(), "boş", "...", false));
40        } catch (IllegalArgumentException ex) {
41            System.out.println("  hata: " + ex.getMessage());
42        }
43
44        System.out.println("\nToplam gönderilen: " + smtp.gonderilenSayisi());
45
46        System.out.println("""
47
48                --- E-posta gönderme (model) ---
49                Akış: mesajı oluştur (kimden/kime/konu/gövde) -> bir gönderici (SMTP) ile ilet.
50                Gerçekte bir SMTP sunucusuna (Gmail, kurumsal mail, SendGrid...) bağlanılır; kimlik doğrulanır.
51                Bu örnek o akışı taklit eder; gerçek kod jakarta.mail (JavaMail) veya Spring'in JavaMailSender'ıdır (README).
52                İpucu: e-posta gönderimi YAVAŞ ve hata-eğilimlidir; üretimde ASENKRON (@Async/kuyruk) yapılır.""");
53    }
54}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.