java 發(fā)送郵件
使用 java 應(yīng)用程序發(fā)送 e-mail 十分簡(jiǎn)單,但是首先你應(yīng)該在你的機(jī)器上安裝 javamail api 和 java activation framework (jaf) 。
下載并解壓縮這些文件,在新創(chuàng)建的頂層目錄中,您會(huì)發(fā)現(xiàn)這兩個(gè)應(yīng)用程序的一些 jar 文件。您需要把 mail.jar 和 activation.jar 文件添加到您的 classpath 中。
如果你使用第三方郵件服務(wù)器如 qq 的smtp服務(wù)器,可查看文章底部用戶認(rèn)證完整的范例。
1. 發(fā)送一封簡(jiǎn)單的 e-mail
下面是一個(gè)發(fā)送簡(jiǎn)單e-mail的例子。假設(shè)你的本地主機(jī)已經(jīng)連接到網(wǎng)絡(luò)。
// 文件名 sendemail.java import java.util.*; import javax.mail.*; import javax.mail.internet.*; import javax.activation.*; public class sendemail { public static void main(string [] args) { // 收件人電子郵箱 string to = "abcd@gmail.com"; // 發(fā)件人電子郵箱 string from = "web@gmail.com"; // 指定發(fā)送郵件的主機(jī)為 localhost string host = "localhost"; // 獲取系統(tǒng)屬性 properties properties = system.getproperties(); // 設(shè)置郵件服務(wù)器 properties.setproperty("mail.smtp.host", host); // 獲取默認(rèn)session對(duì)象 session session = session.getdefaultinstance(properties); try{ // 創(chuàng)建默認(rèn)的 mimemessage 對(duì)象 mimemessage message = new mimemessage(session); // set from: 頭部頭字段 message.setfrom(new internetaddress(from)); // set to: 頭部頭字段 message.addrecipient(message.recipienttype.to, new internetaddress(to)); // set subject: 頭部頭字段 message.setsubject("this is the subject line!"); // 設(shè)置消息體 message.settext("this is actual message"); // 發(fā)送消息 transport.send(message); system.out.println("sent message successfully...."); }catch (messagingexception mex) { mex.printstacktrace(); } } }
編譯并運(yùn)行這個(gè)程序來(lái)發(fā)送一封簡(jiǎn)單的e-mail:
$ java sendemail sent message successfully....
如果你想發(fā)送一封e-mail給多個(gè)收件人,那么使用下面的方法來(lái)指定多個(gè)收件人id:
void addrecipients(message.recipienttype type, address[] addresses) throws messagingexception
下面是對(duì)于參數(shù)的描述:
- type:要被設(shè)置為 to, cc 或者 bcc,這里 cc 代表抄送、bcc 代表秘密抄送。舉例:message.recipienttype.to
- addresses: 這是 email id 的數(shù)組。在指定電子郵件 id 時(shí),你將需要使用 internetaddress() 方法。
2. 發(fā)送一封 html e-mail
下面是一個(gè)發(fā)送 html e-mail 的例子。假設(shè)你的本地主機(jī)已經(jīng)連接到網(wǎng)絡(luò)。
和上一個(gè)例子很相似,除了我們要使用 setcontent() 方法來(lái)通過(guò)第二個(gè)參數(shù)為 "text/html",來(lái)設(shè)置內(nèi)容來(lái)指定要發(fā)送html 內(nèi)容。
import java.util.*; import javax.mail.*; import javax.mail.internet.*; import javax.activation.*; public class sendhtmlemail { public static void main(string [] args) { // 收件人電子郵箱 string to = "abcd@gmail.com"; // 發(fā)件人電子郵箱 string from = "web@gmail.com"; // 指定發(fā)送郵件的主機(jī)為 localhost string host = "localhost"; // 獲取系統(tǒng)屬性 properties properties = system.getproperties(); // 設(shè)置郵件服務(wù)器 properties.setproperty("mail.smtp.host", host); // 獲取默認(rèn)的 session 對(duì)象。 session session = session.getdefaultinstance(properties); try{ // 創(chuàng)建默認(rèn)的 mimemessage 對(duì)象。 mimemessage message = new mimemessage(session); // set from: 頭部頭字段 message.setfrom(new internetaddress(from)); // set to: 頭部頭字段 message.addrecipient(message.recipienttype.to, new internetaddress(to)); // set subject: 頭字段 message.setsubject("this is the subject line!"); // 發(fā)送 html 消息, 可以插入html標(biāo)簽 message.setcontent("<h1>this is actual message</h1>", "text/html" ); // 發(fā)送消息 transport.send(message); system.out.println("sent message successfully...."); }catch (messagingexception mex) { mex.printstacktrace(); } } }
編譯并運(yùn)行此程序來(lái)發(fā)送html e-mail:
$ java sendhtmlemail sent message successfully....
3. 發(fā)送帶有附件的 e-mail
下面是一個(gè)發(fā)送帶有附件的 e-mail的例子。假設(shè)你的本地主機(jī)已經(jīng)連接到網(wǎng)絡(luò)。
import java.util.*; import javax.mail.*; import javax.mail.internet.*; import javax.activation.*; public class sendfileemail { public static void main(string [] args) { // 收件人電子郵箱 string to = "abcd@gmail.com"; // 發(fā)件人電子郵箱 string from = "web@gmail.com"; // 指定發(fā)送郵件的主機(jī)為 localhost string host = "localhost"; // 獲取系統(tǒng)屬性 properties properties = system.getproperties(); // 設(shè)置郵件服務(wù)器 properties.setproperty("mail.smtp.host", host); // 獲取默認(rèn)的 session 對(duì)象。 session session = session.getdefaultinstance(properties); try{ // 創(chuàng)建默認(rèn)的 mimemessage 對(duì)象。 mimemessage message = new mimemessage(session); // set from: 頭部頭字段 message.setfrom(new internetaddress(from)); // set to: 頭部頭字段 message.addrecipient(message.recipienttype.to, new internetaddress(to)); // set subject: 頭字段 message.setsubject("this is the subject line!"); // 創(chuàng)建消息部分 bodypart messagebodypart = new mimebodypart(); // 消息 messagebodypart.settext("this is message body"); // 創(chuàng)建多重消息 multipart multipart = new mimemultipart(); // 設(shè)置文本消息部分 multipart.addbodypart(messagebodypart); // 附件部分 messagebodypart = new mimebodypart(); string filename = "file.txt"; datasource source = new filedatasource(filename); messagebodypart.setdatahandler(new datahandler(source)); messagebodypart.setfilename(filename); multipart.addbodypart(messagebodypart); // 發(fā)送完整消息 message.setcontent(multipart ); // 發(fā)送消息 transport.send(message); system.out.println("sent message successfully...."); }catch (messagingexception mex) { mex.printstacktrace(); } } }
編譯并運(yùn)行你的程序來(lái)發(fā)送一封帶有附件的郵件。
$ java sendfileemail sent message successfully....
4. 用戶認(rèn)證
如果需要提供用戶名和密碼給e-mail服務(wù)器來(lái)達(dá)到用戶認(rèn)證的目的,你可以通過(guò)如下設(shè)置來(lái)完成:
props.put("mail.smtp.auth", "true"); props.setproperty("mail.user", "myuser"); props.setproperty("mail.password", "mypwd");
e-mail其他的發(fā)送機(jī)制和上述保持一致。
需要用戶名密碼驗(yàn)證郵件發(fā)送范例:
本范例以 qq 郵件服務(wù)器為例,你需要在登錄qq郵箱后臺(tái)在"設(shè)置"=》賬號(hào)中開啟pop3/smtp服務(wù) ,如下圖所示:
qq 郵箱通過(guò)生成授權(quán)碼來(lái)設(shè)置密碼:
java 代碼如下:
// 需要用戶名密碼郵件發(fā)送實(shí)例 //本實(shí)例以qq郵箱為例,你需要在qq后臺(tái)設(shè)置 import java.util.properties; import javax.mail.authenticator; import javax.mail.message; import javax.mail.messagingexception; import javax.mail.passwordauthentication; import javax.mail.session; import javax.mail.transport; import javax.mail.internet.internetaddress; import javax.mail.internet.mimemessage; public class sendemail2 { public static void main(string [] args) { // 收件人電子郵箱 string to = "xxx@qq.com"; // 發(fā)件人電子郵箱 string from = "xxx@qq.com"; // 指定發(fā)送郵件的主機(jī)為 smtp.qq.com string host = "smtp.qq.com"; //qq 郵件服務(wù)器 // 獲取系統(tǒng)屬性 properties properties = system.getproperties(); // 設(shè)置郵件服務(wù)器 properties.setproperty("mail.smtp.host", host); properties.put("mail.smtp.auth", "true"); // 獲取默認(rèn)session對(duì)象 session session = session.getdefaultinstance(properties,new authenticator(){ public passwordauthentication getpasswordauthentication() { return new passwordauthentication("xxx@qq.com", "qq郵箱授權(quán)碼"); //發(fā)件人郵件用戶名、授權(quán)碼 } }); try{ // 創(chuàng)建默認(rèn)的 mimemessage 對(duì)象 mimemessage message = new mimemessage(session); // set from: 頭部頭字段 message.setfrom(new internetaddress(from)); // set to: 頭部頭字段 message.addrecipient(message.recipienttype.to, new internetaddress(to)); // set subject: 頭部頭字段 message.setsubject("this is the subject line!"); // 設(shè)置消息體 message.settext("this is actual message"); // 發(fā)送消息 transport.send(message); system.out.println("sent message successfully....from yapf.com"); }catch (messagingexception mex) { mex.printstacktrace(); } } }