天天看点

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

第四讲:使用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 = "[email protected]";
	String to  = "[email protected],[email protected]";   //使用逗号分隔邮件
	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;
	}
}
           

继续阅读