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

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

一、邮件发送API体系结构
javax.mial.Transport类用于执行邮件的发送任务,其可以将Message对象中的封装的邮件数据发送 到指定的SMTP服务器。
如下图所示可以知道Transport类和Session、Message类之间的关系。

图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;
	}
}


  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值