Hướng dẫn về Email Mùa xuân

1. Khái quát chung

Trong bài viết này, chúng tôi sẽ giới thiệu cho các bạn các bước cần thiết để gửi email từ cả ứng dụng Spring vani đơn giản cũng như từ ứng dụng Spring Boot, ứng dụng trước sử dụng thư viện JavaMail và ứng dụng sau sử dụng sự phụ thuộc spring-boot-starter-mail .

2. Sự phụ thuộc của Maven

Đầu tiên, chúng ta cần thêm các phụ thuộc vào pom.xml của mình .

2.1. Mùa xuân

Để sử dụng trong khung mùa xuân vani đơn giản, chúng tôi sẽ thêm:

 org.springframework spring-context-support 5.2.8.RELEASE 

Phiên bản mới nhất có thể được tìm thấy ở đây.

2.2. Khởi động mùa xuân

Và đối với Spring Boot:

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

Phiên bản mới nhất hiện có trong kho Maven Central.

3. Thuộc tính Máy chủ Thư

Các giao diện và lớp hỗ trợ thư Java trong khuôn khổ Spring được tổ chức như sau:

  1. Giao diện MailSender : Giao diện cấp cao nhất cung cấp chức năng cơ bản để gửi các email đơn giản
  2. Giao diện JavaMailSender : giao diện con của MailSender ở trên. Nó hỗ trợ các tin nhắn MIME và chủ yếu được sử dụng cùng vớilớp MimeMessageHelper để tạo MimeMessage . Bạn nên sử dụngcơ chế MimeMessagePreparator với giao diện này
  3. Lớp JavaMailSenderImpl : cung cấp việc triển khaigiao diện JavaMailSender . Nó hỗ trợ MimeMessage SimpleMailMessage
  4. Lớp SimpleMailMessage : được sử dụng để tạo một thư đơn giản bao gồm các trường từ, đến, cc, chủ đề và văn bản
  5. Giao diện MimeMessagePreparator : cung cấp giao diện gọi lại để chuẩn bị các tin nhắn MIME
  6. Lớp MimeMessageHelper : lớp người trợ giúp để tạo các tin nhắn MIME. Nó cung cấp hỗ trợ cho hình ảnh, tệp đính kèm thư điển hình và nội dung văn bản trong bố cục HTML

Trong các phần tiếp theo, chúng tôi trình bày cách sử dụng các giao diện và lớp này.

3.1. Thuộc tính máy chủ thư mùa xuân

Thuộc tính thư cần thiết để chỉ định, ví dụ: máy chủ SMTP có thể được xác định bằng cách sử dụng JavaMailSenderImpl .

Ví dụ: đối với Gmail, điều này có thể được định cấu hình như hình dưới đây:

@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. Thuộc tính máy chủ thư khởi động mùa xuân

Khi phần phụ thuộc đã có, bước tiếp theo là chỉ định các thuộc tính máy chủ thư trong tệp application.properties bằng cách sử dụng không gian tên spring.mail. * .

Ví dụ: các thuộc tính cho Máy chủ SMTP của Gmail có thể được chỉ định là:

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 

Một số máy chủ SMTP yêu cầu kết nối TLS, do đó, thuộc tính spring.mail.properties.mail.smtp.starttls.enable được sử dụng để kích hoạt kết nối được bảo vệ bằng TLS.

3.2.1. Thuộc tính SMTP của Gmail

Chúng tôi có thể gửi email qua máy chủ SMTP của Gmail. Hãy xem tài liệu để xem các thuộc tính máy chủ SMTP thư đi của Gmail.

Tệp ứng dụng.tệp thuộc tính của chúng tôi đã được định cấu hình để sử dụng Gmail SMTP (xem phần trước).

Lưu ý rằng mật khẩu cho tài khoản của bạn không phải là mật khẩu thông thường, mà là mật khẩu ứng dụng được tạo cho tài khoản google của bạn. Nhấp vào liên kết này để xem chi tiết và tạo Mật khẩu ứng dụng Google của bạn.

3.2.2. Thuộc tính SMTP của SES

Để gửi email bằng Dịch vụ Amazon SES, hãy đặt application.properties của bạn như chúng tôi làm bên dưới:

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

Xin lưu ý rằng Amazon yêu cầu bạn xác minh thông tin đăng nhập của mình trước khi sử dụng chúng. Theo liên kết để xác minh tên người dùng và mật khẩu của bạn.

4. Gửi Email

Khi quản lý phụ thuộc và cấu hình đã sẵn sàng, chúng ta có thể sử dụng JavaMailSender nói trên để gửi email.

Vì cả framework vanilla Spring đơn giản cũng như phiên bản Boot của nó đều xử lý việc soạn và gửi e-mail theo cách giống nhau, chúng ta sẽ không phải phân biệt giữa hai loại trong phần phụ bên dưới.

4.1. Gửi email đơn giản

Trước tiên, hãy soạn và gửi một email đơn giản mà không có bất kỳ tệp đính kèm nào:

@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); ... } }

Lưu ý rằng mặc dù không bắt buộc phải cung cấp địa chỉ từ , nhiều máy chủ SMTP sẽ từ chối các thông báo như vậy. Đó là lý do tại sao chúng tôi sử dụng địa chỉ e-mail [email được bảo vệ] trong triển khai EmailService của mình .

4.2. Gửi email có tệp đính kèm

Đôi khi thông điệp đơn giản của Spring không đủ cho các trường hợp sử dụng của chúng tôi.

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. Kiểm tra hộp thư người gửi của bạn về thông báo "gửi không thành công" trong một khoảng thời gian. Điều này không đơn giản và khoảng thời gian không được xác định
  3. Nếu máy chủ thư của bạn không đưa ra phản hồi nào, bạn không thể làm gì

6. Kết luận

Trong bài viết nhanh này, chúng tôi đã hướng dẫn cách thiết lập và gửi email từ ứng dụng Spring Boot.

Bạn có thể tìm thấy việc triển khai tất cả các ví dụ và đoạn mã này trên GitHub.