Java實現郵件收發
阿新 • • 發佈:2020-07-17
一. 準備工作
1. 傳輸協議
SMTP協議-->傳送郵件:
我們通常把處理使用者smtp請求(郵件傳送請求)的伺服器稱之為SMTP伺服器(郵件傳送伺服器)
POP3協議-->接收郵件:
我們通常把處理使用者pop3請求(郵件接收請求)的伺服器稱之為POP3伺服器(郵件接收伺服器)
2. 郵件收發原理
- 閃電俠網易雲郵箱通過smtp協議連線到Smtp伺服器,然後傳送一封郵件給網易的郵件伺服器
- 網易分析發現需要去QQ的郵件伺服器,通過smtp協議將郵件轉投給QQ的Smtp伺服器
- QQ將接收到的郵件儲存在 [email protected]這個郵件賬號的空間中
- 閃電俠qq郵箱通過Pop3協議連線到Pop3伺服器收取郵件
- 從 [email protected]這個郵件賬號的空間中取出郵件
- Pop3伺服器將取出來的郵件送到閃電俠qq郵箱中
3. QQ郵箱中獲取對應的許可權
QQ郵箱需要安全驗證,我們需要獲取他對應的許可權;
QQ郵箱-->郵箱設定-->賬戶
4. 匯入jar包
mail.jar
activation.ja
二. Java傳送純文字郵件
編寫測試程式碼
public class SendMain {
public static void main(String[] args) throws GeneralSecurityException, MessagingException {
Properties prop = <span class="hljs-keyword">new</span> Properties();
<span class="hljs-comment">//設定QQ郵件伺服器</span>
prop.setProperty(<span class="hljs-string">"mail.host"</span>, <span class="hljs-string">"smtp.qq.com"</span>);
<span class="hljs-comment">//郵件傳送協議</span>
prop.setProperty(<span class="hljs-string">"mail.transport.protocol"</span>, <span class="hljs-string">"smtp"</span>);
<span class="hljs-comment">//需要驗證使用者名稱密碼</span>
prop.setProperty(<span class="hljs-string">"mail.smtp.auth"</span>, <span class="hljs-string">"true"</span>);
<span class="hljs-comment">//關於QQ郵箱,還要設定SSL加密,加上以下程式碼即可</span>
MailSSLSocketFactory sf = <span class="hljs-keyword">new</span> MailSSLSocketFactory();
sf.setTrustAllHosts(<span class="hljs-keyword">true</span>);
prop.put(<span class="hljs-string">"mail.smtp.ssl.enable"</span>, <span class="hljs-string">"true"</span>);
prop.put(<span class="hljs-string">"mail.smtp.ssl.socketFactory"</span>, sf);
<span class="hljs-comment">//使用JavaMail傳送郵件的5個步驟</span>
<span class="hljs-comment">//1.txt、建立定義整個應用程式所需的環境資訊的Session物件</span>
Session session = Session.getDefaultInstance(prop, <span class="hljs-keyword">new</span> Authenticator() {
<span class="hljs-function"><span class="hljs-keyword">public</span> PasswordAuthentication <span class="hljs-title">getPasswordAuthentication</span><span class="hljs-params">()</span> </span>{
<span class="hljs-comment">//發件人郵件使用者名稱、授權碼</span>
<span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> PasswordAuthentication(<span class="hljs-string">"[email protected]"</span>,
<span class="hljs-string">"授權碼"</span>);
}
});
<span class="hljs-comment">//開啟Session的debug模式,這樣就可以檢視到程式傳送Email的執行狀態</span>
session.setDebug(<span class="hljs-keyword">true</span>);
<span class="hljs-comment">//2、通過session得到transport物件</span>
Transport ts = session.getTransport();
<span class="hljs-comment">//3、使用郵箱的使用者名稱和授權碼連上郵件伺服器</span>
ts.connect(<span class="hljs-string">"smtp.qq.com"</span>, <span class="hljs-string">"[email protected]"</span>, <span class="hljs-string">"授權碼"</span>);
<span class="hljs-comment">//4,建立郵件</span>
<span class="hljs-comment">//4-1.txt,建立郵件物件</span>
MimeMessage message = <span class="hljs-keyword">new</span> MimeMessage(session);
<span class="hljs-comment">//4-2,指明郵件的發件人</span>
message.setFrom(<span class="hljs-keyword">new</span> InternetAddress(<span class="hljs-string">"[email protected]"</span>));
<span class="hljs-comment">//4-3,指明郵件的收件人</span>
message.setRecipient(Message.RecipientType.TO, <span class="hljs-keyword">new</span> InternetAddress(<span class="hljs-string">"[email protected]"</span>));
<span class="hljs-comment">//4-4,郵件標題</span>
message.setSubject(<span class="hljs-string">"Hello"</span>);
<span class="hljs-comment">//4-5,郵件文字內容</span>
message.setContent(<span class="hljs-string">"我是鋼鐵俠!"</span>, <span class="hljs-string">"text/html;charset=UTF-8"</span>);
<span class="hljs-comment">//4-6,傳送郵件</span>
ts.sendMessage(message, message.getAllRecipients());
<span class="hljs-comment">//5,關閉連線</span>
ts.close();
}
}
三. Java傳送建立包含內嵌圖片的郵件
1. 匯入圖片
2. 編寫測試程式碼
public class SendMainpicture1 {
public static void main(String[] args)throws GeneralSecurityException, MessagingException{
Properties prop = new Properties();
//設定QQ郵件伺服器
prop.setProperty("mail.host", "smtp.qq.com");
//郵件傳送協議
prop.setProperty("mail.transport.protocol", "smtp");
//需要驗證使用者名稱密碼
prop.setProperty("mail.smtp.auth", "true");
<span class="hljs-comment">//關於QQ郵箱,還要設定SSL加密,加上以下程式碼即可</span>
MailSSLSocketFactory sf = <span class="hljs-keyword">new</span> MailSSLSocketFactory();
sf.setTrustAllHosts(<span class="hljs-keyword">true</span>);
prop.put(<span class="hljs-string">"mail.smtp.ssl.enable"</span>, <span class="hljs-string">"true"</span>);
prop.put(<span class="hljs-string">"mail.smtp.ssl.socketFactory"</span>, sf);
<span class="hljs-comment">//使用JavaMail傳送郵件的5個步驟</span>
<span class="hljs-comment">//1.txt、建立定義整個應用程式所需的環境資訊的Session物件</span>
Session session = Session.getDefaultInstance(prop, <span class="hljs-keyword">new</span> Authenticator() {
<span class="hljs-function"><span class="hljs-keyword">public</span> PasswordAuthentication <span class="hljs-title">getPasswordAuthentication</span><span class="hljs-params">()</span> </span>{
<span class="hljs-comment">//發件人郵件使用者名稱、授權碼</span>
<span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> PasswordAuthentication(<span class="hljs-string">"[email protected]"</span>,
<span class="hljs-string">"授權碼"</span>);
}
});
<span class="hljs-comment">//開啟Session的debug模式,這樣就可以檢視到程式傳送Email的執行狀態</span>
session.setDebug(<span class="hljs-keyword">true</span>);
<span class="hljs-comment">//2、通過session得到transport物件</span>
Transport ts = session.getTransport();
<span class="hljs-comment">//3、使用郵箱的使用者名稱和授權碼連上郵件伺服器</span>
ts.connect(<span class="hljs-string">"smtp.qq.com"</span>, <span class="hljs-string">"[email protected]"</span>, <span class="hljs-string">"授權碼"</span>);
<span class="hljs-comment">//4,建立郵件</span>
<span class="hljs-comment">//4-1.txt,建立郵件物件</span>
MimeMessage message = <span class="hljs-keyword">new</span> MimeMessage(session);
<span class="hljs-comment">//4-2,指明郵件的發件人</span>
message.setFrom(<span class="hljs-keyword">new</span> InternetAddress(<span class="hljs-string">"[email protected]"</span>));
<span class="hljs-comment">//4-3,指明郵件的收件人</span>
message.setRecipient(Message.RecipientType.TO, <span class="hljs-keyword">new</span> InternetAddress(<span class="hljs-string">"[email protected]"</span>));
<span class="hljs-comment">//4-4,郵件標題</span>
message.setSubject(<span class="hljs-string">"Hello,鋼鐵俠"</span>);
<span class="hljs-comment">//5.準備圖片</span>
MimeBodyPart image = <span class="hljs-keyword">new</span> MimeBodyPart();
DataHandler dh = <span class="hljs-keyword">new</span> DataHandler(<span class="hljs-keyword">new</span> FileDataSource(<span class="hljs-string">"src/resources/9.jpg"</span>));
image.setDataHandler(dh);
image.setContentID(<span class="hljs-string">"9.jpg"</span>);
<span class="hljs-comment">//6.準備正文資料</span>
MimeBodyPart text = <span class="hljs-keyword">new</span> MimeBodyPart();
text.setContent(<span class="hljs-string">"這是一封郵件正文帶圖片<img src='cid:9.jpg'>的郵件"</span>, <span class="hljs-string">"text/html;charset=UTF-8"</span>);
<span class="hljs-comment">//7.描述資料關係</span>
MimeMultipart mm = <span class="hljs-keyword">new</span> MimeMultipart();
mm.addBodyPart(text);
mm.addBodyPart(image);
mm.setSubType(<span class="hljs-string">"related"</span>);
<span class="hljs-comment">//設定到訊息中,儲存修改</span>
message.setContent(mm);
message.saveChanges();
<span class="hljs-comment">//傳送郵件</span>
ts.sendMessage(message, message.getAllRecipients());
ts.close();
}
}
四. Java傳送帶圖片和附件的複雜郵件
1. 匯入附件和圖片
2. 編寫測試程式碼
public class SendMainpicture2 {
public static void main(String[] args) throws GeneralSecurityException, MessagingException {
Properties prop = new Properties();
//設定QQ郵件伺服器
prop.setProperty("mail.host", "smtp.qq.com");
//郵件傳送協議
prop.setProperty("mail.transport.protocol", "smtp");
//需要驗證使用者名稱密碼
prop.setProperty("mail.smtp.auth", "true");
<span class="hljs-comment">//關於QQ郵箱,還要設定SSL加密,加上以下程式碼即可</span>
MailSSLSocketFactory sf = <span class="hljs-keyword">new</span> MailSSLSocketFactory();
sf.setTrustAllHosts(<span class="hljs-keyword">true</span>);
prop.put(<span class="hljs-string">"mail.smtp.ssl.enable"</span>, <span class="hljs-string">"true"</span>);
prop.put(<span class="hljs-string">"mail.smtp.ssl.socketFactory"</span>, sf);
<span class="hljs-comment">//使用JavaMail傳送郵件的5個步驟</span>
<span class="hljs-comment">//1.txt、建立定義整個應用程式所需的環境資訊的Session物件</span>
Session session = Session.getDefaultInstance(prop, <span class="hljs-keyword">new</span> Authenticator() {
<span class="hljs-function"><span class="hljs-keyword">public</span> PasswordAuthentication <span class="hljs-title">getPasswordAuthentication</span><span class="hljs-params">()</span> </span>{
<span class="hljs-comment">//發件人郵件使用者名稱、授權碼</span>
<span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> PasswordAuthentication(<span class="hljs-string">"[email protected]"</span>,
<span class="hljs-string">"授權碼"</span>);
}
});
<span class="hljs-comment">//可以通過session開啟Dubug模式,檢視所有的過程</span>
session.setDebug(<span class="hljs-keyword">true</span>);
<span class="hljs-comment">//2.獲取連線物件,通過session物件獲得Transport,需要捕獲或者丟擲異常;</span>
Transport tp = session.getTransport();
<span class="hljs-comment">//3.連線伺服器,需要丟擲異常;</span>
tp.connect(<span class="hljs-string">"smtp.qq.com"</span>,<span class="hljs-string">"[email protected]"</span>,<span class="hljs-string">"授權碼"</span>);
<span class="hljs-comment">//4.連線上之後我們需要傳送郵件;</span>
MimeMessage mimeMessage = imageMail(session);
<span class="hljs-comment">//5.傳送郵件</span>
tp.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
<span class="hljs-comment">//6.關閉連線</span>
tp.close();
}
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> MimeMessage <span class="hljs-title">imageMail</span><span class="hljs-params">(Session session)</span> <span class="hljs-keyword">throws</span> MessagingException </span>{
<span class="hljs-comment">//訊息的固定資訊</span>
MimeMessage mimeMessage = <span class="hljs-keyword">new</span> MimeMessage(session);
<span class="hljs-comment">//郵件傳送人</span>
mimeMessage.setFrom(<span class="hljs-keyword">new</span> InternetAddress(<span class="hljs-string">"[email protected]"</span>));
<span class="hljs-comment">//郵件接收人,可以同時傳送給很多人</span>
mimeMessage.setRecipient(Message.RecipientType.TO, <span class="hljs-keyword">new</span> InternetAddress(<span class="hljs-string">"[email protected]"</span>));
mimeMessage.setSubject(<span class="hljs-string">"我也不知道是個什麼東西就發給你了"</span>); <span class="hljs-comment">//郵件主題</span>
<span class="hljs-comment">//圖片</span>
MimeBodyPart body1 = <span class="hljs-keyword">new</span> MimeBodyPart();
body1.setDataHandler(<span class="hljs-keyword">new</span> DataHandler(<span class="hljs-keyword">new</span> FileDataSource(<span class="hljs-string">"src/resources/9.jpg"</span>)));
body1.setContentID(<span class="hljs-string">"9.jpg"</span>); <span class="hljs-comment">//圖片設定ID</span>
<span class="hljs-comment">//文字</span>
MimeBodyPart body2 = <span class="hljs-keyword">new</span> MimeBodyPart();
body2.setContent(<span class="hljs-string">"請注意,我不是廣告<img src='cid:9.jpg'>"</span>,<span class="hljs-string">"text/html;charset=utf-8"</span>);
<span class="hljs-comment">//附件</span>
MimeBodyPart body3 = <span class="hljs-keyword">new</span> MimeBodyPart();
body3.setDataHandler(<span class="hljs-keyword">new</span> DataHandler(<span class="hljs-keyword">new</span> FileDataSource(<span class="hljs-string">"src/resources/log4j.properties"</span>)));
body3.setFileName(<span class="hljs-string">"log4j.properties"</span>); <span class="hljs-comment">//附件設定名字</span>
MimeBodyPart body4 = <span class="hljs-keyword">new</span> MimeBodyPart();
body4.setDataHandler(<span class="hljs-keyword">new</span> DataHandler(<span class="hljs-keyword">new</span> FileDataSource(<span class="hljs-string">"src/resources/1.txt"</span>)));
body4.setFileName(<span class="hljs-string">"1.txt"</span>); <span class="hljs-comment">//附件設定名字</span>
<span class="hljs-comment">//拼裝郵件正文內容</span>
MimeMultipart multipart1 = <span class="hljs-keyword">new</span> MimeMultipart();
multipart1.addBodyPart(body1);
multipart1.addBodyPart(body2);
multipart1.setSubType(<span class="hljs-string">"related"</span>); <span class="hljs-comment">//1.txt.文字和圖片內嵌成功!</span>
<span class="hljs-comment">//new MimeBodyPart().setContent(multipart1); //將拼裝好的正文內容設定為主體</span>
MimeBodyPart contentText = <span class="hljs-keyword">new</span> MimeBodyPart();
contentText.setContent(multipart1);
<span class="hljs-comment">//拼接附件</span>
MimeMultipart allFile =<span class="hljs-keyword">new</span> MimeMultipart();
allFile.addBodyPart(body3); <span class="hljs-comment">//附件</span>
allFile.addBodyPart(body4); <span class="hljs-comment">//附件</span>
allFile.addBodyPart(contentText);<span class="hljs-comment">//正文</span>
allFile.setSubType(<span class="hljs-string">"mixed"</span>); <span class="hljs-comment">//正文和附件都存在郵件中,所有型別設定為mixed;</span>
<span class="hljs-comment">//放到Message訊息中</span>
mimeMessage.setContent(allFile);
mimeMessage.saveChanges();<span class="hljs-comment">//儲存修改</span>
<span class="hljs-keyword">return</span> mimeMessage;
}
}