日期:2014-05-17  浏览次数:20873 次

通过smtp实现html邮件转发

学习笔记,把Email_Autherticatorbean类嵌入到HtmlEmail中只是想把功能的代码放到一个文件中,希望此文读者不要见怪。

?

package common;

import java.util.Date;
import java.util.Properties;

//要加入email.jar和activation.jar这两个包
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
/**
 * <p>HtmlEmail  目前只支持smtp转发邮件</p>
 * @author bing
 * @version 1.0, 2010-10-16
 */
public class HtmlEmail
{

	/**
	 * <p>
	 *     步骤:<br/>
	 *     1、发送人邮箱验证;<br/>
	 *     2、获取邮件发送器;<br/>
	 *     3、生成邮件;<br/>
	 *         3.1、设置邮件主题;<br/>
	 *         3.2、设置正文(MINI邮件);<br/>
	 *         3.3、附件处理;<br/>
	 *     4、邮件信息处理;<br/>
	 *     5、发送邮件。<br/>
	 * </P>
	 * @param host			邮箱代理商smtp服务器地址
	 * @param from			发送人邮箱地址
	 * @param password		发送人邮箱密码
	 * @param to			收件人邮箱地址
	 * @param htmlContext	html邮件内容
	 * @param fixDataSource	是否将html邮件中的img标签的src属性通配符匹配图片附件,匹配时要注意:建议附件全为图片 通匹符编号从0开始
	 * @param dataSources	附件地址(String类型) 数组 下标从0开始 可选项,可以不写
	 * @return
	 * @author bing
	 */
	@SuppressWarnings("static-access")
    public boolean send(String host, String from, String password, String to, String htmlContext, boolean fixDataSource, String... dataSources)
	{
		try
		{
		    ///// 准备工作 /////
			Properties props = new Properties(); 
			Session sendMailSession; 
			//Store store; 
			Transport transport; 
			Email_Autherticatorbean auth=null;
			
			///// 1、发送人邮箱验证  /////
			
			props.put("mail.smtp.host", host); // 代理主机
			props.put("mail.smtp.auth", "true"); //如果需要验证
			props.put("mail.smpt.port", "25"); // 代理主机端口
			auth =  new Email_Autherticatorbean(from,password); // 发件人的邮箱及密码验证规则
			sendMailSession = Session.getInstance(props,auth);//session认证,并获得Session实例
			
            ///// 2、获取代理服务器邮件发送器 /////
            transport = sendMailSession.getTransport("smtp");
			sendMailSession.setDebug(true);//这个是跟踪后台消息。打印在控制台
	
			///// 3、生成邮件/////
			Message newMessage = new MimeMessage(sendMailSession); // 创建邮件
			
			///// 3.1、设置邮件主题/////
			newMessage.setSubject("Mail Test Subject");  // 设置邮件主题
			//newMessage.setContent("<b>Hell!</b>","text/html;charset=gb2312");
			
			///// 3.2、设置正文(MINI邮件)/////
			MimeMultipart multipart = new MimeMultipart("related");// 创建MINI邮件(正文)
			BodyPart body = new MimeBodyPart();// 创建MINI邮件组件
			//body.setContent("<b>Hello!</b><br><img src=\"cid:0\">","text/html;charset=gb2312");
			body.setContent(htmlContext,"text/html;charset=gb2312");// 设置MINI邮件正文格式
			multipart.addBodyPart(body);// 将MINI邮件组件添加到MINI邮件中
			
			///// 3.3、附件处理   /////
			for(int i = 0; i < dataSources.length; i++)// 附件处理,根据所提供的符件地址添加符件
			{
				body = new MimeBodyPart(); // 创建MINI邮件组件(用于附件)
				DataSource fds = new FileDataSource(dataSources[i]);
				body.setDataHandler(new DataHandler(fds));
				// 是否在html文件中关联附件,这里匹配正文中img标签,匹配cid:<number>,number从0开始,与符件下标一致
				if(fixDataSource == true)	
					body.setHeader("Content-ID","<"+ (i) +">");	// 将匹配正文中的cid
				multipart.addBodyPart(body);// 将MINI邮件组件添加到MINI邮件中
			}
			// 设置正文(MINI邮件)
			newMessage.setContent(multipart);
			
			////// 4、邮件信息处理 //////
			newMessage.setFrom(new InternetAddress(from));// 设置发件人地址
			newMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(to)); // 设置收件人地址
			newMessage.setSentDate(new Date()); // 设置发送时间
			//newMessage.setText("<b>Mail Test Content</b>"); 
			
			///// 5、发送邮件 /////
			transport.send(newMessage); 
			return true;
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return false;
		}
	}
	/**
	 * <p>邮件