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ışı
- Mesajı oluştur: Kimden, kime (bir veya çok alıcı, CC/BCC), konu, gövde (düz metin veya HTML), varsa ekler.
- 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
@Asyncveya 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ılabilir1// 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}