Disclaimer
L'article est écrit pour les débutants et ceux qui souhaitent comprendre étape par étape comment travailler avec des e-mails à partir d'applications Java est organisé. Ceux qui souhaitent comprendre rapidement comment envoyer des e-mails à partir d'applications Spring peuvent passer à la partie 3.
J'ai décidé d'écrire cet article parce que je n'ai pas trouvé de sources en russe sur le travail avec le courrier électronique de Java, décrivant assez complètement les bibliothèques disponibles. Sur Habré, il y a un article consacré à une tâche très étroite de lecture des lettres (et d'afficher leur contenu sur la console) et un article avec comment envoyer une
lettre avec des pièces jointes à l'aide de Spring Email. Il existe également plusieurs articles ( par exemple ) sur les ressources thématiques qui dirigent la procédure de travail
avec le courrier électronique. Ce qui me manquait dans ces sources, c'était une explication des principes fondamentaux du
courrier électronique et une vue aérienne des bibliothèques de courrier électronique Java existantes.
Pour les mêmes pattes comme moi, cet article a été écrit. Il fournit un aperçu du fonctionnement du courrier électronique, explique les bases de la bibliothèque Jakarta Mail et donne des conseils sur la façon de travailler avec le courrier électronique dans les applications Spring.
Contenu:
- Utilisation du courrier électronique avec Jakarta Mail
- Travailler avec le courrier électronique au printemps
1. Courriel
Aujourd'hui, l'e-mail semble être une technologie obsolète qui n'est nécessaire que pour s'inscrire sur des sites où ils ont oublié de joindre une autorisation en utilisant un compte Google, Vk ou Facebook. C'est peut-être le cas, mais vous recevez probablement toujours des e-mails de panne de compilation de votre outil CI ou des notifications de demande de retrait de votre référentiel vers votre boîte de réception.
. , , .. -. , , , : ., 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.
- Tutoriel vidéo sur l'envoi d'e-mails avec Spring Email .