發(fā)布于:2021-01-07 17:21:45
0
127
0
您是否知道您的Java應(yīng)用程序可以與任何可用的SMTP服務(wù)器集成以發(fā)送電子郵件?本教程介紹了如何通過Java應(yīng)用程序發(fā)送電子郵件,從設(shè)置到生成郵件,再到通過Gmail SMTP發(fā)送郵件。Jakarta Mail(以前稱為Java Mail)可以發(fā)送和接收HTML電子郵件,甚至帶有附件和圖像。
本教程將幫助您掌握使用本地Java庫通過SMTP從Java應(yīng)用程序發(fā)送電子郵件的過程。盡管它很簡單,但是Jakarta Mail(以前稱為JavaMail)使您可以使用SMTP,POP3或IMAP協(xié)議發(fā)送和接收HTML電子郵件,包括圖像和附件。
從設(shè)置到生成郵件,再通過Gmail SMTP發(fā)送郵件,我們將進(jìn)行整個過程。
雅加達(dá)郵件設(shè)置
如果您在2019年7月之前開始使用Java,那么Jakarta Mail名稱可能聽起來有點陌生。但是從那時起,Java軟件已成為Jakarta品牌的一部分。
要安裝郵件包,應(yīng)將jakarta.mail.jar文件添加到CLASSPATH環(huán)境中。如果使用Java EE或Jakarta EE,則此文件已包含在軟件包中。否則,您可以從Jakarta Mail API官方頁面下載它。
另外,您可以使用Maven依賴項來實現(xiàn)它,如下所示:
<dependencies> <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.6.2</version> </dependency> </dependencies>
如何使用Gmail配置電子郵件發(fā)送
您的Java應(yīng)用程序可以與任何可用的SMTP服務(wù)器集成以發(fā)送電子郵件。在這里,我們將演示如何配置Gmail(常用選項之一)。
您應(yīng)該做的唯一技巧就是允許您的Gmail帳戶訪問。最簡單的方法是在此處啟用“允許安全性較低的應(yīng)用程序”選項。推薦的安全選項是使用oAuth2身份驗證。但是,這是一種更高級的方法,需要其他配置。首先,您需要從Google Developers Console獲取訪問令牌。有關(guān)詳細(xì)說明和說明,請參閱Google文檔。
然后,要通過Jakarta Mail訪問Gmail服務(wù)器,您需要滿足以下參數(shù):
import java.util.*; import javax.mail.*; import javax.mail.internet.*; import javax.activation.*;
本文稍后將介紹訪問Gmail SMTP的簡單方法。
要繼續(xù),我們需要導(dǎo)入相關(guān)的類并添加屬性,尤其是:
SendEmail公共類,用于指定電子郵件頭
javax.mail.PasswordAuthentication類,用于正確的身份驗證
javax.mail.Transport用于發(fā)送消息
javax.mail.internet.MimeMessage
SMTP設(shè)置(主機,端口,用戶名和密碼),它們定義為props.put
message.setText用于簡單的純文本消息
這是完整的代碼示例:
package com.example.smtp; import java.util.Properties; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; public class SendEmail { public static void main(String[] args) { // Add recipient String to = "test@example.com"; // Add sender String from = "myusername@gmail.com"; final String username = "myusername@gmail.com";//your Gmail username final String password = "mypassword";//your Gmail password String host = "smtp.gmail.com"; Properties props = new Properties(); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.host", host); props.put("mail.smtp.port", "587"); // Get the Session object Session session = Session.getInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } }); try { // Create a default MimeMessage object Message message = new MimeMessage(session); message.setFrom(new InternetAddress(from)); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); // Set Subject message.setSubject("Hi JAXenter"); // Put the content of your message message.setText("Hi there,we are just experimenting with JavaMail here"); // Send message Transport.send(message); System.out.println("Sent message successfully...."); } catch (MessagingException e) { throw new RuntimeException(e); } } }
帶有圖片和附件的HTML電子郵件
在大多數(shù)情況下,電子郵件通知包含格式,文件附件或圖像。為此,您必須添加HTML內(nèi)容。在Jakarta Mail中,您應(yīng)該使用SendHTMLEmail類MimeMessage.setContent,并指出text / html類型。最好在MimeMultipart(“ alternative”)對象中同時包含HTML和純文本。
在電子郵件中嵌入圖像的最簡單方法(例如,公司徽標(biāo))是將其上傳到可靠的外部服務(wù)器,并在HTML代碼中引用它,如下所示:
package com.example.smtp;package com.example.smtp;import java.util.Properties; import javax.mail.Message;import javax.mail.MessagingException; import javax.mail.PasswordAuthentication;import javax.mail.Session; import javax.mail.Transport;import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; public class SendHTMLEmail { public static void main(String[ ] args) { String to = "johndoe@gmail.com"; String from = "yourmail@example.com"; final String username = "yourlogin"; final String password = "yourpassword"; String host = "smtp.example.com"; Properties props = new Properties(); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.host", host); props.put("mail.smtp.port", "2525"); // Get the Session object Session session = Session.getInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } }); try { // Create a default MimeMessage object Message message = new MimeMessage(session); message.setFrom(new InternetAddress(from)); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); message.setSubject("HTML message with an image and attachment"); // Put your HTML content here as well as refer to the hosted image message.setContent( "<p><img src="https://yourserver.com/yourlogo.png" alt="img" /></p> + <p>Hey, do you like our logo?</p>", "text/html"); // Send message Transport.send(message); System.out.println("Sent message successfully...."); } catch (MessagingException e) { e.printStackTrace(); throw new RuntimeException(e); } } }
另一種方法是使用CID附件。這有點復(fù)雜,因為您應(yīng)該創(chuàng)建MIME多部分/相關(guān)消息,然后引用HTML正文中的圖像。如果圖像不是存儲在圖像文件中,而是存儲在內(nèi)存中的字節(jié)數(shù)組中,則也可以使用此方法。
Multipart multipart = new MimeMultipart("related"); MimeBodyPart htmlPart = new MimeBodyPart(); //reference to your image to the HTML body <img src="cid:some-image-cid" alt="img" /> htmlPart.setText(messageBody, "utf-8", "html"); multipart.addBodyPart(htmlPart); MimeBodyPart imgPart = new MimeBodyPart(); // for the image stored in the file imgPart.attachFile(imageFile); //for the image stored in a byte array in memory // imgPart.setDataHandler(new DataHandler( // new ByteArrayDataSource(bytes, "image/whatever"))); imgPart.setContentID("<some-image-cid">"); multipart.addBodyPart(imgPart); message.setContent(multipart);
最后,讓我們在郵件中附加一個文件。不管使用哪種文件類型,都可以通過如下方式將attachFile方法放入MimeBodyPart中來完成:
public static void setAttachment(Message message, String filename) throws MessagingException { // create a multipart message Multipart multipart = new MimeMultipart(); BodyPart messageBodyPart = new MimeBodyPart(); // specify your file DataSource source = new FileDataSource(filename); messageBodyPart.setDataHandler(new DataHandler(source)); messageBodyPart.setFileName(filename); //Add the file part multipart.addBodyPart(messageBodyPart); message.setContent(multipart);
進(jìn)一步的步驟
在此簡短指南中,我們解釋了使用Jakarta Mail發(fā)送電子郵件的工作方式,并演示了最常見的示例。如果您想深入了解,我們建議您遵循Jakarta Mail FAQ。
如果您需要制作更復(fù)雜的HTML電子郵件模板,那么最好使用Spring框架和您更喜歡的模板引擎之一。