原文:JavaXMail發送郵件功能實現 | Stars-One的雜貨小窩
好久之前實現的郵件發送功能,一直沒整理出來,考慮到之后有個項目需要,先整理一波
提示: 本文代碼例子是使用Kotlin語言編寫
基本使用
1.授權申請
第一步,首先得去郵箱開通對應的服務,這里建議使用QQ郵箱,網易的163郵箱測試很容易被官方攔截,官方認為你的郵件是垃圾郵件,不給你發,心煩,相比之下,QQ郵箱比較友好,不過給163郵箱,郵件會被當做垃圾郵件(服了)
授權去QQ郵箱設置里開啟(設置->個人賬戶菜單)即可,如下面截圖,要先把上方的幾個服務開啟之后,在申請授權碼即可
2.依賴引入
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
3.發送郵件
//1.設置自己郵箱和授權碼以及發送人
val pwd = "你的授權碼"
val fromPerson = "你的郵箱地址"
//發送人郵箱地址
val toAddress = ""
//2.初始化郵箱的配置
val props = Properties()
//開啟調試模式,會打印日志
props.setProperty("mail.debug", "true")
// 發送服務器需要身份驗證
props.setProperty("mail.smtp.auth", "true")
// 設置郵件服務器主機名
props.setProperty("mail.host", "smtp.qq.com")
// 發送郵件協議名稱
props.setProperty("mail.transport.protocol", "smtp")
val sf = MailSSLSocketFactory()
sf.isTrustAllHosts = true
props["mail.smtp.ssl.enable"] = "true"
props["mail.smtp.ssl.socketFactory"] = sf
//3.創建郵件內容(郵件標題,郵件內容,收件人)
val session = Session.getInstance(props)
val msg = MimeMessage(session)
val multipart = MimeMultipart()
val mainContent = MimeBodyPart()
mainContent.setContent("你好,這是一封測試郵件", "text/html;charset=gb2312")
multipart.addBodyPart(mainContent)
msg.subject = "測試標題"
msg.setContent(multipart)
/**
* 設置收件人地址(可以增加多個收件人、抄送、密送),即下面這一行代碼書寫多行(即群發)
* PS:將收件人的地址改為自己即可實現給自己發送郵件
* MimeMessage.RecipientType.TO:發送
* MimeMessage.RecipientType.CC:抄送
* MimeMessage.RecipientType.BCC:密送
*/
msg.addRecipient(MimeMessage.RecipientType.TO, InternetAddress(toAddress))
msg.setFrom(InternetAddress(fromPerson))
msg.saveChanges()
//4.登錄並發送郵件
val transport = session.transport
//登錄
transport.connect("smtp.qq.com", fromPerson, pwd)
transport.sendMessage(msg, msg.allRecipients) //這個是要接受郵件的郵箱
transport.close()
PS:郵件可以群發,不過一般郵箱都是有限制,比如說QQ郵箱限制每次郵件發送郵件不能超過50個人(但不清楚是否包含抄送人和密送人的數量在內,有條件可以自己嘗試)
效果圖:
當然,郵件還可以發送網頁內容、圖片和附件,這里就沒有過多深入研究,詳情可以看末尾參考的文章
封裝工具類
根據上面的基本的方法,我自己封裝了一套郵件發送的簡單工具類,各位可以參考
class MailUtil {
companion object {
//你的郵箱地址
private val fromPerson = ""
//這里看你用的郵箱改,如果是QQ郵箱,就是smtp.qq.com
private val mailHost = "smtp.qq.com"
//這里改成你的郵箱授權碼
val pwd = ""
private val props = Properties()
/**
* 給指定郵箱發送郵件
*
* @param toAddress 指定郵箱地址
* @param title 郵件主題
* @param content 郵件內容(內容如果是網頁也是可以的)
*/
fun sendEmail(toAddress: String, title: String, content: String) {
println("-----test---- sendEmail開始---")
val session = Session.getInstance(props)
val msg = MimeMessage(session)
val multipart = MimeMultipart()
val mainContent = MimeBodyPart()
mainContent.setContent(content, "text/html;charset=gb2312")
multipart.addBodyPart(mainContent)
msg.subject = title
msg.setContent(multipart)
/**
* 設置收件人地址(可以增加多個收件人、抄送、密送),即下面這一行代碼書寫多行
* MimeMessage.RecipientType.TO:發送
* MimeMessage.RecipientType.CC:抄送
* MimeMessage.RecipientType.BCC:密送
*/
msg.addRecipient(MimeMessage.RecipientType.TO, InternetAddress(toAddress))
msg.setFrom(InternetAddress(fromPerson))
msg.saveChanges()
val transport = session.transport
//登錄
transport.connect(mailHost, fromPerson, pwd)
transport.sendMessage(msg, msg.allRecipients) //這個是要接受郵件的郵箱
transport.close()
}
}
init {
//開啟調試模式,會打印日志
props.setProperty("mail.debug", "true")
// 發送服務器需要身份驗證
props.setProperty("mail.smtp.auth", "true")
// 設置郵件服務器主機名
props.setProperty("mail.host", mailHost)
// 發送郵件協議名稱
props.setProperty("mail.transport.protocol", "smtp")
val sf = MailSSLSocketFactory()
sf.isTrustAllHosts = true
props["mail.smtp.ssl.enable"] = "true"
props["mail.smtp.ssl.socketFactory"] = sf
}
}