E-Mail und Arbeiten damit in Java-Anwendungen

Disclaimer

Der Artikel richtet sich an AnfĂ€nger und diejenigen, die Schritt fĂŒr Schritt verstehen möchten, wie die Arbeit mit E-Mails aus Java-Anwendungen angeordnet ist. Wer schnell verstehen möchte, wie E-Mails von Spring-Anwendungen gesendet werden, kann mit Teil 3 fortfahren.



Ich habe mich entschlossen, diesen Artikel zu schreiben, weil ich keine russischsprachigen Quellen zum Arbeiten mit E-Mails aus Java gefunden habe, in denen die verfĂŒgbaren Bibliotheken vollstĂ€ndig beschrieben sind. Auf HabrĂ© gibt es einen Artikel, der sich mit einer sehr engen Aufgabe befasst, Briefe zu lesen (und deren Inhalt auf der Konsole anzuzeigen), und einen Artikel mit Anleitungen zum Senden eines

Briefes mit AnhÀngen mithilfe von Spring Email. Es gibt auch mehrere Artikel ( zum Beispiel ) zu thematischen Ressourcen, die die Reihenfolge der Aktionen bei der Arbeit

mit E-Mails angeben. Was mir in diesen Quellen fehlte, war eine ErklÀrung der Grundlagen von

E-Mail und eine Luftaufnahme der vorhandenen Java-E-Mail-Bibliotheken.



FĂŒr die gleichen pfotenĂ€hnlichen wie mich wurde dieser Artikel geschrieben. Es bietet einen Überblick ĂŒber die Funktionsweise von E-Mails, erklĂ€rt die Grundlagen der Jakarta Mail-Bibliothek und gibt Tipps zum Arbeiten mit E-Mails in Spring-Anwendungen.



Inhalt:



  1. E-Mail
  2. Arbeiten mit E-Mail mit Jakarta Mail
  3. Arbeiten mit E-Mail im FrĂŒhjahr





1. E-Mail



Heutzutage scheint E-Mail eine veraltete Technologie zu sein, die nur zur Registrierung auf Websites benötigt wird, auf denen vergessen wurde, eine Autorisierung ĂŒber ein Google-, Vk- oder Facebook-Konto anzuhĂ€ngen. Möglicherweise erhalten Sie jedoch weiterhin Absturz-E-Mails von Ihrem CI-Tool oder ziehen Anforderungsbenachrichtigungen aus Ihrem Repository in Ihr Postfach.



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



: Postfix, Sendmail, Apache James, Zimbra.



Outlook The Bat!, - Gmail ..



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

.



E-Mail-Übergang





:



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

    .


— .





Vererbung von Nachrichten



Message, — MimeMessage ( ).



Nachrichtenschema



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



. :



final Message message = new MimeMessage(session);


. , Message RecipientType, :



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


.



EmpfÀngertypen



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



FrĂŒhlings-E-Mail-Schema



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