Disclaimer
この記事は、初心者やJavaアプリケーションからの電子メールの操作方法を段階的に理解したい人を対象としています。Springアプリケーションからメールを送信する方法をすばやく理解したい場合は、パート3にスキップできます。
この記事を書くことにしたのは、Javaからの電子メールの操作に関するロシア語のソースが見つからず、利用可能なライブラリについて十分に説明しているためです。 Habréには、手紙を読む(そしてその内容をコンソールに表示する)という非常に狭いタスクに焦点を当てた記事と、 SpringEmail
を使用して添付ファイル付きの手紙を送信する方法についての記事があります
。
電子メールの操作手順を導くテーマ別リソースに関する記事もいくつかあります(たとえば)
。これらの情報源に欠けていたのは、
電子メールの基本の説明と、既存のJava電子メールライブラリの空中写真でした。
私のような同じ足のようなもののために、この記事は書かれました。メールの仕組みの概要を説明し、Jakarta Mailライブラリの基本を説明し、Springアプリケーションでメールを操作する方法についてアドバイスを提供します。
コンテンツ:
- Eメール
- JakartaMailでの電子メールの操作
- 春のメールの操作
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:
INLINEATTACHMENT.
, , , .
MIME- :
text/plainapplication/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.
- SpringEmailでメールを送信する方法に関するビデオチュートリアル。