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
:
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.
- Tutorial em vídeo sobre como enviar e-mails com Spring Email .