今天研究了一下怎麼用java代碼發送郵件,用的是Apache的commons-email包。
據說這個包是對javamail進行了封裝,簡化了操作。 這裡講一下具體用法吧
一.首先你需要有郵箱賬号和一個授權碼。
需要進入到QQ郵箱或者是網易郵箱裡面去擷取。在郵箱的設定->賬戶裡面,開啟如下服務,就能得到一個授權碼,這個授權碼要好好保管。有了這兩個東西就能夠通過第三方用戶端發送郵件了。

二.導入commons-email的maven依賴。
我用的是1.4,也可以去maven倉庫網站(https://mvnrepository.com)上面找别的版本。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-email</artifactId>
<version>1.4</version>
</dependency>
三.然後就可以寫發送郵件的代碼了。
我在網上找了幾個案例,如下。
1.發送簡單文本郵件。這是最簡單也是最常用的。
/**
* @describe 發送内容為簡單文本的郵件
* @throws EmailException
*/
public static void sendSimpleTextEmail() throws EmailException {
Email email = new SimpleEmail();
//設定主機名,QQ郵箱是"smtp.qq.com",網易郵箱是"smtp.163.com"
email.setHostName("smtp.163.com");
// 使用者名和密碼為郵箱的賬号和授權碼(不需要進行base64編碼)
email.setAuthenticator(new DefaultAuthenticator("[email protected]", "myshouquanma"));
//設定SSL連接配接,這樣寫就對了
email.setSSLOnConnect(true);
//設定來源,就是發送方的郵箱位址
email.setFrom("[email protected]");
//設定主題,可以不設定
email.setSubject("java發送郵件");
//設定資訊,就是内容,這個必須要有
email.setMsg("這是測試郵件 ... :-)");
//接收人郵箱位址
email.addTo("[email protected]");
email.send();
}
2.發送包含附件的郵件(附件為本地資源),這裡用到了一個EmailAttachment對象,也就是附件的意思
/**
* @describe 發送包含附件的郵件(附件為本地資源)
* @throws EmailException
*/
public static void sendEmailsWithAttachments() throws EmailException {
// 建立一個attachment(附件)對象
EmailAttachment attachment = new EmailAttachment();
//設定上傳附件的位址
attachment.setPath("C:\\Users\\Administrator\\Pictures\\Saved Pictures\\conti.png");
attachment.setDisposition(EmailAttachment.ATTACHMENT);
//這個描述可以随便寫
attachment.setDescription("Picture of conti");
//這個名稱要注意和檔案格式一緻,這将是接收人下載下傳下來的檔案名稱
attachment.setName("conti.png");
//因為要上傳附件,是以用MultiPartEmail()方法建立一個email對象,固定步驟都是一樣的
MultiPartEmail email = new MultiPartEmail();
email.setHostName("smtp.163.com");
email.setAuthenticator(new DefaultAuthenticator("[email protected]", "myshouquanma"));
email.setSSLOnConnect(true);
email.addTo("[email protected]", "Conti Zhang");
email.setFrom("[email protected]", "Me");
email.setSubject("圖檔");
email.setMsg("這是發送給你的圖檔");
//将附件添加到郵件
email.attach(attachment);
email.send();
}
3.發送包含附近的郵件(附件為線上資源),這個與上傳本地附件稍有差別,注意一下就行
/**
* @describe 發送包含附件的郵件(附件為線上資源)
* @throws EmailException
* @throws MalformedURLException
*/
public static void sendEmailsWithOnlineAttachments() throws EmailException, MalformedURLException {
EmailAttachment attachment = new EmailAttachment();
//設定線上資源路徑,和上傳本地附件的唯一差別
attachment.setURL(new URL("http://www.apache.org/images/asf_logo_wide.gif"));
attachment.setDisposition(EmailAttachment.ATTACHMENT);
attachment.setDescription("Apache logo");
attachment.setName("Apache logo.gif");
MultiPartEmail email = new MultiPartEmail();
email.setHostName("smtp.163.com");
email.setAuthenticator(new DefaultAuthenticator("[email protected]", "myshouquanma"));
email.setSSLOnConnect(true);
email.addTo("[email protected]", "Conti Zhang");
email.setFrom("[email protected]", "Me");
email.setSubject("The logo");
email.setMsg("Here is Apache\'s logo");
email.attach(attachment);
email.send();
}
4.發送内容為HTML格式的郵件,有些郵件直接打開就是一個HTML頁面。雖然不一定用到,可以了解一下
/**
* @describe 發送内容為HTML格式的郵件
* @throws EmailException
* @throws MalformedURLException
*/
public static void sendHTMLFormattedEmail() throws EmailException, MalformedURLException {
// 這裡需要使用HtmlEmail建立一個email對象
HtmlEmail email = new HtmlEmail();
email.setHostName("smtp.163.com");
email.setAuthenticator(new DefaultAuthenticator("[email protected]", "myshouquanma"));
email.addTo("[email protected]", "Conti Zhang");
email.setFrom("[email protected]", "Me");
email.setSubject("Test email with inline image");
// 嵌入圖像并擷取内容id,雖然案例這樣寫,但我感覺直接在html内容裡面寫圖檔網絡位址也可以
URL url = new URL("http://www.apache.org/images/asf_logo_wide.gif");
String cid = email.embed(url, "Apache logo");
// 設定html内容
email.setHtmlMsg("<html>The apache logo - <img src=\"cid:" + cid + "\"></html>");
// 設定替代内容,如果不支援html
email.setTextMsg("你的郵件用戶端不支援html郵件");
email.send();
}
5.發送内容為HTML格式的郵件(嵌入圖檔更友善)
這裡用到了DataSourceFileResolver對象,和DataSourceUrlResolver對象,前者可以解析本地檔案路徑,後者可以解析網絡路徑
具體用法如下
/**
* @describe 發送内容為HTML格式的郵件(嵌入圖檔更友善)
* @throws MalformedURLException
* @throws EmailException
*/
public static void sendHTMLFormattedEmailWithEmbeddedImages() throws MalformedURLException, EmailException {
//html郵件模闆
String htmlEmailTemplate = "<img src=\"http://www.conti.com/images/1.jpg\">";
DataSourceResolver[] dataSourceResolvers =new DataSourceResolver[]{new DataSourceFileResolver(),new DataSourceUrlResolver(new URL("http://"))};
email.setDataSourceResolver(new DataSourceCompositeResolver(dataSourceResolvers));
email.setHostName("smtp.qq.com");
email.setAuthenticator(new DefaultAuthenticator("[email protected]", "myshouquanma"));
email.addTo("[email protected]", "Conti Zhang");
email.setFrom("[email protected]", "Me");
email.setSubject("Test email with inline image");
email.setHtmlMsg(htmlEmailTemplate);
email.setTextMsg("你的郵件用戶端不支援html郵件");
email.send();
}
此種方式可能會報錯,會被郵箱認為是有害郵件不接收而導緻發送失敗。解決方法就是,網易郵箱不行就換QQ郵箱,我就是這樣做的
好了,就這麼多,歡迎讨論!