電子メールとJavaアプリケーションでの操作

Disclaimer

この記事は、初心者やJavaアプリケーションからの電子メールの操作方法を段階的に理解したい人を対象としています。Springアプリケーションからメールを送信する方法をすばやく理解したい場合は、パート3にスキップできます。



この記事を書くことにしたのは、Javaからの電子メールの操作に関するロシア語のソースが見つからず、利用可能なライブラリについて十分に説明しているためです。 Habréには手紙を読む(そしてその内容をコンソールに表示する)という非常に狭いタスクに焦点を当てた記事 SpringEmail を使用して添付ファイル付きの手紙を送信する方法についての記事があります

電子メールの操作手順を導くテーマ別リソースに関する記事もいくつかあります(たとえば

。これらの情報源に欠けていたのは、

電子メールの基本の説明と、既存のJava電子メールライブラリの空中写真でした。



私のような同じ足のようなもののために、この記事は書かれました。メールの仕組みの概要を説明し、Jakarta Mailライブラリの基本を説明し、Springアプリケーションでメールを操作する方法についてアドバイスを提供します。



コンテンツ:



  1. Eメール
  2. JakartaMailでの電子メールの操作
  3. 春のメールの操作





1.メール



今日、電子メールは時代遅れのテクノロジーのようです。これは、Google、Vk、またはFacebookアカウントを使用して認証を添付するのを忘れたサイトに登録するためにのみ必要です。可能性はありますが、CIツールからビルドドロップメールを受け取っているか、リポジトリから受信トレイにリクエスト通知をプルしている可能性があります。



. , , .. -. , , , : ., 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).





.



AddressInternetAddress ( 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_ONLYREAD_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 — .



春のメールスキーム



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