Panduan untuk Spring Email

1. Ikhtisar

Dalam artikel ini, kami akan memandu langkah-langkah yang diperlukan untuk mengirim email dari aplikasi Spring vanilla biasa serta dari aplikasi Spring Boot, yang pertama menggunakan pustaka JavaMail dan yang terakhir menggunakan dependensi spring-boot-starter-mail .

2. Ketergantungan Maven

Pertama, kita perlu menambahkan dependensi ke pom.xml kita .

2.1. Musim semi

Untuk digunakan dalam kerangka pegas vanilla biasa kami akan menambahkan:

 org.springframework spring-context-support 5.2.8.RELEASE 

Versi terbaru dapat ditemukan di sini.

2.2. Sepatu Musim Semi

Dan untuk Spring Boot:

 org.springframework.boot spring-boot-starter-mail 2.2.5.RELEASE 

Versi terbaru tersedia di repositori Maven Central.

3. Properti Server Email

Antarmuka dan kelas untuk dukungan email Java dalam framework Spring diatur sebagai berikut:

  1. Antarmuka MailSender : Antarmuka tingkat atas yang menyediakan fungsionalitas dasar untuk mengirim email sederhana
  2. Antarmuka JavaMailSender : subinterface dari MailSender di atas. Ini mendukung pesan MIME dan sebagian besar digunakan bersama dengankelas MimeMessageHelper untuk pembuatan MimeMessage . Dianjurkan untuk menggunakanmekanisme MimeMessagePreparator dengan antarmuka ini
  3. Kelas JavaMailSenderImpl : menyediakan implementasiantarmuka JavaMailSender . Ini mendukung MimeMessage dan SimpleMailMessage
  4. Kelas SimpleMailMessage : digunakan untuk membuat pesan email sederhana termasuk bidang dari, kepada, cc, subjek, dan teks
  5. Antarmuka MimeMessagePreparator : menyediakan antarmuka callback untuk persiapan pesan MIME
  6. Kelas MimeMessageHelper : kelas pembantu untuk pembuatan pesan MIME. Ini menawarkan dukungan untuk gambar, lampiran surat biasa dan konten teks dalam tata letak HTML

Di bagian berikut, kami menunjukkan bagaimana antarmuka dan kelas ini digunakan.

3.1. Properti Spring Mail Server

Properti email yang diperlukan untuk menentukan, misalnya server SMTP dapat ditentukan menggunakan JavaMailSenderImpl .

Misalnya, untuk Gmail ini dapat dikonfigurasi seperti yang ditunjukkan di bawah ini:

@Bean public JavaMailSender getJavaMailSender() { JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); mailSender.setHost("smtp.gmail.com"); mailSender.setPort(587); mailSender.setUsername("[email protected]"); mailSender.setPassword("password"); Properties props = mailSender.getJavaMailProperties(); props.put("mail.transport.protocol", "smtp"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.debug", "true"); return mailSender; } 

3.2. Properti Server Email Spring Boot

Setelah ketergantungan diterapkan, langkah selanjutnya adalah menentukan properti server email di file application.properties menggunakan namespace spring.mail. * .

Misalnya, properti untuk Server SMTP Gmail dapat ditentukan sebagai:

spring.mail.host=smtp.gmail.com spring.mail.port=587 spring.mail.username= spring.mail.password= spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true 

Beberapa server SMTP memerlukan koneksi TLS, jadi properti spring.mail.properties.mail.smtp.starttls.enable digunakan untuk mengaktifkan koneksi yang dilindungi TLS.

3.2.1. Properti SMTP Gmail

Kami dapat mengirim email melalui server SMTP Gmail. Baca dokumentasi untuk melihat properti server SMTP email keluar Gmail.

File application.the kami telah dikonfigurasi untuk menggunakan Gmail SMTP (lihat bagian sebelumnya).

Perhatikan bahwa kata sandi untuk akun Anda tidak boleh berupa kata sandi biasa, tetapi kata sandi aplikasi yang dibuat untuk akun Google Anda. Ikuti tautan ini untuk melihat detail dan untuk membuat Kata Sandi Google App Anda.

3.2.2. Properti SES SMTP

Untuk mengirim email menggunakan Amazon SES Service, setel properti aplikasi Anda seperti yang kami lakukan di bawah ini:

spring.mail.host=email-smtp.us-west-2.amazonaws.com spring.mail.username=username spring.mail.password=password spring.mail.properties.mail.transport.protocol=smtp spring.mail.properties.mail.smtp.port=25 spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smtp.starttls.required=true

Perlu diketahui bahwa Amazon meminta Anda untuk memverifikasi kredensial Anda sebelum menggunakannya. Ikuti tautan untuk memverifikasi nama pengguna dan kata sandi Anda.

4. Mengirim Email

Setelah manajemen dependensi dan konfigurasi diterapkan, kita dapat menggunakan JavaMailSender yang disebutkan di atas untuk mengirim email.

Karena framework Spring vanilla biasa serta versi Boot menangani penulisan dan pengiriman email dengan cara yang sama, kita tidak perlu membedakan keduanya pada subbagian di bawah ini.

4.1. Mengirim Email Sederhana

Mari pertama-tama buat dan kirim pesan email sederhana tanpa lampiran apa pun:

@Component public class EmailServiceImpl implements EmailService { @Autowired private JavaMailSender emailSender; public void sendSimpleMessage( String to, String subject, String text) { ... SimpleMailMessage message = new SimpleMailMessage(); message.setFrom("[email protected]"); message.setTo(to); message.setSubject(subject); message.setText(text); emailSender.send(message); ... } }

Perhatikan, bahwa meskipun tidak wajib memberikan alamat from , banyak server SMTP akan menolak pesan tersebut. Itulah mengapa kami menggunakan alamat email [email dilindungi] dalam implementasi Layanan Email kami .

4.2. Mengirim Email Dengan Lampiran

Terkadang perpesanan sederhana Spring tidak cukup untuk kasus penggunaan kami.

For example, we want to send an order confirmation email with an invoice attached. In this case, we should use a MIME multipart message from JavaMail library instead of SimpleMailMessage. Spring supports JavaMail messaging with the org.springframework.mail.javamail.MimeMessageHelper class.

First of all, we'll add a method to the EmailServiceImpl to send emails with attachments:

@Override public void sendMessageWithAttachment( String to, String subject, String text, String pathToAttachment) { // ... MimeMessage message = emailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom("[email protected]"); helper.setTo(to); helper.setSubject(subject); helper.setText(text); FileSystemResource file = new FileSystemResource(new File(pathToAttachment)); helper.addAttachment("Invoice", file); emailSender.send(message); // ... }

4.3. Simple Email Template

SimpleMailMessage class supports text formatting. We can create a template for emails by defining a template bean in our configuration:

@Bean public SimpleMailMessage templateSimpleMessage() { SimpleMailMessage message = new SimpleMailMessage(); message.setText( "This is the test email template for your email:\n%s\n"); return message; }

Now we can use this bean as a template for email and only need to provide the necessary parameters to the template:

@Autowired public SimpleMailMessage template; ... String text = String.format(template.getText(), templateArgs); sendSimpleMessage(to, subject, text);

5. Handling Send Errors

JavaMail provides SendFailedException to handle situations when a message cannot be sent. But it is possible that you won't get this exception while sending an email to the incorrect address. The reason is the following:

The protocol specs for SMTP in RFC 821 specifies the 550 return code that SMTP server should return when attempting to send an email to the incorrect address. But most of the public SMTP servers don't do this. Instead, they send a “delivery failed” email to your box, or give no feedback at all.

For example, Gmail SMTP server sends a “delivery failed” message. And you get no exceptions in your program.

So, there are few options you can go through to handle this case:

  1. Catch the SendFailedException, which can never be thrown
  2. Periksa kotak surat pengirim Anda pada pesan "pengiriman gagal" untuk beberapa periode waktu. Ini tidak mudah dan jangka waktunya tidak ditentukan
  3. Jika server email Anda tidak memberikan umpan balik sama sekali, Anda tidak dapat melakukan apa pun

6. Kesimpulan

Dalam artikel singkat ini, kami menunjukkan cara mengatur dan mengirim email dari aplikasi Spring Boot.

Penerapan semua contoh dan cuplikan kode ini dapat ditemukan di GitHub.