本教程將幫助您掌握使用本地Java庫通過SMTP通過Java應用程序發送電子郵件的過程。盡管它很簡單,但Jakarta Mail(以前稱為JavaMail)使您可以使用SMTP,POP3或IMAP協議發送和接收HTML電子郵件,包括圖像和附件。
從設置到生成郵件,再通過Gmail SMTP發送郵件,我們將進行整個過程。
如果您在2019年7月之前開始使用Java,那麼Jakarta Mail名稱聽起來可能有點陌生。但是從那時起,Java軟件已經成為Jakarta品牌的一部分。
要安裝郵件包,應將jakarta.mail.jar文件添加到CLASSPATH環境中。如果使用Java EE或Jakarta EE,則此文件已包含在軟件包中。否則,您可以從Jakarta Mail API官方頁面下載它。
另外,您可以使用Maven依賴項來實現它,如下所示:
<依賴項>
<依賴性>
<groupId> com.sun.mail </ groupId>
<artifactId> javax.mail </ artifactId>
<version> 1.6.2 </ version>
</ dependency>
</ dependencies>
您的Java應用程序可以與任何可用的SMTP服務器集成以發送電子郵件。在這裡,我們將演示如何配置Gmail(常用選項之一)。
您應該做的唯一技巧就是允許您的Gmail帳戶訪問。最簡單的方法是在此處啟用“允許安全性較低的應用程序” 選項。推薦的安全選項是使用oAuth2身份驗證。但是,這是一種更高級的方法,需要其他配置。首先,您需要從Google Developers Console獲取訪問令牌。有關詳細說明和說明,請參閱Google文檔。
然後,要通過Jakarta Mail訪問Gmail服務器,您需要滿足以下參數:
導入java.util。*;
導入javax.mail。*;
導入javax.mail.internet。*;
導入javax.activation。*;
在本文的後面,我們將介紹訪問Gmail SMTP的簡單方法。
要繼續,我們需要導入相關的類並添加屬性,尤其是:
§ SendEmail公共類,用於指定電子郵件頭
§ javax.mail.PasswordAuthentication類,用於正確的身份驗證
§ javax.mail.Transport用於發送消息
§ javax.mail.internet.MimeMessage
§ SMTP設置(主機,端口,用戶名和密碼),它們定義為props.put
§ message.setText用於簡單的純文本消息
這是完整的代碼示例:
包com.example.smtp;
導入java.util.Properties;
導入javax.mail.Message;
導入javax.mail.MessagingException;
導入javax.mail.PasswordAuthentication;
導入javax.mail.Session;
導入javax.mail.Transport;
導入javax.mail.internet.InternetAddress;
導入javax.mail.internet.MimeMessage;
公共類SendEmail {
公共靜態void main(String [] args){
// 添加收件人
字符串=“ test@example.com”;
//添加發件人
來自=“ myusername@gmail.com”的字符串;
final String用戶名=“ myusername@gmail.com”; //您的Gmail用戶名
最終的字符串密碼=“ mypassword”; //您的Gmail密碼
字符串主機=“ smtp.gmail.com”;
屬性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”);
//獲取會話對象
會話會話= Session.getInstance(props,
新的javax.mail.Authenticator(){
受保護的PasswordAuthentication getPasswordAuthentication(){
返回新的PasswordAuthentication(用戶名,密碼);
}
});
嘗試{
//創建一個默認的MimeMessage對象
消息消息=新的MimeMessage(會話);
message.setFrom(new InternetAddress(from));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(to));
//設置主題
message.setSubject(“ Hi JAXenter”);
//放入您的消息內容
message.setText(“嗨,我們隻是在這裡嘗試JavaMail”);
// 發信息
Transport.send(message);
System.out.println(“已成功發送消息。...”);
} catch(MessagingException e){
拋出新的RuntimeException(e);
}
}
}
在大多數情況下,電子郵件通知包含格式,文件附件或圖像。為此,您必須添加HTML內容。在Jakarta Mail中,您應該使用SendHTMLEmail類MimeMessage.setContent,並指出text / html類型。最好在MimeMultipart(“ alternative”)對象中同時包含HTML和純文本。
將圖像嵌入到電子郵件中的最簡單方法(例如,公司徽標)是將其上傳到可靠的外部服務器,並在HTML代碼中引用它,如下所示:
包com.example.smtp;包com.example.smtp;導入java.util.Properties;
導入javax.mail.Message;導入javax.mail.MessagingException;
導入javax.mail.PasswordAuthentication;導入javax.mail.Session;
導入javax.mail.Transport;導入javax.mail.internet.InternetAddress;
導入javax.mail.internet.MimeMessage;
公共類SendHTMLEmail {
公共靜態void main(String [] args){
字符串為=“ johndoe@gmail.com”;
字符串來自=“ yourmail@example.com”;
final String用戶名=“ yourlogin”;
final String password =“您的密碼”;
字符串主機=“ smtp.example.com”;
屬性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”);
//獲取會話對象
會話會話= Session.getInstance(props,
新的javax.mail.Authenticator(){
受保護的PasswordAuthentication getPasswordAuthentication(){
返回新的PasswordAuthentication(用戶名,密碼);
}
});
嘗試{
//創建一個默認的MimeMessage對象
消息消息=新的MimeMessage(會話);
message.setFrom(new InternetAddress(from));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(to));
message.setSubject(“帶有圖片和附件的HTML消息”);
//將HTML內容放在此處,並引用托管圖片
message.setContent(
“ <p> <img src =” http://yourserver.com/yourlogo.png“ alt =” img“ /> </ p> +
<p>嘿,您喜歡我們的徽標嗎?</ p>”,
“文本/ html”);
// 發信息
Transport.send(message);
System.out.println(“已成功發送消息。...”);
} catch(MessagingException e){
e.printStackTrace(); 拋出新的RuntimeException(e);
}
}
}
另一種方法是使用CID附件。這有點復雜,因為您應該創建MIME多部分/相關消息,然後引用HTML正文中的圖像。如果圖像不是存儲在圖像文件中,而是存儲在內存中的字節數組中,則也可以使用此方法。
Multipart multipart =新的MimeMultipart(“ related”);
MimeBodyPart htmlPart =新的MimeBodyPart();
//將圖片引用到HTML正文<img src =“ cid:some-image-cid” alt =“ img” />
htmlPart.setText(messageBody,“ utf-8”,“ html”);
multipart.addBodyPart(htmlPart);
MimeBodyPart imgPart =新的MimeBodyPart();
//用於存儲在文件中的圖像
imgPart.attachFile(imageFile);
//對於存儲在內存中的字節數組中的圖像
// imgPart.setDataHandler(new DataHandler(
// new ByteArrayDataSource(bytes,“ image / whatever”)));
imgPart.setContentID(“ <some-image-cid”>“);
multipart.addBodyPart(imgPart);
message.setContent(multipart);
最後,讓我們在郵件中附加一個文件。不管使用哪種文件類型,都可以通過如下方式將attachFile方法放入MimeBodyPart中來完成:
公共靜態無效setAttachment(消息消息,字符串文件名)拋出MessagingException {
//創建多部分消息
Multipart multipart = new MimeMultipart();
BodyPart messageBodyPart =新的MimeBodyPart();
//指定您的文件
DataSource源=新的FileDataSource(filename);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(filename);
//添加文件部分
multipart.addBodyPart(messageBodyPart);
message.setContent(multipart);
最後,開發這麼多年我也總結瞭一套學習Java的資料與面試題,如果你在技術上面想提升自己的話,可以關註我,私信發送領取資料或者在評論區留下自己的聯系方式,有時間記得幫我點下轉發讓跟多的人看到哦。
3188acc77aac7f48a8154e760329b376
(報告出品方/作者:開源證券,諸海濱,趙昊)1、公司情況:深耕智能終端產品,2021年營收上漲39%1.1、發展歷程:成立於2011...