Disclaimer
本文是专为初学者以及想逐步了解如何处理来自Java应用程序的电子邮件的读者而写的。那些希望快速了解如何从Spring应用程序发送电子邮件的人可以跳到第3部分。
我之所以决定写这篇文章,是因为我没有找到有关使用Java电子邮件的俄语语言资源,没有充分描述可用的库。在Habré上,有一篇文章专门讨论阅读信件(并将其内容显示在控制台上)的非常狭窄的任务,以及一篇有关如何
使用Spring Email发送带有附件的信件的方法的文章。另外,还有几篇有关主题资源的文章(例如)引导着
使用电子邮件的过程。我在这些资料中缺少的是对
电子邮件基础知识的解释以及对现有Java电子邮件库的鸟瞰图。
对于像我一样的爪子一样的人,是写这篇文章的。它概述了电子邮件的工作原理,解释了Jakarta Mail库的基本概念,并提供了有关如何在Spring应用程序中使用电子邮件的提示。
内容:
- 电子邮件
- 使用Jakarta Mail处理电子邮件
- 在春季使用电子邮件
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)
.
.
Address
— InternetAddress
( 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_ONLY
— READ_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 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
- Spring Email.
- Spring Email Baeldung.
- 使用Spring Email发送电子邮件的视频教程。