البريد الإلكتروني والعمل معه في تطبيقات Java

Disclaimer

المقالة مكتوبة للمبتدئين وأولئك الذين يرغبون في فهم كيفية العمل مع البريد الإلكتروني من تطبيقات Java خطوة بخطوة. أولئك الذين يرغبون في فهم كيفية إرسال رسائل البريد الإلكتروني من تطبيقات Spring بسرعة يمكنهم التخطي إلى الجزء 3.



قررت أن أكتب هذا المقال لأنني لم أجد مصادر باللغة الروسية حول العمل بالبريد الإلكتروني من جافا ، ووصف المكتبات المتاحة بشكل كامل. يوجد في حبري مقال مخصص لمهمة ضيقة للغاية تتمثل في قراءة الرسائل (وعرض محتوياتها على وحدة التحكم) ومقال عن كيفية إرسال رسالة

مع مرفقات باستخدام Spring Email. هناك أيضًا العديد من المقالات ( على سبيل المثال ) حول الموارد الموضوعية التي تقود إجراءات العمل

مع البريد الإلكتروني. ما أفتقر إليه في هذه المصادر هو شرح أساسيات

البريد الإلكتروني ومنظور جوي على مكتبات البريد الإلكتروني الموجودة في Java.



لنفس المخالب مثلي ، تمت كتابة هذه المقالة. يوفر نظرة عامة حول كيفية عمل البريد الإلكتروني ، ويشرح أساسيات مكتبة بريد جاكرتا ، ويقدم نصائح حول كيفية العمل مع البريد الإلكتروني في تطبيقات Spring.



المحتوى:



  1. البريد الإلكتروني
  2. العمل مع البريد الإلكتروني مع جاكرتا ميل
  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