Javaweb實(shí)現(xiàn)郵件發(fā)送
本文實(shí)例為大家分享了Javaweb實(shí)現(xiàn)郵件發(fā)送的具體代碼,供大家參考,具體內(nèi)容如下
發(fā)送郵件使用的是SMTP協(xié)議:一般是smtp.xxx.com ,比如smtp.qq.com
接收郵件:POP3協(xié)議
附件:MIME
使用Java發(fā)送郵件需要準(zhǔn)備JavaMail API 和 Java Activation Framework
得到兩個(gè)jar包
mail.jar
activation.jar
import com.sun.mail.util.MailSSLSocketFactory; ? import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.security.GeneralSecurityException; import java.util.Properties; ? public class Email { ? ? public static void main(String[] args) throws GeneralSecurityException, MessagingException { ? ? ? ? Properties prop = new Properties(); ? ? ? ? //設(shè)置qq郵件服務(wù)器 ? ? ? ? prop.setProperty("mail.host", "smtp.qq.com"); ? ? ? ? //郵件發(fā)送協(xié)議 ? ? ? ? prop.setProperty("mail.transport.protocol", "smtp"); ? ? ? ? //需要驗(yàn)證用戶名和密碼 ? ? ? ? prop.setProperty("mail.smtp.auth", "true"); ? ? ? ? ? //關(guān)于QQ郵箱,還要設(shè)置SSL加密,加上以下代碼即可 ? ? ? ? MailSSLSocketFactory sf = new MailSSLSocketFactory(); ? ? ? ? sf.setTrustAllHosts(true); ? ? ? ? prop.put("mail.smtp.ssl.enable", "true"); ? ? ? ? prop.put("mail.smtp.ssl.socketFactory", sf); ? ? ? ? ? //使用JavaMail發(fā)送郵件的5個(gè)步驟 ? ? ? ? //1,創(chuàng)建定義整個(gè)應(yīng)用程序所需的環(huán)境信息的Session對(duì)象 ? ? ? ? ? //qq才有,其他郵箱就不用 ? ? ? ? Session session = Session.getDefaultInstance(prop, new Authenticator() { ? ? ? ? ? ? public PasswordAuthentication getPasswordAuthentication() { ? ? ? ? ? ? ? ? return new PasswordAuthentication("920367321@qq.com", "hnjwzkfilnnnbbig"); ? ? ? ? ? ? } ? ? ? ? }); ? ? ? ? //開(kāi)啟session的debug模式,可以看到程序發(fā)送Email的運(yùn)行狀態(tài) ? ? ? ? /*session.setDebug(true);*/ ? ? ? ? ? //2,通過(guò)session得到transport對(duì)象 ? ? ? ? Transport ts = session.getTransport(); ? ? ? ? //3,使用郵箱的用戶名和授權(quán)碼連接上郵件服務(wù)器 ? ? ? ? ts.connect("smtp.qq.com", "920367321@qq.com", "hnjwzkfilnnnbbig"); ? ? ? ? //4,創(chuàng)建郵件 ? ? ? ? MimeMessage message = new MimeMessage(session); ? ? ? ? //指明郵件的發(fā)件人 ? ? ? ? message.setFrom(new InternetAddress("920367321@qq.com")); ? ? ? ? //指明郵件的收件人,現(xiàn)在發(fā)件人和收件人是一樣的,就是自己給自己發(fā) ? ? ? ? message.setRecipient(Message.RecipientType.TO, new InternetAddress("920367321@qq.com")); ? ? ? ? //郵件的標(biāo)題 ? ? ? ? message.setSubject("只包含文本的簡(jiǎn)單郵件"); ? ? ? ? //郵件的文本內(nèi)容 ? ? ? ? message.setContent("你好啊","text/html;charset=UTF-8"); ? ? ? ? //5,發(fā)送郵件 ? ? ? ? ts.sendMessage(message,message.getAllRecipients()); ? ? ? ? //6,關(guān)閉連接 ? ? ? ? ts.close(); ? ? } }
關(guān)于在郵件中添加附件 MIME(多用途互聯(lián)網(wǎng)郵件擴(kuò)展類型)
MimeBodyPart類
javax.mail.internet.MimeBodyPart類表示的是一個(gè)MIME消息,它和MimeMesssage類一樣都是從Part接口結(jié)成過(guò)來(lái)
MimeMultipart類
javax.mail.internet.MimeMultipart是抽象類Multipart的實(shí)現(xiàn)子類,它用來(lái)組合多個(gè)MIME消息,一個(gè)MimeMultipart對(duì)象可以包含多個(gè)代表MIME消息的MimeBodyPart對(duì)象
帶圖片的郵件,其他的代碼與上面一樣,只需要更改郵件的內(nèi)容即可
//郵件的標(biāo)題 message.setSubject("只包含圖片的簡(jiǎn)單郵件"); ?//準(zhǔn)備郵件數(shù)據(jù) ? //準(zhǔn)備圖片數(shù)據(jù) MimeBodyPart image = new MimeBodyPart(); //圖片需要數(shù)據(jù)處理,DataHandler就是這樣的一個(gè)類 DataHandler dh = new DataHandler(new FileDataSource("src/main/resources/01.png")); image.setDataHandler(dh);//在我們的body中放入這個(gè)處理的圖片數(shù)據(jù) image.setContentID("01.png"); ? //準(zhǔn)備正文數(shù)據(jù) MimeBodyPart text = new MimeBodyPart(); text.setContent("這是一封帶圖片<img src='cid:01.png/>'的郵件", "text/html;charset=UTF-8"); //描述數(shù)據(jù)關(guān)系 MimeMultipart mm = new MimeMultipart(); mm.addBodyPart(text); mm.addBodyPart(image); mm.setSubType("related"); ? //設(shè)置到消息中,保存修改 message.setContent(mm);//把最后編輯好的郵件放到消息當(dāng)中 message.saveChanges();//保存修改 //5,發(fā)送郵件 ts.sendMessage(message,message.getAllRecipients());
帶附件的郵件,操作基本沒(méi)差,只需要?jiǎng)?chuàng)建一個(gè)附件的MimeBodyPart再添加到消息中即可
//準(zhǔn)備圖片數(shù)據(jù) MimeBodyPart image = new MimeBodyPart(); //圖片需要數(shù)據(jù)處理,DataHandler就是這樣的一個(gè)類 DataHandler dh = new DataHandler(new FileDataSource("src/main/resources/01.png")); image.setDataHandler(dh);//在我們的body中放入這個(gè)處理的圖片數(shù)據(jù) ? ? ? ? image.setContentID("01.png"); ? //附件 MimeBodyPart accessory = new MimeBodyPart(); accessory.setDataHandler(new DataHandler(new FileDataSource("src/main/resources/hello.txt"))); accessory.setFileName("hello.txt");//設(shè)置附件的名字 //準(zhǔn)備正文數(shù)據(jù) MimeBodyPart text = new MimeBodyPart(); text.setContent("這是一封帶圖片<img src='cid:01.png'/>的郵件", "text/html;charset=UTF-8"); //描述數(shù)據(jù)關(guān)系 MimeMultipart mm = new MimeMultipart(); mm.addBodyPart(text); mm.addBodyPart(image); mm.setSubType("related"); ? //將圖片和文本封裝為一個(gè)MimeMultipart MimeBodyPart contentText = new MimeBodyPart(); contentText.setContent(mm); ? //拼接附件 MimeMultipart allFile = new MimeMultipart(); allFile.addBodyPart(accessory);//附件 allFile.addBodyPart(contentText); allFile.setSubType("mixed");//正文和附件都存在郵件中,所有類型設(shè)置為mixed ? //設(shè)置到消息中,保存修改 message.setContent(allFile);//把最后編輯好的郵件放到消息當(dāng)中 message.saveChanges();//保存修改 //5,發(fā)送郵件 ts.sendMessage(message,message.getAllRecipients());
注意點(diǎn):
在一個(gè)web項(xiàng)目中:例如實(shí)現(xiàn)一個(gè)用戶注冊(cè)就給用戶發(fā)一封郵件的功能,但通過(guò)之前的代碼我們可以發(fā)現(xiàn),發(fā)送一封郵件是需要時(shí)間的,這個(gè)時(shí)候考慮到用戶體驗(yàn)我們不應(yīng)該讓用戶等待,所以可以考慮使用多線程,為郵件發(fā)送單獨(dú)設(shè)置為一條線程,而不影響主線程的操作!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
簡(jiǎn)單了解JAVA public class與class區(qū)別
這篇文章主要介紹了簡(jiǎn)單了解JAVA public class與class區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03spring boot動(dòng)態(tài)加載Echart餅狀圖
這篇文章主要為大家詳細(xì)介紹了spring boot動(dòng)態(tài)加載Echart餅狀圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12Mybatisplus創(chuàng)建Spring?Boot工程打包錯(cuò)誤的解決方式
最近在實(shí)戰(zhàn)springboot遇到了一些坑,記錄一下,下面這篇文章主要給大家介紹了關(guān)于Mybatisplus創(chuàng)建Spring?Boot工程打包錯(cuò)誤的解決方式,文中通過(guò)圖文介紹的介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03解決IDEA克隆代碼后在右下角沒(méi)有g(shù)it分支的問(wèn)題
這篇文章主要介紹了解決IDEA克隆代碼后在右下角沒(méi)有g(shù)it分支的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02深入Ajax代理的Java Servlet的實(shí)現(xiàn)詳解
本篇文章是對(duì)Ajax代理的Java Servlet的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06如何使用Idea搭建全注解式開(kāi)發(fā)的SpringMVC項(xiàng)目
這篇文章主要介紹了如何使用Idea搭建全注解式開(kāi)發(fā)的SpringMVC項(xiàng)目,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03Java中冒泡排序的原生實(shí)現(xiàn)方法(正序與逆序)
這篇文章主要給大家介紹了關(guān)于Java中冒泡排序的原生實(shí)現(xiàn)方法(正序與逆序)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11