三、程序举例
1.首先是连接SMTP服务器,JAVAMAIL1.2不能实现SMTP服务的功能,但可以连接已有的SMTP服务器。
//创建一个属性对象
Properties props=System.getProperties(); //创建系统属性对象
props.setProperty("mail.transport.protocol","smtp"); //设置使用smtp协议
props.setProperty("mail.smtp.host",server); //设置SMTP服务器地址
props.setProperty("mail.smtp.port",""+port); //设置SMTP端口号
props.setProperty("mail.smtp.auth","true"); //SMTP服务用户认证
//创建一个过程对象
javax.mail.Session sess = javax.mail.Session.getDefaultInstance(props, null);
2.创建一封新邮件,一般定义该MimeMessage创建一个邮件对象。
MimeMessage msg=new MimeMessage(sess); //创建邮件对象
msg.setSubject(“邮件群发”); //设置邮件主题
msg.setSentDate(new Date()); //设置发信日期
msg.setFrom(Address address); //设置发信人
邮件地址只要符合带有“@”符号并且使用“.”分成三段的字符串都会被SMTP服务器接受,发送广告邮件的商家一般都会在这里修改发信人地址,所以我们的收件箱中看见的广告邮件显示中发信人内容一些的根本不存在邮件地址。如果想查看真正地发信人,应该查看邮件头中Received的内容。
//设置主收件人
msg.setRecipients(Message.RecipientType.TO,Address toaddress);
//设置抄送收件人
msg.addRecipients(Message.RecipientType.CC,Address coaddress);
//设置暗抄送人
msg.addRecipients(Message.RecipientType.BCC,Address bcoaddress);
SMTP允许一封邮件有多个接受者,我们可以利用这个特点,在这三个收件人中填写多个收件人地址来提高大规模发邮件效率。另外Bcc这个字段可以隐藏收件人的地址,你有时可能发现邮件的收件人不是自己却收到了这封邮件,就是利用了暗抄这个属性。
3.邮件体一般分为邮件正文本部分和附件部分。正文部分需要设置文本的格式,包括text文本类型,messafe报文类型,image图象类型,video视频类型,audio声音类型,application应用程序类型,multipart混合类型等。如下例,
String m_body; //为需要添加文本内容
MimeMultipart content=new MimeMultipart(); //创建邮件体对象
if(content==null) return false;
MimeBodyPart part=new MimeBodyPart(); //创建文本部分对象
String type="text/plain"; //文本类型默认为text/plain
if(m_body.startsWith("<html>") || m_body.startsWith("<HTML>"))
type="text/html"; //如果是网页形式的内容,则改变类型为text/html
part.setText(m_body);
part.setHeader("Content-Type",type);
content.addBodyPart(part);
msg.setContent(content); //添加文本至邮件中
msg.saveChanges(); //保存修改
4.如何向的邮件中添加附件,利用多用途互联网邮件扩展(MIME)协议可以直接二进制数据添加到标准的RFC822邮件中。在JAVAMAIL中实现方法如下,
String filename; //用于存储文件名称与存放路径
if(filename!=null || filename.length()>0){
MimeBodyPart part=new MimeBodyPart();//创建MIME对象
DataSource fds = new FileDataSource(filename); //创建文件流对象
part.setDataHandler(new DataHandler(fds));
part.setFileName(MimeUtility.encodeText(fds.getName()));
content.addBodyPart(part); //添加二进制编码至邮件体中
}
msg.setContent(content); //添加文本至邮件中
msg.saveChanges(); //保存修改
5.邮件的基本内容设置完毕,发送SMTP电子邮件。
Transport trans=sess.getTransport(); //创建发送对象
trans.send (msg); //发送
6.如何群发邮件,首先我们要有一个邮件地址列表,邮件地址列表可以向从公共网站获得,也可以根据某单位名称按字典法生成,或者购买用户表。邮件地址列表应该按行存放每个邮件地址。
发信的速度和SMTP的响应速度有密切的关系,所以因该充分利用一封邮件可以有多个接受地址的条件,将邮件地址按组读入进行发送,才能提高邮件群发地效率。下面的例子是每一封信发给10个邮件地址。
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){ //多个邮件地址之间要加“,”
maillist = maillist + “,” + fileline;
}else{
maillist = fileline;
}
i++;
if((i%10)==0){ //一封邮件在暗抄地址处加10个收件人
msg.addRecipients(Message.RecipientType.BCC, maillist);
…… //设置邮件内容
Transport trans=sess.getTransport(); //创建发送对象
trans.send (msg); //发送
}
}
fis.close();
}catch(Exception error){
System.out.println("Exception:" + error);
}