JavaMail实现邮件发送的简单封装(包括文本、图片、html、附件)

最近学习了一下java mail 的使用

网上有很多资料,比较容易理解,也有一些简单的例子,但是封装的都不太理想,于是自己写了一个JavaMail的简单封装,一共两个类,可以实现自由的添加邮件标题、接收者、抄送、文本内容、图片内容、html内容和附件等基本功能。更复杂的封装比如验证地址、异常处理等由于并不是JavaMail的范畴,本例中没有实现,有兴趣的可以自己实现。

另外由于发送邮件使用的是

Transport.send(message);
这个静态方法,所以本例不适合批量发送邮件的需求,有需要的话可以修改相关代码,手动创建和关闭transport。下面是本例代码


mail.properties(其中***需改成自己的邮件账号和密码,本例中使用了163的smtp邮件服务,也可以使用其他,需修改相应的host和port)

#163 mail server
mail.transport.protocol=smtp
mail.smtp.host=smtp.163.com
mail.smtp.port=25
mail.smtp.from=***@163.com
mail.smtp.user=***@163.com
mail.smtp.password=***
mail.smtp.auth=true
mail.debug=true

AbstractMailSender

/**
 * file name: AbstractMailSender.java
 * Auther: allen
 * Create Date: 2014年12月17日
 * Description: Mail抽象类,用于加载配置文件和设置静态量
 */

package org.mail4j;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public abstract class AbstractMailSender {

	/*
	 *静态量, properties 配置文件中对应的变量名
	 */
	private static final String PROTOCOL = "mail.transport.protocol";
	private static final String HOST = "mail.smtp.host";
	private static final String PORT = "mail.smtp.port";
	private static final String FROM = "mail.smtp.from";
	private static final String USERNAME = "mail.smtp.user";
	private static final String PASSWORD = "mail.smtp.password";
	private static final String VALIDATE = "mail.smtp.auth";
	private static final String DEBUG = "mail.debug";
	
	private static Properties configs = new Properties(); //properties 配置文件
	private static Properties props = new Properties(); //创建 Session 实例时需要传递的基本参数
	private static Authenticator authenticator; // 创建 Session 实例时需要传递的认证参数

	private Session session;
	protected Message message;

	/**
	 * 初始化静态量
	 */
	static {
		InputStream inputStream = AbstractMailSender.class
				.getResourceAsStream("mail.properties");
		try {
			configs.load(inputStream);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (inputStream != null) {
					inputStream.close();
				}
			} catch (IOException e) {
			}
		}
		props.put(PROTOCOL, configs.getProperty(PROTOCOL));
		props.put(HOST, configs.getProperty(HOST));
		props.put(PORT, configs.getProperty(PORT));
		props.put(VALIDATE, configs.getProperty(VALIDATE));
		props.put(DEBUG, configs.getProperty(DEBUG));
		authenticator = new Authenticator() {
			@Override
			protected PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication(configs.getProperty(USERNAME), configs.getProperty(PASSWORD));
			}
		};
	}

	/**
	 * 创建邮件即创建 java mail 的 session 和 message实例
	 */
	public void createMail() {
		session = Session.getInstance(props, authenticator);
		message = new MimeMessage(session);
		try {
			//设置邮件发送地址
			message.setFrom(new InternetAddress(configs.getProperty(FROM)));
		} catch (AddressException e) {
			e.printStackTrace();
		} catch (MessagingException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 发送邮件
	 */
	abstract void sendMail();

}

SimpleMailSender

/**
 * file name: SimpleMailSender.java
 * Auther: allen
 * Create Date: 2014年12月17日
 * Description: Mail 实现类
 */

package org.mail4j;

import java.io.File;
import java.util.List;
import java.util.UUID;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;

public class SimpleMailSender extends AbstractMailSender {

	private Multipart multipart; //java mail 中用于存放不同部分邮件内容的容器

	/**
	 * 构造函数,初始化 multipart 实例
	 */
	public SimpleMailSender() {
		multipart = new MimeMultipart();
	}

	@Override
	void sendMail() {
		try {
			//设置邮件内容
			message.setContent(multipart);
			//发送邮件
			Transport.send(message);
		} catch (MessagingException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 设置接收地址
	 * @param tos String 类型的 List
	 */
	public void setTo(List<String> tos) {
		try {
			Address[] to = new Address[tos.size()];
			for (int i = 0; i < tos.size(); i++) {
				to[i] = new InternetAddress(tos.get(i));
			}
			message.setRecipients(RecipientType.TO, to);
		} catch (MessagingException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 设置抄送地址
	 * @param ccs String 类型的 List
	 */
	public void setCc(List<String> ccs) {
		try {
			Address[] cc = new Address[ccs.size()];
			for (int i = 0; i < ccs.size(); i++) {
				cc[i] = new InternetAddress(ccs.get(i));
			}
			message.setRecipients(RecipientType.CC, cc);
		} catch (MessagingException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 设置邮件标题
	 * @param subject String
	 */
	public void setSubject(String subject) {
		try {
			message.setSubject(subject);
		} catch (MessagingException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 在邮件内容中增加文本
	 * @param content String
	 */
	public void addContent(String content) {
		try {
			BodyPart bodyPart = new MimeBodyPart();
			bodyPart.setText(content);
			multipart.addBodyPart(bodyPart);
		} catch (MessagingException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 在邮件内容中增加附件(邮件中添加需要在邮件中显示的图片时使用)
	 * @param attach File 附件
	 * @param header String Content-ID
	 */
	private void addAttach(File attach, String header) {
		try {
			BodyPart bodyPart = new MimeBodyPart();
			DataSource dataSource = new FileDataSource(attach);
			bodyPart.setDataHandler(new DataHandler(dataSource));
			bodyPart.setFileName(attach.getName());
			if(header != null){
				bodyPart.setHeader("Content-ID", "<" + header + ">");
			}
			multipart.addBodyPart(bodyPart);
		} catch (MessagingException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 在邮件内容中增加附件(邮件中单独添加附件时使用)
	 * @param attach File 附件
	 */
	public void addAttach(File attach) {
		addAttach(attach, null);
	}

	/**
	 * 在邮件中添加 html 代码
	 * @param html String
	 */
	public void addHtml(String html) {
		try {
			BodyPart bodyPart = new MimeBodyPart();
			bodyPart.setContent(html, "text/html;charset=utf8");
			multipart.addBodyPart(bodyPart);
		} catch (MessagingException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 在邮件中添加可以显示的图片
	 * @param image File 图片
	 */
	public void addImage(File image){
		try {
			String header = UUID.randomUUID().toString();
			String img = "<img src=\"cid:" + header + "\">";
			addHtml(img);
			addAttach(image, header);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

Client

/**
 * file name: Client.java
 * Auther: allen
 * Create Date: 2014年12月17日
 * Description: 客户端测试类
 */

package org.mail4j;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class Client {

	public static void main(String[] args) {
		SimpleMailSender ss = new SimpleMailSender();
		List<String> tos = new ArrayList<String>();
		tos.add("***@sina.com");
		ss.createMail();
		ss.setSubject("一封复杂的邮件");
		ss.setTo(tos);
		ss.addContent("测试一封复杂的邮件");
		ss.addImage(new File("l.jpg"));
		BufferedReader reader = null;
		try {
			reader = new BufferedReader(new InputStreamReader(
					new FileInputStream(new File("404.html")), "utf-8"));
			String html = "";
			String line = null;
			while ((line = reader.readLine()) != null) {
				html += line;
			}
			ss.addHtml(html);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if(reader != null){
				try {
					reader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		ss.addAttach(new File("attach.txt"));
		ss.sendMail();
	}
}


完整的项目下载地址 http://download.csdn.net/detail/lyisray/8272833


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值