Panduan untuk E-mel Spring

1. Gambaran keseluruhan

Dalam artikel ini, kita akan melalui langkah-langkah yang diperlukan untuk mengirim e-mel dari kedua aplikasi Spring vanilla biasa dan juga dari aplikasi Spring Boot, yang pertama menggunakan perpustakaan JavaMail dan yang terakhir menggunakan pergantungan spring-boot-starter-mail. .

2. Pergantungan Maven

Pertama, kita perlu menambahkan kebergantungan pada pom.xml kita .

2.1. Musim bunga

Untuk digunakan dalam kerangka musim bunga vanila biasa kami akan menambah:

 org.springframework spring-context-support 5.2.8.RELEASE 

Versi terbaru boleh didapati di sini.

2.2. Spring Boot

Dan untuk Spring Boot:

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

Versi terbaru boleh didapati di repositori Maven Central.

3. Sifat Pelayan Mel

Antaramuka dan kelas untuk sokongan surat Java dalam rangka Spring disusun seperti berikut:

  1. Antara muka MailSender : Antara muka peringkat teratas yang menyediakan fungsi asas untuk menghantar e-mel mudah
  2. JavaMailSender muka : yang subinterface di atas MailSender . Ia menyokong mesej MIME dan kebanyakannya digunakan bersama dengankelas MimeMessageHelper untuk penciptaan MimeMessage . Sebaiknya gunakanmekanisme MimeMessagePreparator dengan antara muka ini
  3. Kelas JavaMailSenderImpl : menyediakan pelaksanaanantara muka JavaMailSender . Ia menyokong MimeMessage dan SimpleMailMessage
  4. Kelas SimpleMailMessage : digunakan untuk membuat pesanan mel mudah termasuk bidang dari, ke, cc, subjek dan teks
  5. MimeMessagePreparator antaramuka : menyediakan antara muka panggilan balik untuk penyediaan mesej MIME
  6. Kelas MimeMessageHelper : kelas penolong untuk pembuatan mesej MIME. Ia menawarkan sokongan untuk gambar, lampiran mel biasa dan kandungan teks dalam susun atur HTML

Pada bahagian berikut, kami menunjukkan bagaimana antara muka dan kelas ini digunakan.

3.1. Hartanah Pelayan Spring Mail

Properti e- mel yang diperlukan untuk menentukan misalnya pelayan SMTP dapat ditentukan menggunakan JavaMailSenderImpl .

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

@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. Hartanah Pelayan Mel Spring Boot

Setelah kebergantungan berlaku, langkah seterusnya adalah menentukan sifat pelayan e-mel dalam fail application.properties menggunakan namespace spring.mail. * .

Sebagai contoh, sifat untuk Pelayan 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 pelayan SMTP memerlukan sambungan TLS, jadi properti spring.mail.properties.mail.smtp.starttls.enable digunakan untuk mengaktifkan sambungan yang dilindungi TLS.

3.2.1. Hartanah SMTP Gmail

Kami boleh menghantar e-mel melalui pelayan SMTP Gmail. Lihat dokumentasi untuk melihat sifat pelayan SMTP mel keluar Gmail.

Aplikasi kami. Fail sifat sudah dikonfigurasi untuk menggunakan SMTP Gmail (lihat bahagian sebelumnya).

Perhatikan bahawa kata laluan untuk akaun anda seharusnya bukan kata laluan biasa, tetapi kata laluan aplikasi yang dihasilkan untuk akaun google anda. Ikuti pautan ini untuk melihat perincian dan menghasilkan Kata Laluan Apl Google anda.

3.2.2. SES SMTP Properties

Untuk menghantar e-mel menggunakan Amazon SES Service, tetapkan aplikasi anda. Seperti yang kami lakukan di bawah:

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

Harap maklum bahawa Amazon menghendaki anda mengesahkan bukti kelayakan anda sebelum menggunakannya. Ikuti pautan untuk mengesahkan nama pengguna dan kata laluan anda.

4. Menghantar E-mel

Setelah pengurusan dan konfigurasi ketergantungan berlaku, kita dapat menggunakan JavaMailSender yang disebutkan di atas untuk mengirim e-mel.

Oleh kerana kedua-dua rangka musim bunga vanila biasa dan versi Bootnya mengendalikan penyusunan dan pengiriman e-mel dengan cara yang serupa, kita tidak perlu membezakan antara keduanya di bahagian bawah.

4.1. Menghantar E-mel Mudah

Mari kita buat dahulu dan hantar mesej e-mel mudah tanpa lampiran:

@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, walaupun tidak wajib memberikan alamat dari , banyak pelayan SMTP akan menolak mesej tersebut. Itulah sebabnya kami menggunakan alamat e-mel [dilindungi e-mel] dalam pelaksanaan EmailService kami .

4.2. Menghantar E-mel Dengan Lampiran

Kadang kala pesanan ringkas Spring tidak mencukupi untuk kes penggunaan kita.

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 "penghantaran gagal" untuk beberapa jangka masa. Ini tidak mudah dan jangka masa tidak ditentukan
  3. Sekiranya pelayan mel anda tidak memberikan maklum balas sama sekali, anda tidak dapat berbuat apa-apa

6. Kesimpulannya

Dalam artikel ringkas ini, kami menunjukkan cara mengatur dan mengirim e-mel dari aplikasi Spring Boot.

Pelaksanaan semua contoh dan coretan kod ini boleh didapati di GitHub.