Enviar correo electrĂłnico y trabajar con Ă©l en aplicaciones Java

Disclaimer

El artículo está escrito para principiantes y para aquellos que quieran comprender paso a paso cómo funciona el trabajo con correo electrónico desde aplicaciones Java. Aquellos que deseen comprender rápidamente cómo enviar correos electrónicos desde las aplicaciones Spring pueden pasar a la parte 3.



Decidí escribir este artículo porque no encontré fuentes en ruso sobre cómo trabajar con correo electrónico desde Java, describiendo las bibliotecas disponibles de manera bastante completa. En Habré hay un artículo dedicado a una tarea muy limitada de leer cartas (y mostrar su contenido en la consola) y un artículo sobre cómo enviar una

carta con archivos adjuntos utilizando Spring Email. También hay varios artículos ( por ejemplo ) sobre recursos temáticos que lideran el procedimiento para trabajar

con correo electrĂłnico. Lo que me faltaba en estas fuentes era una explicaciĂłn de los fundamentos del

correo electrónico y una vista aérea de las bibliotecas de correo electrónico Java existentes.



Para los mismos que tienen patas como yo, este artículo fue escrito. Proporciona una descripción general de cómo funciona el correo electrónico, explica los conceptos básicos de la biblioteca Jakarta Mail y ofrece consejos sobre cómo trabajar con el correo electrónico en las aplicaciones Spring.



Contenido:



  1. Correo electrĂłnico
  2. Trabajar con correo electrĂłnico con Jakarta Mail
  3. Trabajar con correo electrĂłnico en Spring





1. Correo electrĂłnico



Hoy en dĂ­a, el correo electrĂłnico parece ser una tecnologĂ­a obsoleta que solo se necesita para registrarse en sitios donde se olvidaron de adjuntar la autorizaciĂłn utilizando Google, Vk o cuenta de Facebook. Puede serlo, pero probablemente aĂşn reciba correos electrĂłnicos de bloqueo de compilaciĂłn de su herramienta de CI o extraiga notificaciones de solicitud de su repositorio a su buzĂłn.



. , , .. -. , , , : ., Gmail .



: Postfix, Sendmail, Apache James, Zimbra.



Outlook The Bat!, - Gmail ..



, . "". SMTP . SMTP. , POP3 IMAP. POP3 . IMAP ,

.



TransiciĂłn de correo electrĂłnico





:



  • — , , .
  • — , 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 — , .

    .


— .





Herencia de mensajes



Message, — MimeMessage ( ).



Esquema de mensajes



: , , , .,- : . BodyPart, Multipart. — .



. :



final Message message = new MimeMessage(session);


. , Message RecipientType, :



  • TO — ;
  • CC — ;
  • BCC — .


.



Tipos de destinatarios



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 Mail — .



Esquema de correo electrĂłnico de primavera



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






All Articles