Disclaimer
O artigo foi escrito para iniciantes e aqueles que desejam entender passo a passo como funciona o e-mail de aplicativos Java. Aqueles que desejam entender rapidamente como enviar e-mails de aplicativos Spring podem pular para a parte 3.
Decidi escrever este artigo porque não encontrei fontes em russo sobre como trabalhar com e-mail de Java, descrevendo as bibliotecas disponíveis de forma completa. No Habré, há um artigo dedicado a uma tarefa muito restrita de ler cartas (e exibir seu conteúdo no console) e um artigo com instruções sobre como enviar uma
carta com anexos usando Spring Email. Existem também diversos artigos ( por exemplo ) sobre recursos temáticos que orientam o procedimento para trabalhar
com o e-mail. O que me faltava nessas fontes era uma explicação dos fundamentos do
e-mail e uma visão aérea das bibliotecas de e-mail Java existentes.
Para os mesmos parecidos com patas como eu, este artigo foi escrito. Ele fornece uma visão geral de como funciona o email, explica os conceitos básicos da biblioteca Jakarta Mail e dá dicas sobre como trabalhar com email em aplicativos Spring.
Conteúdo:
- O email
- Trabalhando com e-mail com Jakarta Mail
- Trabalho com e-mail na primavera
1. Email
Hoje, o e-mail parece uma tecnologia desatualizada que só é necessária para se cadastrar em sites onde eles se esqueceram de anexar autorização usando Google, Vk ou conta no Facebook. Pode ser, mas você provavelmente ainda receberá e-mails de falha de compilação de sua ferramenta de CI ou notificações de solicitação de pull de seu repositório para sua caixa de correio.
. , , .. -. , , , : ., 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.
- Tutorial em vídeo sobre como enviar e-mails com Spring Email .