Java 群发邮件

概要:

利用Java Mail API不仅能实现普通的邮件发送,同时还能实现同时给多人发送邮件的功能。本实例将演示如何将邮件抄送实现一对多的发送方式。

| |目录

技术要点

用Java Mail API发送邮件实现群发邮件的技术要点如下。

MimeMessage的setRecipients((Message.RecipientType type,String addresses)方法将指定的接收方类型设置为给定的地址。如果地址参数addresses为null,则移除相应的接收方字段。Message.RecipientType常量如下所示:

  • Message.RecipientType.TO常量表示收件人类型是邮件接收者。

  • Message.RecipientType.CC常量表示收件人类型是抄送者。

  • Message.RecipientType.BCC常量表示收件人的类型是密送者。

准备工作

    相关Jar包 、MailAttorney.java 和 Mail_SendProper.java 获取地址 Java 发送邮件 

代码实现

package net.xsoftlab.baike;
import java.util.Date;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
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;
/**
 * 发送邮件给多个接收者、抄送邮件
 */
public class OneToMany_sender {
	/**
	 * 发送邮件给多个接收者
	 * 
	 * @param mailInfo
	 *            带发送邮件的信息
	 */
	public static boolean sendMailOneToMany(OneToMany_senderInfo Info) {
		MailAttorney authenticator = null;
		if (Info.isIsvalidate()) {// 是否进行身份验证
			authenticator = new MailAttorney(Info.getUserName(),
					Info.getPassword());
		}
		Session sendMailSession = Session.getInstance(Info.getProperties(),
				authenticator);// 根据邮件会话属性和密码验证器构造一个发送邮件的session
		try {
			Message mailMessage = new MimeMessage(sendMailSession);
			Address from = new InternetAddress(Info.getSendAddress());// 创建邮件发送者地址
			mailMessage.setFrom(from);// 创建邮件的接收者地址,并设置到邮件消息中
			Address[] ad = null;// 定义Address型数组,用来存放每个接收者的地址
			String[] receivers = Info.getReceive();// 获得定义好的地址
			if (receivers != null) {
				ad = new InternetAddress[receivers.length];// 为每个邮件接收者创建一个地址
				for (int i = 0; i < receivers.length; i++) {
					ad[i] = new InternetAddress(receivers[i]);
				}
			} else {
				ad = new InternetAddress[1];// 如果进行一对多发送,则发送给默认的接收者
				ad[0] = new InternetAddress(Info.getReceiveAddress());
			}
			mailMessage.setRecipients(Message.RecipientType.TO, ad);// 将所有接收者地址都添加到邮件接收者属性中
			mailMessage.setSubject("一对多邮件发送测试");
			mailMessage.setSentDate(new Date());
			// 设置邮件内容
			Multipart mainPart = new MimeMultipart();
			BodyPart html = new MimeBodyPart();
			html.setContent("我同时发给了三个人
他们收到了吗?", "text/html; charset=GBK");
			mainPart.addBodyPart(html);
			mailMessage.setContent(mainPart);
			Transport.send(mailMessage);// 发送邮件
			return true;
		} catch (MessagingException ex) {
			ex.printStackTrace();
		}
		return false;
	}
	/**
	 * 发送带抄送的邮件
	 * 
	 * @param Info
	 *            待发送邮件的消息
	 */
	public static boolean send_Cc(OneToMany_senderInfo Info) {
		MailAttorney authenticator = null;
		if (Info.isIsvalidate()) {
			authenticator = new MailAttorney(Info.getUserName(),
					Info.getPassword());
		}
		Session sendMailSession = Session.getInstance(Info.getProperties(),
				authenticator);
		try {
			Message mailMessage = new MimeMessage(sendMailSession);
			Address from = new InternetAddress(Info.getSendAddress());// 创建邮件发送者地址
			mailMessage.setFrom(from);
			Address to = new InternetAddress(Info.getReceiveAddress());// 创建邮件的接收者地址,并设置到邮件消息中
			mailMessage.setRecipient(Message.RecipientType.TO, to);
			String[] cc = Info.getCcs();// 获取抄送者信息
			if (cc != null) {
				Address[] ccAdresses = new InternetAddress[cc.length];// 为每个邮件接收者创建一个地址
				for (int i = 0; i < cc.length; i++) {
					ccAdresses[i] = new InternetAddress(cc[i]);
				}
				mailMessage.setRecipients(Message.RecipientType.CC, ccAdresses);// 将抄送者信息设置到邮件信息中
			}
			mailMessage.setSubject("抄送的邮件测试");
			mailMessage.setSentDate(new Date());
			// 设置邮件内容
			Multipart mainPart = new MimeMultipart();
			BodyPart html = new MimeBodyPart();
			html.setContent("发送带抄送的邮件
 测试成功", "text/html; charset=GBK");
			mainPart.addBodyPart(html);
			mailMessage.setContent(mainPart);
			Transport.send(mailMessage); // 发送邮件
			return true;
		} catch (MessagingException ex) {
			ex.printStackTrace();
		}
		return false;
	}
	public static void main(String[] args) {
		// 创建Mail_SendProper类的对象,用于获取邮件的基本信息
		OneToMany_senderInfo mailSender = new OneToMany_senderInfo();
		mailSender.setHost("smtp.163.com");
		mailSender.setPort("25");
		mailSender.setIsvalidate(true);
		mailSender.setUserName("xxx@163.com");
		mailSender.setPassword("xxx");
		mailSender.setSendAddress("xxx@163.com");
		mailSender.setReceiveAddress("xxx@163.com");
		String[] rec = new String[] { "xxx@163.com", "xxx@163.com",
				"xxx@163.com" };
		String[] cc = rec;
		mailSender.setReceive(rec);
		mailSender.setCcs(cc);
		OneToMany_sender.sendMailOneToMany(mailSender);
		OneToMany_sender.send_Cc(mailSender);
	}
	/** 发送多接收者类型邮件的基本信息 */
	public static class OneToMany_senderInfo extends Mail_SendProper {
		private String[] rec; // 定义String数组,用来存放邮件的接收者
		private String[] cc; // 定义String数组,用来存放邮件的抄送者
		public String[] getCcs() {
			return cc;
		}
		public void setCcs(String[] cc) {
			this.cc = cc;
		}
		public String[] getReceive() {
			return rec;
		}
		public void setReceive(String[] rec) {
			this.rec = rec;
		}
	}
}

程序解读

1.OneToMany_senderInfo类

该内部类定义了发送多收件人类型的邮件的基本信息,继承Mail_SendProper,能保存邮件接收者的地址列表和邮件抄送者的地址列表。例如:

private String[]rec;//定义String数组,用来存放邮件的接收者
private String[]cc;//定义String数组,用来存放邮件的抄送者

2.OneToMany_sender类

  1. sendMailOneToMany()方法发送邮件给多个接收者,参数为OneToMany_senderInfo对象。发送邮件的过程与实例176和177相同,故在此就不再做详细的讲解了。本实例的重点在于对邮件的收件人的设置,从OneToMany_senderInfo中获取接收者的地址列表,将每个地址都构造成InternetAddress对象,然后保存到InternetAddress数组中,调用MimeMessage的setRecipients方法,设置邮件的收件人,指定了收件人的类型为Message.RecipientType.TO,收件人的地址列表为InternetAddress数组。

  2. send_Cc()方法的主要功能是实现发送邮件给多个抄送者,参数为OneToMany_senderInfo对象。操作与sendMailOneToMany()方法相似,但是在设置邮件的收件人时,将指定收件人的类型改为Message.RecipientType.CC。


评论关闭
评论 还能输入200
评论关闭
评论 还能输入200
资料加载中...
已关注 , 取消