Kirim email dengan lampiran oleh JavaMailSender dari SpringFramework

Ini adalah artikel "bagaimana" singkat tentang mengirim email dengan SpringFramework. Saya akan memberikan beberapa contoh dan saya akan menunjukkan masalah yang populer .

Ini adalah tugas yang mudah dapat diimplementasikan seperti ini:

public void send(String subject, String from, String to, File file) throws MessagingException { MimeMessage message = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setSubject(subject); helper.setFrom(from); helper.setTo(to); helper.setReplyTo(from); helper.setText("stub", false); helper.addAttachment("document.txt", file); javaMailSender.send(message); } 

Tetapi ini bukan situasi yang khas ketika aplikasi web bekerja dengan sistem file secara langsung. Mari kita perhatikan contoh ketika kita membuat dokumen dalam memori dan kita ingin melampirkannya ke email kita.

Ada beberapa metode di kelas MimeMessageHelper yang dapat membantu kami:

 public class MimeMessageHelper { ... public void addAttachment(String attachmentFilename, InputStreamSource inputStreamSource) { ... } public void addAttachment(String attachmentFilename, DataSource dataSource) throws MessagingException { ... } } 

Mari kita lihat beberapa contoh.

1. Lampiran adalah antarmuka InputStreamSource

Ini rumit, karena dalam hal ini pengembang bisa mendapatkan IllegalArgumentException dengan pesan:

" Sumber Daya Passed-in berisi aliran terbuka: argumen tidak valid. JavaMail membutuhkan InputStreamSource yang menciptakan aliran baru untuk setiap panggilan. "

Itu terjadi karena ada pemeriksaan khusus dalam metode MimeMessageHelper # addAttachment () :

 if (inputStreamSource instanceof Resource && ((Resource) inputStreamSource).isOpen()) { throw new IllegalArgumentException( "Passed-in Resource contains an open stream: invalid argument. " + "JavaMail requires an InputStreamSource that creates a fresh stream for every call."); } 

Sebagai contoh, implementasi InputStreamResource selalu mengembalikan true dari metode isOpen () yang membuat tidak mungkin untuk menggunakan implementasi ini sebagai lampiran:

  public class InputStreamResource extends AbstractResource { //... @Override public boolean isOpen() { return true; } //... } 

Contoh kerja adalah:

 public void send() { try { final ByteArrayOutputStream stream = createInMemoryDocument("test document text"); final InputStreamSource attachment = new ByteArrayResource(stream.toByteArray()); sendMimeMessageWithAttachments( "subject", "random@random.com", "random@random.com", attachment); } catch (IOException | MailException | MessagingException e) { logger.warn(e.getMessage(), e); } } private void sendMimeMessageWithAttachments(String subject, String from, String to, InputStreamSource source) throws MessagingException { MimeMessage message = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setSubject(subject); helper.setFrom(from); helper.setTo(to); helper.setReplyTo(from); helper.setText("stub", false); helper.addAttachment("document.txt", source); javaMailSender.send(message); } private ByteArrayOutputStream createInMemoryDocument(String documentBody) throws IOException { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); outputStream.write(documentBody.getBytes()); return outputStream; } 

2. Lampiran adalah antarmuka DataSource

Contoh ini tidak mengandung jebakan dan cukup jelas:

 public void send() { try { final ByteArrayOutputStream document = createInMemoryDocument("test document text"); final InputStream inputStream = new ByteArrayInputStream(document.toByteArray()); final DataSource attachment = new ByteArrayDataSource(inputStream, "application/octet-stream"); sendMimeMessageWithAttachments( "subject", "anonymous@xyz-mail.com", "anonymous@xyz-mail.com", attachment); } catch (IOException | MailException | MessagingException e) { logger.warn(e.getMessage(), e); } } private void sendMimeMessageWithAttachments(String subject, String from, String to, DataSource dataSource) throws MessagingException { MimeMessage message = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setSubject(subject); helper.setFrom(from); helper.setTo(to); helper.setReplyTo(from); helper.setText("stub", false); helper.addAttachment("document.txt", dataSource); javaMailSender.send(message); } 

Akan sangat membantu untuk melihat bab referensi musim semi .

Source: https://habr.com/ru/post/id439176/


All Articles