在javaMail中整个邮件是由一个一个的BodyPart组成的,每一个BoydPart的内容可以是简单的普通文本,或超文本,或是一个附件,也可以是复杂的一个Multipart,然后Multipart中又可以嵌套多个BodyPart和Multipart。
下面是使用javaMail构造一封复杂的邮件,并发送该邮件。
import java.io.File;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.Message.RecipientType;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
public class Email4 {
public static void main(String args[]) throws AddressException, MessagingException {
Properties props = new Properties();
//发送邮件的服务器
props.setProperty("mail.smtp.host", "smtp.qq.com");
//发送邮件的协议
props.setProperty("mail.transport.protocol", "smtp");
//在连接服务器的时候是否需要验证,发邮件是需要验证的
props.setProperty("mail.smtp.auth", "true");
//用户名
final String username = "1111111111@qq.com";
//密码
final String password = "11111111111";
//利用上述的用户名和密码构造一个Authenticator对象,并把它给Session,
//当需要进行验证的时候,会自动从Session中去取该Authenticator对象
Authenticator authenticator = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
// TODO Auto-generated method stub
return new PasswordAuthentication(username, password);
}
};
//利用上述提供给系统的属性和Authenticator构造一个Session对象
Session session = Session.getInstance(props, authenticator);
//设为true,可以看到发送邮件的整个过程
session.setDebug(true);
//利用配好配置信息的Session新建一封邮件
Message message = new MimeMessage(session);
//设置邮件的发送者
message.setFrom(new InternetAddress("111111111111@qq.com"));
//邮件的主题
message.setSubject("Sending Email Test!");
Address[] recipients = InternetAddress.parse("*************@sohu.com");
//收邮件的人,如果有抄送,密送的,可以类似的设置,只是把RecipientType改为相应的类型
message.setRecipients(RecipientType.TO, recipients);
BodyPart part1 = new MimeBodyPart();
BodyPart part2 = new MimeBodyPart();
BodyPart part3 = new MimeBodyPart();
BodyPart part4 = new MimeBodyPart();
BodyPart part5 = new MimeBodyPart();
//设置内容为html
part1.setContent("<div style='font-size:large;font-weight:bold;color:red;height:50px;border:1px solid blue;'>HELLO WORLD;你好,世界</div>", "text/html;charset=utf-8");
//设置内容为普通文本
part2.setText("你好,Part2");
//将一个bodyPart加到最前面
part3.setText("Hello Part3");
/**
* 发送一个附件的情况
*/
//设置附件
//DataSource是对附件的封装,是一个接口,系统已经实现的子类有URLDataSource, DataHandlerDataSource, FileDataSource
//里面封装了各种与附件有关的方法,包括获取附件的InputStream
DataSource dataSource = new FileDataSource(new File("E:\\doc.sql"));
//DataHandler是对DataSource的封装,可以把Stream转换为String,
DataHandler dataHandler = new DataHandler(dataSource);
part4.setDataHandler(dataHandler);
//附件的名称,默认为content,如果文件名不加扩展名在进行附件下载的时候系统会不知道该附件是什么类型的附件,
//这样在不清楚文件类型的情况下,文件有可能是打不开的
part4.setFileName("doc.sql");
/**
* 发送多个附件的情况
*/
Multipart attachments = new MimeMultipart();
BodyPart attach1 = new MimeBodyPart();
//设置附件1的内容
DataSource dataSource_attach1 = new FileDataSource(new File("E:\\doc.sql"));
DataHandler dataHandler_attach1 = new DataHandler(dataSource_attach1);
attach1.setDataHandler(dataHandler_attach1);
attach1.setFileName("attach1_doc.sql");
BodyPart attach2 = new MimeBodyPart();
//设置附件2的内容
DataSource dataSource_attach2 = new FileDataSource(new File("E:\\doc.sql"));
DataHandler dataHandler_attach2 = new DataHandler(dataSource_attach2);
attach2.setDataHandler(dataHandler_attach2);
attach2.setFileName("attach2_doc.sql");
attachments.addBodyPart(attach1);
attachments.addBodyPart(attach2);
part5.setContent(attachments);
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(part1);
multipart.addBodyPart(part2);
multipart.addBodyPart(part3,0);
multipart.addBodyPart(part4);
multipart.addBodyPart(part5);
message.setContent(multipart);
Transport.send(message);//发送
}
}
抄送:http://haohaoxuexi.iteye.com/blog/1165703