第四讲:使用Transport类发送邮件(1)

时间:2022-09-02 18:09:48
第四讲:使用Transport类发送邮件

一、邮件发送API体系结构
javax.mial.Transport类用于执行邮件的发送任务,其可以将Message对象中的封装的邮件数据发送 到指定的SMTP服务器。
如下图所示可以知道Transport类和Session、Message类之间的关系。
第四讲:使用Transport类发送邮件(1)
图1:transport发送关系图(取自《JavaMail开发详解》)
1. 从Session对象中获得实现了某种邮件发送协议的SMTP对象;
2. 使用Session对象创建Message对象,并调用Message对象的方法封装邮件数据;
3. 连接指定的SMTP服务器,调用Transport对象中的邮件发送方法发送Message对象中封装的数据。

二、 Transport类
javax.mail.Tranport类继承了javax.mail.Service类,它用于连接SMTP服务器并把包含在Message 对象中的邮件数据发送到SMTP服务器。Transport类是一个抽象类,在程序中运行实际使其具体 实现了子类的实例对象,不同的实现子类实现不同的邮件发送协议。其常用方法有:
connect()
connect(String host, String user, String pass)
connect(String host, int port, String user, String pass)                                                                                                                                                                                                                                                                    
用于建立于邮件服务器之间的连接式从Service类中继承,第一个方法采用Session中设置的属性连接,第二个方法中若使用SMTP默认端口为25可以不用指定。
abstract sendMessage(Message msg, Address[] addr)

使用其实现子类调用
Transport对象与邮件服务器建立连接后,可以在这个连接上多次调用sendMessae方法,既可以在一个连接上发送多次邮件。
sendMessage方法在发送邮件前不会调用Message.saveChanges方法,因此要在调用sendMessage前调用此方法保存邮件更新内容
close() 断开与邮件服务器的连接
static  send(Message msg)
static  send(Message msg, Address[] addr)
是Transport中的静态方法。send方法在发送邮件前都会调用Message.saveChanges方法在Message对象中的数据生成的MIME邮件内容。但是每一次调用都会与邮件服务器断开连接,一次连接只能发送一次邮件。
使用JavaMail API发送邮件只需要执行以下三个步骤:
1. 创建包含邮件服务器的网络连接信息的Session对象。
2. 创建代表邮件内容的Message对象。
3. 从Session对象中获得Transport对象,并调用它的方法发送Message对象

三、发送邮件实例
3.1 发送包含HTML消息以及内嵌图片的邮件
public class TransportEx1 {

String from = "XXX@163.com";
String to = "XXX@ict.ac.cn,XXX@gmail.com"; //使用逗号分隔邮件
String subject = "Invatation: visit me";
String body = "<h4>欢迎大家阅读邮件</h4>"
+"<a href = \"http://blog.csdn.net/wenwen1538\">欢迎访问我的主页</a>";
String fileName = "D:\\蜗牛的世界.png";

public static void main(String[] args) throws Exception {


String server = "smtp.163.com";
String user = "XXXX";
String password = "XXXX";

Session session = createSession();
Message message = new TransportEx1().createMessage(session);

//获取发送对象,连接发送,断开连接设置
Transport sender = session.getTransport();
sender.connect(server, user, password);
sender.sendMessage(message,
message.getRecipients(RecipientType.TO));
sender.close();

}

public static Session createSession(){

/**
* 必须要设置mail.smtp.auth为true这样SMTPTranport对象才会向SMTP服务器提交用户认证信息
*/
Properties props = new Properties();
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.smtp.auth", "true");

Session session = Session.getDefaultInstance(props);
session.setDebug(true);
return session;
}
public Message createMessage(Session session) throws Exception{


Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(from));
msg.setRecipients(RecipientType.TO, InternetAddress.parse(to));
msg.setSentDate(new Date());
msg.setSubject(subject);
//创建组合类型为”related“的MIME消息
MimeMultipart multipart = new MimeMultipart("related");
MimeBodyPart contentPart= new MimeBodyPart();
contentPart.setContent(body, "text/html");
MimeBodyPart imgPart = new MimeBodyPart();
FileDataSource fds = new FileDataSource(fileName);
imgPart.setDataHandler(new DataHandler(fds));

//加入MimeMultipart对象
multipart.addBodyPart(contentPart);
multipart.addBodyPart(imgPart);

//返回MimeBodyPart对象将作为MimeMessage对象的一部分
msg.setContent(multipart);
msg.saveChanges(); //容易忘记这句话,否则结果会出现问题
return msg;
}
}