电子邮件并在Java应用程序中使用它

Disclaimer

本文是专为初学者以及想逐步了解如何处理来自Java应用程序的电子邮件的读者而写的。那些希望快速了解如何从Spring应用程序发送电子邮件的人可以跳到第3部分。



我之所以决定写这篇文章,是因为我没有找到有关使用Java电子邮件的俄语语言资源,没有充分描述可用的库。在Habré上,有一篇文章专门讨论阅读信件(并将其内容显示在控制台上)的非常狭窄的任务,以及一篇有关如何

使用Spring Email发送带有附件信件的方法的文章。另外,还有几篇有关主题资源的文章(例如)引导着

使用电子邮件的过程。我在这些资料中缺少的是对

电子邮件基础知识的解释以及对现有Java电子邮件库的鸟瞰图。



对于像我一样的爪子一样的人,是写这篇文章的。它概述了电子邮件的工作原理,解释了Jakarta Mail库的基本概念,并提供了有关如何在Spring应用程序中使用电子邮件的提示。



内容:



  1. 电子邮件
  2. 使用Jakarta Mail处理电子邮件
  3. 在春季使用电子邮件





1.电子邮件



如今,电子邮件似乎已经过时了,只需要在忘记使用Google,Vk或Facebook帐户附加授权的网站上进行注册,就可以使用电子邮件。可能是,但您可能仍会从CI工具中收到构建投递电子邮件,或将请求通知从存储库中拉至收件箱。



. , , .. -. , , , : ., Gmail .



: Postfix, Sendmail, Apache James, Zimbra.



Outlook The Bat!, - Gmail ..



, . "". SMTP . SMTP. , POP3 IMAP. POP3 . IMAP ,

.



电子邮件转换





:



  • — , , .
  • — , html, , .


ASCII, , html-, , . , MIME- — -.



SMTP. POP3, IMAP.



, — .





OSI TCP.

, SSL.



SMTP



Simple Mail Transfer Protocol — . .



SMTP 25 587. SMTPS 465.



POP3



Post Office Protocol v3 — . . POP3 . , .



POP3 110. POP3S 995.



IMAP



Internet Message Access Protocol — . POP3. IMAP - ,

.



IMAP 143. IMAPS 993.



MIME-



Multipurpose Internet Mail Extensions — -. MIME , , , SMTP HTTP.



MIME , , HTTP.



, . — , — .



image/jpeg


MIME .

. multipart, .






2. Jakarta Mail



Jakarta Mail — / , , Java-. Jakarta EE. JavaMail, 2017 Jakarta.



Java EE, , . javax.mail. Reference Implementation — SMTP, POP3, IMAP. , , com.sun.mail. , Reference Implementation, .



, , Jakarta Mail JavaBeans Activation Framework — .



Jakarta Mail 1.6.5, 2.0.0, ""

javax.mail jakarta.mail.



Jakarta Mail . SMTP IMAP POP3 .





, . Jakarta Mail Transport Store .



-, Properties. SMTP- . :



mail.transport.protocol = smtps
mail.smtp.host = smtp.yandex.ru
mail.smtp.port = 465
mail.smtp.user = artem.boiar
mail.smtp.ssl.enable = true
mail.smtp.auth = true
mail.debug = true


.





Properties :



final Session session = Session.getInstance(mailProperties, authenticator);


. . - .





Authenticator, getPasswordAuthentication() ( null, — ).



— . PasswordAuthentication, DTO .



final Authenticator authenticator = new Authenticator() {
    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(
            this.getDefaultUserName(),
            PropUtils.getPassword()
        );
    }
}


, . Authenticator: IP , ,

.



, - , , :



  • Message — ;
  • BodyPart — : ;
  • Address — ;
  • Folder — , ;
  • SearchTerm — ;
  • MailEvent — , .

    .


— .





消息继承



Message, — MimeMessage ( ).



讯息方案



: , , , .,- : . BodyPart, Multipart. — .



. :



final Message message = new MimeMessage(session);


. , Message RecipientType, :



  • TO — ;
  • CC — ;
  • BCC — .


.



收件人类型



message.setFrom("artem.boiar@yandex.ru");
message.setRecipients(Message.RecipientType.TO, "joshua.bloch@google.com");
message.setRecipients(Message.RecipientType.CC, "tagir.valeev@jetbrains.com");
message.setRecipients(Message.RecipientType.BCC, "sergey.egorov@pivotal.com");
message.setSubject("Java 20 new hot features");




, . Flags:



  • ANSWERED
  • DELETED
  • DRAFT
  • FLAGGED
  • RECENT
  • SEEN
  • USER


setFlag(Flag, boolean set).





.



AddressInternetAddress ( NewsAddress , Usenet').



InternetAddress , :



trisha.gee@jetbrains.com


:



internetAddress.setPersonal(" ");


InternetAddress , :



InternetAddress[] recipients = InternetAddress.parse(
    "kuksenko@oracle.com, baruh@jfrog.com, golodnyj@yandex.ru");


— , , @Email, Bean Validation.





— , . , .



Jakarta Mail BodyPart MimeBodyPart.

disposition:



  • INLINE
  • ATTACHMENT .


, , , .



MIME- :



  • text/plain
  • application/octet-stream .


:



final MimeBodyPart mailBody = new MimeBodyPart();
final MimeBodyPart attachment = new MimeBodyPart();


UML- , , Part, , . . — - .





. setText(), — attachFile() setContent().



mailBody.setText("Java 20 new features.\nLook at the attachments.");
attachment.attachFile(file);


MIME- .







void saveFile(File)

void writeTo(OutputStream) .





BodyPart Multipart. MimeBodyPart MimeMultipart.



final Multipart multipart = new MimeMultipart();
for (BodyPart bodyPart: bodyParts) {
    //cannot use streams because of checked exception
    multipart.addBodyPart(bodyPart);
}


:



message.setContent(multipart);




. INBOX ( POP3 ).



. - : , — (, IMAP) , .



. . , , open(int mode) : READ_ONLYREAD_WRITE.



Folder folder = store.getDefaultFolder();
folder.open(Folder.READ_WRITE);


, .



getMessages(), :



Message[] messages = folder.getMessages();


, 1. .



IMAP

. , , fetch() Folder, .



, , DELETED.





Jakarta Mail . SearchTerm, : , , , . .



:



final FromTerm fromTerm = new FromTerm(new InternetAddress("artem.boiar@yandex.ru"));
final SubjectTerm subjectTerm = new SubjectTerm("Java");
final AndTerm termsSummary = new AndTerm(fromTerm, subjectTerm);
final Message[] foundMessages = folder.search(termsSummary);





3. Spring



Jakarta Mail Spring- Spring Email, API Jakarta Mail.

org.springframework.mail, spring-boot-starter-mail.



Java- , ( - ). Spring Email API .



— Spring Mail — .



春季电子邮件计划



Spring Email , . , send().



: MIME-. , MIME- html-, .





SimpleMailMessage. Jakarta Mail — Java.



final SimpleMailMessage simpleMail = new SimpleMailMessage();
simpleMail.setFrom("artem.boiar@yandex.ru");
simpleMail.setTo("yegor.bugaenko@huawei.com");
simpleMail.setSubject("Java 20 new hot features");
simpleMail.setText("Java 20 new hot features. No attachments :(");


MailSender.



this.mailSender.send(simpleMail);


MIME-



MIME- MimeMessage Jakarta Mail. , MIME- MimeMailMessage, SimpleMailMessage MailMessage.



MimeMessage - — MimeMessageHelper. ,

. : MIME- :



final MimeMessage mimeMessage = this.mailSender.createMimeMessage();
final MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true);

messageHelper.setFrom("artem.boiar@yandex.ru");
messageHelper.setTo("artyom.boyarshinov@cosysoft.ru");
messageHelper.setSubject("Java 20 new hot features");
messageHelper.setText("Java 20 new hot features. Look at the attachment.\nAlso look at my great cat!");
messageHelper.addInline("", FileUtils.getImage());
messageHelper.addAttachment("java-new-features.txt", FileUtils.getFile());


MimeMessageHelper BodyPart, Multipart, API.



MIME- JavaMailSender:



this.javaMailSender.send(mimeMessage);


Spring Email callback- MIME- — MimeMessagePreparator. Consumer, MimeMessage.



final MimeMessagePreparator preparator = mimeMessage -> {
    final MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true);

    messageHelper.setFrom("artem.boiar@yandex.ru");
    messageHelper.setTo("vlad.mihalcea@hibernate.com");
    messageHelper.setSubject("Java 20 new hot features");
    messageHelper.setText("Java 20 new hot features. Look at the attachment");
    messageHelper.addAttachment("java-new-features.txt", FileUtils.getFile());
};




Jakarta Mail, Spring Email .

runtime Jakarta Mail.



MailSendException. , , getFailedMessages():



catch (MailSendException exc) {
    Map<Object, Exception> exceptionsByMails = exc.getFailedMessages();
    //...
}


Spring Mail



Spring Email SMTP application.properties / application.yml -. , JavaMailSenderImpl .



spring:
  mail:
    protocol: smtps
    host: smtp.yandex.ru
    port: 465
    username: artem.boiar
    password: passw0rd







1



  • . , . . .
  • . .
  • . .


2



  • Jakarta Mail.
  • Github Jakarta Mail.
  • .
  • Eliote Rusty Harold. JavaMail API — 2013.


3






All Articles