Email:電子郵件。
在當(dāng)今社會有著重要的應(yīng)用,傳統(tǒng)的郵件是通過郵局投遞,然后從一個郵局到另一個郵局,最終到達(dá)用戶的郵箱。
在電子郵件中也有著相似的發(fā)送過程:電子郵件是從用戶電腦的郵件軟件發(fā)送到郵件服務(wù)器上,經(jīng)過若干個郵件服務(wù)器的中轉(zhuǎn),最終到達(dá)對方郵件服務(wù)器上,收件方就可以用軟件接收郵件。
這樣的郵件軟件稱為MUA: Mail user Agent。即給用戶服務(wù)的郵件代理;
郵件服務(wù)器則稱為MTA : Mail Transfer Agent。即郵件中轉(zhuǎn)的代理;
最終到達(dá)的郵件服務(wù)器稱為MDA: Mail Delivery Agent。
發(fā)送方的郵件進(jìn)入MDA就被存放在MDA服務(wù)器的硬盤中,等待收信方使用郵件軟件查看。
準(zhǔn)備SMTP登錄信息
1.SMTP
????????SMTP的全稱是“Simple?Mail?Transfer?Protocol”,即簡單郵件傳輸協(xié)議。它是一組用于從源地址到目的地址傳輸郵件的準(zhǔn)備規(guī)范,通過它來控制郵件的中轉(zhuǎn)方式。SMTP協(xié)議屬于TCP/IP協(xié)議簇,它幫助每臺計算機(jī)在發(fā)送或中轉(zhuǎn)信件時找到下一個目的發(fā)送地。SMTP?服務(wù)器就是遵循SMTP協(xié)議的發(fā)送郵件服務(wù)器。SMTP認(rèn)證,簡單地說就是要求必須在提供了賬戶名和密碼之后才可以登錄SMTP服務(wù)器,這就使得那些垃圾郵件的散播者無可乘之機(jī)??稍黾覵MTP認(rèn)證的目的是為了使用戶避免受到垃圾郵件的侵?jǐn)_。
2.POP3
????????POP3是Post?Office?Protocol?3的簡稱,即郵局協(xié)議的第3個版本,它規(guī)定怎樣將個人計算機(jī)連接到Intenet的郵件服務(wù)器和下載電子郵件的電子協(xié)議。它是因特網(wǎng)電子郵件的第一個離線協(xié)議標(biāo)準(zhǔn),POP3允許用戶從服務(wù)器上把郵件存儲到本地主機(jī)(即自己的計算機(jī))上,同時刪除保存在郵件服務(wù)器上的郵件,而POP3服務(wù)器則是遵循POP3協(xié)議的接收郵件服務(wù)器,用來接收電子郵件的。
3.IMAP
????????IMAP全稱是Internet?Mail?Access?Protocol,即交互式郵件存取協(xié)議,它是跟POP3類似郵件訪問標(biāo)準(zhǔn)協(xié)議之一。不同的是,開啟了IMAP后,您在電子郵件客戶端收取的郵件仍然保留在服務(wù)器上,同時在客戶端上的操作都會反饋到服務(wù)器上,如:刪除郵件,標(biāo)記已讀等,服務(wù)器上的郵件也會做相應(yīng)的動作。所以無論從瀏覽器登錄郵箱或者客戶端軟件登錄郵箱,看到的郵件以及狀態(tài)都是一致的。
以網(wǎng)易163郵箱為例,在設(shè)置中開啟服務(wù)"POP3/SMTP/IMAP"二者任選其一;
因為要使用Java發(fā)送Email,則要選擇給予授權(quán)密碼,當(dāng)你不再使用時,可以點擊刪除按鈕,之后此密碼將會失效,不能再進(jìn)行登錄
做好準(zhǔn)備后,將JavaMail相關(guān)的依賴Jar包加入至項目
javax.mail-1.6.2.jar
?實現(xiàn)發(fā)送郵件
public class Demo01 {
public static void main(String[] args) throws MessagingException {
String userName="177*******@163.com";//登錄名
String password="Y*******FHNYQOVX";//登陸密碼
//smtp服務(wù)器
Properties pros=new Properties();
pros.put("mail.smtp.host", "smtp.163.com");//主機(jī)名
pros.put("mail.smtp.port", "25");//主機(jī)端口號
pros.put("mail.smtp.auth", "true");//是否需要用戶認(rèn)證
pros.put("mail.smtp.starttls.enable", "true");//啟用TLS加密
//創(chuàng)建會話
Session session=Session.getInstance(pros,new Authenticator(){
@Override
protected javax.mail.PasswordAuthentication getPasswordAuthentication(){
return new javax.mail.PasswordAuthentication(userName, password);
}
});
System.out.println(session);
//設(shè)置debug模式便于調(diào)試
session.setDebug(true);
MimeMessage message=new MimeMessage(session);
//郵件標(biāo)題
message.setSubject("HELLO!");
//郵件內(nèi)容(文本)
message.setText("你好","utf-8");
//設(shè)置發(fā)送方地址
message.setFrom(new InternetAddress("177********@163.com"));
//設(shè)置收件方地址
message.setRecipient(RecipientType.TO,new InternetAddress("11111111@qq.com"));
//發(fā)送
Transport.send(message);
}
}
?
運行代碼,發(fā)送郵件成功后,可以看出SMTP協(xié)議是一個請求-響應(yīng)協(xié)議,客戶端總是發(fā)送命令,然后等待服務(wù)器響應(yīng)。服務(wù)器響應(yīng)總是以數(shù)字開頭,后面的信息才是用于調(diào)試的文本。這些響應(yīng)碼已經(jīng)被定義在SMTP協(xié)議中了,查看具體的響應(yīng)碼就可以知道出錯原因。
發(fā)送帶有附件的郵件
想發(fā)送帶有附件的郵件,我們還要創(chuàng)建郵件內(nèi)容"復(fù)合"對象,Multipart類的MimeMultipart實現(xiàn)類,然后再創(chuàng)建BodyPart類的MimeBodyPart實現(xiàn)類,textPart用于存儲正文內(nèi)容,調(diào)用setContent()方法,參數(shù)1為正文內(nèi)容,參數(shù)2為內(nèi)容類型;字符編碼集。
Multipart multipart = new MimeMultipart();
// 添加text:
BodyPart textpart = new MimeBodyPart();
textpart.setContent(body,"text/html;charset=utf-8");
multipart.addBodyPart(textpart);
//添加image:
BodyPart Filepart = new MimeBodyPart();
Filepart.setFileName("xxx.jpg");
Filepart.setDataHandler(new DataHandler(new ByteArrayDataSource(文件輸入流,"application/octet-stream")));
multipart.addBodyPart(imagepart);
//設(shè)置郵件內(nèi)容為multipart:
message.setContent(multipart);
FilePart用于存儲附件,先調(diào)用setFileName()方法設(shè)置附件文件的顯示名稱(顯示名稱可以與圖片原名不一致),再調(diào)用setDataHandler(),其中添加一個DataHandler()方法,使用Files工具類的readAllBytes()方法,可以把文件讀取成字節(jié)數(shù)據(jù),二進(jìn)制文件可以用application/octet-stream,Word文檔則是application/msword。 最后,通過setContent()把Multipart添加到Message中,即可發(fā)送郵件。
如果我們需要抄送多個人一起發(fā)送時,可以選擇通過創(chuàng)建一個InternetAddress[]數(shù)組把多個抄送人存入。
message.setRecipients(RecipientType.CC, new InternetAddress[] {
new InternetAddress("*********"),
new InternetAddress("*********"),
new InternetAddress("*********"),
});
發(fā)送內(nèi)嵌圖片的HTML郵件?
郵件中加入<img src="xxxxx.jpg">,這樣的外部圖片鏈接通常會被郵件客戶端過濾,并提示用戶顯示圖片并不安全。只有內(nèi)嵌的圖片才能正常在郵件中顯示。
Multipart multipart = new MimeMultipart();
// 添加text:
BodyPart textpart = new MimeBodyPart();
textpart.setContent("<h1>Hello</h1><p><img src=\"cid:img01\"></p>", "text/html;charset=utf-8");
multipart.addBodyPart(textpart);
// 添加image:
BodyPart imagepart = new MimeBodyPart();
imagepart.setFileName("xxx.jpg");
imagepart.setDataHandler(new DataHandler(new ByteArrayDataSource(new FileInputStream("c:\\test\\xxx.jpg"), "application/octet-stream")));
multipart.addBodyPart(imagepart);
//設(shè)置當(dāng)前image為內(nèi)嵌圖片
//這個ID和HTML中引用的ID對應(yīng)起來,郵件客戶端就可以正常顯示內(nèi)嵌圖片
imagepart.setHeader("Content-ID","<img01>");
小結(jié)?
JavaMail API發(fā)送郵件本質(zhì)上是一個MUA軟件通過SMTP協(xié)議發(fā)送郵件至MTA服務(wù)器是一種依賴特定協(xié)議的服務(wù)模式。文章來源:http://www.zghlxwxcb.cn/news/detail-771201.html
MTA和MDA這樣的服務(wù)器軟件通常是現(xiàn)成的。MUA到MTA發(fā)送郵件的協(xié)議就是SMTP協(xié)議。使用Java程序發(fā)送郵件時,只需要使用JavaMail這個標(biāo)準(zhǔn)API就可以直接發(fā)送郵件。文章來源地址http://www.zghlxwxcb.cn/news/detail-771201.html
到了這里,關(guān)于Java Email 實現(xiàn)郵件發(fā)送的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!