三、程序舉例
1.首先是連接SMTP服務(wù)器,JAVAMAIL1.2不能實(shí)現(xiàn)SMTP服務(wù)的功能,但可以連接已有的SMTP服務(wù)器。
//創(chuàng)建一個(gè)屬性對象
Properties props=System.getProperties(); //創(chuàng)建系統(tǒng)屬性對象
props.setProperty("mail.transport.protocol","smtp"); //設(shè)置使用smtp協(xié)議
props.setProperty("mail.smtp.host",server); //設(shè)置SMTP服務(wù)器地址
props.setProperty("mail.smtp.port",""+port); //設(shè)置SMTP端口號
props.setProperty("mail.smtp.auth","true"); //SMTP服務(wù)用戶認(rèn)證
//創(chuàng)建一個(gè)過程對象
javax.mail.Session sess = javax.mail.Session.getDefaultInstance(props, null);
2.創(chuàng)建一封新郵件,一般定義該MimeMessage創(chuàng)建一個(gè)郵件對象。
MimeMessage msg=new MimeMessage(sess); //創(chuàng)建郵件對象
msg.setSubject(“郵件群發(fā)”); //設(shè)置郵件主題
msg.setSentDate(new Date()); //設(shè)置發(fā)信日期
msg.setFrom(Address address); //設(shè)置發(fā)信人
郵件地址只要符合帶有“@”符號并且使用“.”分成三段的字符串都會被SMTP服務(wù)器接受,發(fā)送廣告郵件的商家一般都會在這里修改發(fā)信人地址,所以我們的收件箱中看見的廣告郵件顯示中發(fā)信人內(nèi)容一些的根本不存在郵件地址。如果想查看真正地發(fā)信人,應(yīng)該查看郵件頭中Received的內(nèi)容。
//設(shè)置主收件人
msg.setRecipients(Message.RecipientType.TO,Address toaddress);
//設(shè)置抄送收件人
msg.addRecipients(Message.RecipientType.CC,Address coaddress);
//設(shè)置暗抄送人
msg.addRecipients(Message.RecipientType.BCC,Address bcoaddress);
SMTP允許一封郵件有多個(gè)接受者,我們可以利用這個(gè)特點(diǎn),在這三個(gè)收件人中填寫多個(gè)收件人地址來提高大規(guī)模發(fā)郵件效率。另外Bcc這個(gè)字段可以隱藏收件人的地址,你有時(shí)可能發(fā)現(xiàn)郵件的收件人不是自己卻收到了這封郵件,就是利用了暗抄這個(gè)屬性。
3.郵件體一般分為郵件正文本部分和附件部分。正文部分需要設(shè)置文本的格式,包括text文本類型,messafe報(bào)文類型,image圖象類型,video視頻類型,audio聲音類型,application應(yīng)用程序類型,multipart混合類型等。如下例,
String m_body; //為需要添加文本內(nèi)容
MimeMultipart content=new MimeMultipart(); //創(chuàng)建郵件體對象
if(content==null) return false;
MimeBodyPart part=new MimeBodyPart(); //創(chuàng)建文本部分對象
String type="text/plain"; //文本類型默認(rèn)為text/plain
if(m_body.startsWith("<html>") || m_body.startsWith("<HTML>"))
type="text/html"; //如果是網(wǎng)頁形式的內(nèi)容,則改變類型為text/html
part.setText(m_body);
part.setHeader("Content-Type",type);
content.addBodyPart(part);
msg.setContent(content); //添加文本至郵件中
msg.saveChanges(); //保存修改
4.如何向的郵件中添加附件,利用多用途互聯(lián)網(wǎng)郵件擴(kuò)展(MIME)協(xié)議可以直接二進(jìn)制數(shù)據(jù)添加到標(biāo)準(zhǔn)的RFC822郵件中。在JAVAMAIL中實(shí)現(xiàn)方法如下,
String filename; //用于存儲文件名稱與存放路徑
if(filename!=null || filename.length()>0){
MimeBodyPart part=new MimeBodyPart();//創(chuàng)建MIME對象
DataSource fds = new FileDataSource(filename); //創(chuàng)建文件流對象
part.setDataHandler(new DataHandler(fds));
part.setFileName(MimeUtility.encodeText(fds.getName()));
content.addBodyPart(part); //添加二進(jìn)制編碼至郵件體中
}
msg.setContent(content); //添加文本至郵件中
msg.saveChanges(); //保存修改
5.郵件的基本內(nèi)容設(shè)置完畢,發(fā)送SMTP電子郵件。
Transport trans=sess.getTransport(); //創(chuàng)建發(fā)送對象
trans.send (msg); //發(fā)送
6.如何群發(fā)郵件,首先我們要有一個(gè)郵件地址列表,郵件地址列表可以向從公共網(wǎng)站獲得,也可以根據(jù)某單位名稱按字典法生成,或者購買用戶表。郵件地址列表應(yīng)該按行存放每個(gè)郵件地址。
發(fā)信的速度和SMTP的響應(yīng)速度有密切的關(guān)系,所以因該充分利用一封郵件可以有多個(gè)接受地址的條件,將郵件地址按組讀入進(jìn)行發(fā)送,才能提高郵件群發(fā)地效率。下面的例子是每一封信發(fā)給10個(gè)郵件地址。
import java.io.*;
import java.net.*;
import java.util.*;
import javax.mail.*;
import javax.activation.*;
import javax.mail.internet.*;
class massmail(){
try{
FileReader fis = new FileReader(“郵件列表文件”);
BufferedReader dis = new BufferedReader(fis);
int i=0;
while((fileline = dis.readLine())!=null){
if((i%10)==0)
MimeMessage msg=new MimeMessage(sess);
……
if((i%10)!=0){ //多個(gè)郵件地址之間要加“,”
maillist = maillist + “,” + fileline;
}else{
maillist = fileline;
}
i++;
if((i%10)==0){ //一封郵件在暗抄地址處加10個(gè)收件人
msg.addRecipients(Message.RecipientType.BCC, maillist);
…… //設(shè)置郵件內(nèi)容
Transport trans=sess.getTransport(); //創(chuàng)建發(fā)送對象
trans.send (msg); //發(fā)送
}
}
fis.close();
}catch(Exception error){
System.out.println("Exception:" + error);
}