用Java Socket实现SMTP邮件发送

目录:

  • 1、邮件基础概念
  • 2、Java Mail API介绍
  • 3、收发邮件代码示例

PS:如果你想直接拿代码用,可以直接跳到第3部分。

**

一、邮件基础概念

**

1.1 邮件服务器和电子邮箱

要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器。例如现在Internet很多提供邮件服务的厂商:sina、sohu、163等等他们都有自己的邮件服务器。

这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。

电子邮箱(E-Mail地址)的获得需要在邮件服务器上进行申请,确切地说,电子邮箱其实就是用户在邮件服务器上申请的一个账户,用户在邮件服务器上申请了一个帐号后,邮件服务器就会为这个账号分配一定的空间,用户从而可以使用这个帐号以及空间发送电子邮件和保存别人发送过来的电子邮件。

1.2 邮件相关的协议

  • 简单邮件传输协议(Simple Mail Transfer PRotocol,SMTP)是一个运行在TCP/ip之上的协议,用它发送和接收电子邮件。SMTP 服务器在默认端口25上监听。SMTP客户使用一组简单的、基于文本的命令与SMTP服务器进行通信。在建立了一个连接后,为了接收响应,SMTP客户首先发出一个命令来标识它们的电子邮件地址。假如SMTP服务器接受了发送者发出的文本命令,它就利用一个OK响应和整数代码确认每一个命令。客户发送的另一个命令意味着电子邮件消息体的开始,消息体以一个圆点“.”加上回车符终止。

  • 邮局协议(Post Office Protocol Version 3,POP3)提供了一种对邮件消息进行排队的标准机制,这样接收者以后才能检索邮件。POP3服务器也运行在TCP/IP之上,并且在默认端口110上监听。在客户和服务器之间进行了初始的会话之后,基于文本的命令序列可以被交换。POP3客户利用用户名和口令向POP3服务器认证。POP3中的认证是在一种未加密的会话基础之上进行的。POP3客户发出一系列命令发送给POP3服务器,如:请求客户邮箱队列的状态、请求列出的邮箱队列的内容和请求检索实际的消息。POP3代表一种存储转发类型的消息传递服务。现在,大部分邮件服务器都采用SMTP发送邮件,同时使用POP3接收电子邮件消息。

  • Internet 消息访问协议(Internet Message access Protocol,IMAP)是一种电子邮件消息排队服务,它对POP3的存储转发限制提供了重要的改进。IMAP也使用基于文本命令的语法在TCP/IP上运行,IMAP服务器一般在默认端口143监听。IMAP服务器答应IMAP客户下载一个电子邮件的头信息,并且不要求将整个消息从服务器下载至客户,这一点与POP3是相同的。IMAP服务器提供了一种排队机制以接收消息,同时必须与SMTP相结合在一起才能发送消息。

这三种协议都有对应SSL加密传输的协议,分别是 SMTPS,POP3S 和 IMAPS 。

MIME(Multipurpose Internet Mail Extensions)
:即多用途因特网邮件扩展标准。它不是邮件传输协议。但对传输内容的消息、附件及其它的内容定义了格式。

1.3 电子邮件的发送和接收过程

通过一张图来说明一封邮件的发送和接收过程,如下图所示:

用Java Socket实现SMTP邮件发送

简单说一下这个邮件收发过程:

1、[email protected] 用户写好一封Email发送到sohu的Smtp服务器。对应于上图的步骤①

2、sohu的Smtp服务器开始处理[email protected] 用户的请求,它会根据收件人的地址判断,当前收件人是不是自己管辖的用户,如果是,就直接将Email存放到为该收件人的分配的邮箱空间当中。sohu的Smtp服务器判断收件人地址发现,这一封Email的收件人[email protected] 是Sina的邮件服务器管理的,于是又将Email转发给Sina的Smtp服务器。对应于上图的步骤②

3、Sina的Smtp服务器开始处理sohu的Smtp服务器发送过来的Email,Sina的Smtp服务器根据收件人的地址判断,发现收件人自己管辖的用户,于是就直接将Email存放到为[email protected] 用户的分配的邮箱空间当中。对应于上图的步骤③。

4、[email protected] 用户将邮件发出去之后,就通知[email protected] 用户去收取。[email protected] 用户于是就连接上Sina的POP3服务器收取邮件,对应于上图的步骤④。

5、POP3服务器从[email protected] 用户的邮箱空间当中取出Email,对应于步骤⑤。

6、POP3服务器将取出来的Email发给[email protected] 用户,对应于步骤⑥。

**

二、Java Mail API

**

JavaMail 是由 Sun 发布的用来处理 email 的 API 。它并没有包含在 Java SE 中,而是作为 Java EE 的一部分。

mail.jar :此 JAR 文件包含 JavaMail API 和 Sun 提供的 SMTP 、 IMAP 和 POP3 服务提供程序;

activation.jar :此 JAR 文件包含 JAF API 和 Sun 的实现。

JavaMail 包中用于处理电子邮件的核心类是: Properties 、 Session 、 Message 、 Address 、 Authenticator 、 Transport 、 Store 等。

2.1、Java mail 传输过程

用Java Socket实现SMTP邮件发送

如上图,电子邮件的处理步骤如下:

  • 创建一个 Session 对象。
  • Session 对象创建一个 Transport 对象 /Store 对象,用来发送 / 保存邮件。
  • Transport 对象 /Store 对象连接邮件服务器。
  • Transport 对象 /Store 对象创建一个 Message 对象 ( 也就是邮件内容 ) 。
  • Transport 对象发送邮件; Store 对象获取邮箱的邮件。

2.2、JavaMail 的核心类

JavaMail 对收发邮件进行了高级的抽象,形成了一些关键的的接口和类,它们构成了程序的基础,下面我们分别来了解一下这些最常见的对象。

2.2.1 java.util.Properties 类 ( 属性对象 )

java.util.Properties 类代表一组属性集合。

它的每一个键和值都是 String 类型。

由于 JavaMail 需要和邮件服务器进行通信,这就要求程序提供许多诸如服务器地址、端口、用户名、密码等信息, JavaMail 通过 Properties 对象封装这些属性信息。

例: 如下面的代码封装了几个属性信息:

Properties prop = new Properties();
prop.setProperty("mail.debug", "true");
prop.setProperty("mail.host", "[email protected]");
prop.setProperty("mail.transport.protocol", "smtp");
prop.setProperty("mail.smtp.auth", "true");

针对不同的的邮件协议, JavaMail 规定了服务提供者必须支持一系列属性,

下表是一些常见属性(属性值都以 String 类型进行设置,属性类型栏仅表示属性是如何被解析的):

用Java Socket实现SMTP邮件发送

2.2.2、javax.mail.Session 类 ( 会话对象 )

Session 表示一个邮件会话。

Session 的主要作用包括两个方面:

接收各种配置属性信息:通过 Properties 对象设置的属性信息;

初始化 JavaMail 环境:根据 JavaMail 的配置文件,初始化 JavaMail 环境,以便通过 Session 对象创建其他重要类的实例。

JavaMail 在 Jar 包的 META-INF 目录下,通过以下文件提供了基本配置信息,以便 session 能够根据这个配置文件加载提供者的实现类:

javamail.default.providers ;

javamail.default.address.map 。

用Java Socket实现SMTP邮件发送

例:

Properties props = new Properties();
props.setProperty("mail.transport.protocol", "smtp");
Session session = Session.getInstance(props);

2.2.3、javax.mail.Transport 类 ( 邮件传输 )

邮件操作只有发送或接收两种处理方式。

JavaMail 将这两种不同操作描述为传输( javax.mail.Transport )和存储( javax.mail.Store ),传输对应邮件的发送,而存储对应邮件的接收。

getTransport : Session 类中的 getTransport () 有多个重载方法,可以用来创建 Transport 对象。

connect : 如果设置了认证命令—— mail.smtp.auth ,那么使用 Transport 类的 connect 方法连接服务器时,则必须加上用户名和密码。

sendMessage : Transport 类的 sendMessage 方法用来发送邮件消息。

close : Transport 类的 close 方法用来关闭和邮件服务器的连接。

2.2.4、javax.mail.Store 类 ( 邮件存储 )

getStore : Session 类中的 getStore () 有多个重载方法,可以用来创建 Store 对象。

connect : 如果设置了认证命令—— mail.smtp.auth ,那么使用 Store 类的 connect 方法连接服务器时,则必须加上用户名和密码。

getFolder : Store 类的 getFolder 方法可以 获取邮箱内的邮件夹 Folder 对象

close : Store 类的 close 方法用来关闭和邮件服务器的连接。

2.2.5、javax.mail.Message( 消息对象 )

javax.mail.Message 是个抽象类,只能用子类去实例化,多数情况下为 javax.mail.internet.MimeMessage 。

MimeMessage 代表 MIME 类型的电子邮件消息。

要创建一个 Message ,需要将 Session 对象传递给 MimeMessage 构造器:

MimeMessage message = new MimeMessage(session);

注意:还存在其它构造器,如用按 RFC822 格式的输入流来创建消息。

setFrom :设置邮件的发件人

setRecipient :设置邮件的发送人、抄送人、密送人

三种预定义的地址类型是:

Message.RecipientType.TO :收件人

Message.RecipientType.CC :抄送人

Message.RecipientType.BCC :密送人

setSubject :设置邮件的主题

setContent :设置邮件内容

setText :如果邮件内容是纯文本,可以使用此接口设置文本内容。

MimeMessage结构介绍:

MimeMessage 类:代表整封邮件。

MimeBodyPart 类:代表邮件的一个 MIME 信息。

MimeMultipart 类:代表一个由多个 MIME 信息组合成的组合 MIME 信息。

用Java Socket实现SMTP邮件发送

2.2.6、javax.mail.Address( 地址 )

一旦您创建了 Session 和 Message ,并将内容填入消息后,就可以用 Address 确定信件地址了。和 Message 一样, Address 也是个抽象类。您用的是 javax.mail.internet.InternetAddress 类。

若创建的地址只包含电子邮件地址,只要传递电子邮件地址到构造器就行了。

例:

Address address = new InternetAddress("[email protected]");

2.2.7、 Authenticator :认证者

java.net 类一样, JavaMail API 也可以利用 Authenticator 通过用户名和密码访问受保护的资源。对于 JavaMail API 来说,这些资源就是邮件服务器。 JavaMail Authenticator 在 javax.mail 包中,而且它和 java.net 中同名的类 Authenticator 不同。两者并不共享同一个 Authenticator ,因为 JavaMail API 用于 Java 1.1 ,它没有 java.net 类别。

要使用 Authenticator ,先创建一个抽象类的子类,并从 getPasswordAuthentication() 方法中返回 PasswordAuthentication 实例。创建完成后,您必需向 session 注册 Authenticator 。然后,在需要认证的时候,就会通知 Authenticator 。您可以弹出窗口,也可以从配置文件中(虽然没有加密是不安全的)读取用户名和密码,将它们作为 PasswordAuthentication 对象返回给调用程序。

例:

Properties props = new Properties();
Authenticator auth = new MyAuthenticator();
Session session = Session.getDefaultInstance(props, auth);

**

三、收发邮件代码示例

**

3.1 发送文本邮件

 public static void main(String[] args) throws Exception {
 Properties prop = new Properties();
 prop.setProperty("mail.debug", "true");
 prop.setProperty("mail.host", MAIL_SERVER_HOST);
 prop.setProperty("mail.transport.protocol", "smtp");
 prop.setProperty("mail.smtp.auth", "true");
 // 1、创建session
 Session session = Session.getInstance(prop);
 Transport ts = null;
 // 2、通过session得到transport对象
 ts = session.getTransport();
 // 3、连上邮件服务器
 ts.connect(MAIL_SERVER_HOST, USER, PASSWORD);
 // 4、创建邮件
 MimeMessage message = new MimeMessage(session);
 // 邮件消息头
 message.setFrom(new InternetAddress(MAIL_FROM)); // 邮件的发件人
 message.setRecipient(Message.RecipientType.TO, new InternetAddress(MAIL_TO)); // 邮件的收件人
 message.setRecipient(Message.RecipientType.CC, new InternetAddress(MAIL_CC)); // 邮件的抄送人
 message.setRecipient(Message.RecipientType.BCC, new InternetAddress(MAIL_BCC)); // 邮件的密送人
 message.setSubject("测试文本邮件"); // 邮件的标题
 // 邮件消息体
 message.setText("天下无双。");
 // 5、发送邮件
 ts.sendMessage(message, message.getAllRecipients());
 ts.close();
}

3.2 发送 HTML 格式的邮件

public static void main(String[] args) throws Exception {
 Properties prop = new Properties();
 prop.setProperty("mail.debug", "true");
 prop.setProperty("mail.host", MAIL_SERVER_HOST);
 prop.setProperty("mail.transport.protocol", "smtp");
 prop.setProperty("mail.smtp.auth", "true");
 // 1、创建session
 Session session = Session.getInstance(prop);
 Transport ts = null;
 // 2、通过session得到transport对象
 ts = session.getTransport();
 // 3、连上邮件服务器
 ts.connect(MAIL_SERVER_HOST, USER, PASSWORD);
 // 4、创建邮件
 MimeMessage message = new MimeMessage(session);
 // 邮件消息头
 message.setFrom(new InternetAddress(MAIL_FROM)); // 邮件的发件人
 message.setRecipient(Message.RecipientType.TO, new InternetAddress(MAIL_TO)); // 邮件的收件人
 message.setRecipient(Message.RecipientType.CC, new InternetAddress(MAIL_CC)); // 邮件的抄送人
 message.setRecipient(Message.RecipientType.BCC, new InternetAddress(MAIL_BCC)); // 邮件的密送人
 message.setSubject("测试HTML邮件"); // 邮件的标题
 String htmlContent = "<h1>Hello</h1>" + "<p>显示图片<img src='cid:abc.jpg'>1.jpg</p>";
 MimeBodyPart text = new MimeBodyPart();
 text.setContent(htmlContent, "text/html;charset=UTF-8");
 MimeBodyPart image = new MimeBodyPart();
 DataHandler dh = new DataHandler(new FileDataSource("D://[04]Temp//img//1.jpg"));
 image.setDataHandler(dh);
 image.setContentID("abc.jpg");
 // 描述数据关系
 MimeMultipart mm = new MimeMultipart();
 mm.addBodyPart(text);
 mm.addBodyPart(image);
 mm.setSubType("related");
 message.setContent(mm);
 message.saveChanges();
 // 5、发送邮件
 ts.sendMessage(message, message.getAllRecipients());
 ts.close();
}

3.3 发送带附件的邮件

public static void main(String[] args) throws Exception {
 Properties prop = new Properties();
 prop.setProperty("mail.debug", "true");
 prop.setProperty("mail.host", MAIL_SERVER_HOST);
 prop.setProperty("mail.transport.protocol", "smtp");
 prop.setProperty("mail.smtp.auth", "true");
 // 1、创建session
 Session session = Session.getInstance(prop);
 Transport ts = null;
 // 2、通过session得到transport对象
 ts = session.getTransport();
 // 3、连上邮件服务器
 ts.connect(MAIL_SERVER_HOST, USER, PASSWORD);
 // 4、创建邮件
 MimeMessage message = new MimeMessage(session);
 // 邮件消息头
 message.setFrom(new InternetAddress(MAIL_FROM)); // 邮件的发件人
 message.setRecipient(Message.RecipientType.TO, new InternetAddress(MAIL_TO)); // 邮件的收件人
 message.setRecipient(Message.RecipientType.CC, new InternetAddress(MAIL_CC)); // 邮件的抄送人
 message.setRecipient(Message.RecipientType.BCC, new InternetAddress(MAIL_BCC)); // 邮件的密送人
 message.setSubject("测试带附件邮件"); // 邮件的标题
 MimeBodyPart text = new MimeBodyPart();
 text.setContent("邮件中有两个附件。", "text/html;charset=UTF-8");
 // 描述数据关系
 MimeMultipart mm = new MimeMultipart();
 mm.setSubType("related");
 mm.addBodyPart(text);
 String[] files = {
   "D://[04]Temp//img//1.jpg", "D://[04]Temp//img//2.jpg"
 };
 // 添加邮件附件
 for (String filename : files) {
  MimeBodyPart attachPart = new MimeBodyPart();
  attachPart.attachFile(filename);
  mm.addBodyPart(attachPart);
 }
 message.setContent(mm);
 message.saveChanges();
 // 5、发送邮件
 ts.sendMessage(message, message.getAllRecipients());
 ts.close();
}

3.4 获取邮箱中的邮件

public class StoreMail {
 final static String USER = "robot"; // 用户名
 final static String PASSWORD = "password520"; // 密码
 public final static String MAIL_SERVER_HOST = "mail.***.com"; // 邮箱服务器
 public final static String TYPE_HTML = "text/html;charset=UTF-8"; // 文本内容类型
 public final static String MAIL_FROM = "[email protected]"; // 发件人
 public final static String MAIL_TO = "[email protected]"; // 收件人
 public final static String MAIL_CC = "[email protected]"; // 抄送人
 public final static String MAIL_BCC = "[email protected]"; // 密送人
 public static void main(String[] args) throws Exception {
  // 创建一个有具体连接信息的Properties对象
  Properties prop = new Properties();
  prop.setProperty("mail.debug", "true");
  prop.setProperty("mail.store.protocol", "pop3");
  prop.setProperty("mail.pop3.host", MAIL_SERVER_HOST);
  // 1、创建session
  Session session = Session.getInstance(prop);
  // 2、通过session得到Store对象
  Store store = session.getStore();
  // 3、连上邮件服务器
  store.connect(MAIL_SERVER_HOST, USER, PASSWORD);
  // 4、获得邮箱内的邮件夹
  Folder folder = store.getFolder("inbox");
  folder.open(Folder.READ_ONLY);
  // 获得邮件夹Folder内的所有邮件Message对象
  Message[] messages = folder.getMessages();
  for (int i = 0; i < messages.length; i++) {
   String subject = messages[i].getSubject();
   String from = (messages[i].getFrom()[0]).toString();
   System.out.println("第 " + (i + 1) + "封邮件的主题:" + subject);
   System.out.println("第 " + (i + 1) + "封邮件的发件人地址:" + from);
  }
  // 5、关闭
  folder.close(false);
  store.close();
 }
}

3.5 转发邮件

例:获取指定邮件夹下的第一封邮件并转发

public static void main(String[] args) throws Exception {
 Properties prop = new Properties();
 prop.put("mail.store.protocol", "pop3");
 prop.put("mail.pop3.host", MAIL_SERVER_HOST);
 prop.put("mail.pop3.starttls.enable", "true");
 prop.put("mail.smtp.auth", "true");
 prop.put("mail.smtp.host", MAIL_SERVER_HOST);
 // 1、创建session
 Session session = Session.getDefaultInstance(prop);
 // 2、读取邮件夹
 Store store = session.getStore("pop3");
 store.connect(MAIL_SERVER_HOST, USER, PASSWORD);
 Folder folder = store.getFolder("inbox");
 folder.open(Folder.READ_ONLY);
 // 获取邮件夹中第1封邮件信息
 Message[] messages = folder.getMessages();
 if (messages.length <= 0) {
  return;
 }
 Message message = messages[0];
 // 打印邮件关键信息
 String from = InternetAddress.toString(message.getFrom());
 if (from != null) {
  System.out.println("From: " + from);
 }
 String replyTo = InternetAddress.toString(message.getReplyTo());
 if (replyTo != null) {
  System.out.println("Reply-to: " + replyTo);
 }
 String to = InternetAddress.toString(message.getRecipients(Message.RecipientType.TO));
 if (to != null) {
  System.out.println("To: " + to);
 }
 String subject = message.getSubject();
 if (subject != null) {
  System.out.println("Subject: " + subject);
 }
 Date sent = message.getSentDate();
 if (sent != null) {
  System.out.println("Sent: " + sent);
 }
 // 设置转发邮件信息头
 Message forward = new MimeMessage(session);
 forward.setFrom(new InternetAddress(MAIL_FROM));
 forward.setRecipient(Message.RecipientType.TO, new InternetAddress(MAIL_TO));
 forward.setSubject("Fwd: " + message.getSubject());
 // 设置转发邮件内容
 MimeBodyPart bodyPart = new MimeBodyPart();
 bodyPart.setContent(message, "message/rfc822");
 Multipart multipart = new MimeMultipart();
 multipart.addBodyPart(bodyPart);
 forward.setContent(multipart);
 forward.saveChanges();
 Transport ts = session.getTransport("smtp");
 ts.connect(USER, PASSWORD);
 ts.sendMessage(forward, forward.getAllRecipients());
 folder.close(false);
 store.close();
 ts.close();
 System.out.println("message forwarded successfully....");
}

3.6 收发完整示例

3.6.1 邮件服务器 MailServer.java

import java.util.List;
import java.util.Properties;
 
import javax.mail.Authenticator;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
 
/**
 * 简单邮件发送器,可单发,群发。
 * 
 * @author humingfeng
 * 
 */
public class MailServer {
 
	/**
	 * 发送邮件的props文件
	 */
	private final transient Properties props = System.getProperties();
	/**
	 * 邮件服务器登录验证
	 */
	private transient MailAuthenticator authenticator;
 
	/**
	 * 邮箱session
	 */
	private transient Session session;
 
	/**
	 * 初始化邮件发送器
	 * 
	 * @param smtpHostName
	 *            SMTP邮件服务器地址
	 * @param username
	 *            发送邮件的用户名(地址)
	 * @param password
	 *            发送邮件的密码
	 */
	public MailServer(final String smtpHostName, final String username,
			final String password) {
		init(username, password, smtpHostName);
	}
 
	/**
	 * 初始化邮件发送器
	 * 
	 * @param username
	 *            发送邮件的用户名(地址),并以此解析SMTP服务器地址
	 * @param password
	 *            发送邮件的密码
	 */
	public MailServer(final String username, final String password) {
		// 通过邮箱地址解析出smtp服务器,对大多数邮箱都管用
		final String smtpHostName = "smtp." + username.split("@")[1];
		init(username, password, smtpHostName);
 
	}
 
	/**
	 * 初始化
	 * 
	 * @param username
	 *            发送邮件的用户名(地址)
	 * @param password
	 *            密码
	 * @param smtpHostName
	 *            SMTP主机地址
	 */
	private void init(String username, String password, String smtpHostName) {
		// 初始化props
		props.put("mail.smtp.auth", "true");
		props.put("mail.smtp.host", smtpHostName);
		if(smtpHostName==null)props.put("mail.smtp.host", smtpHostName);
		// 验证
		authenticator = new MailAuthenticator(username, password);
		// 创建session
		session = Session.getInstance(props, authenticator);
	}
 
	/**
	 * 发送邮件
	 * 
	 * @param recipient
	 *            收件人邮箱地址
	 * @param subject
	 *            邮件主题
	 * @param content
	 *            邮件内容
	 * @throws AddressException
	 * @throws MessagingException
	 */
	public void send(String recipient, String subject, Object content)
			throws AddressException, MessagingException {
		// 创建mime类型邮件
		final MimeMessage message = new MimeMessage(session);
		// 设置发信人
		message.setFrom(new InternetAddress(authenticator.getUsername()));
		// 设置收件人
		if(recipient!=null&&recipient.indexOf(";")!=-1){
			//多收件人
			String[] rec = recipient.split(";");
			int len = rec.length;
			InternetAddress[] iad = new InternetAddress[len];
			for(int i=0; i<len; i++){
				iad[i] =  new InternetAddress(rec[i]);
			}
			message.setRecipients(RecipientType.TO, iad);
		}else{
			//单收件人
			message.setRecipient(RecipientType.TO, new InternetAddress(recipient));
		}
		// 设置主题
		message.setSubject(subject);
		// 设置邮件内容
		message.setContent(content.toString(), "text/html;charset=utf-8");
//		message.setText(content.toString(), "GBK");
		// 发送
		Transport.send(message);
	}
 
	/**
	 * 群发邮件
	 * 
	 * @param recipients
	 *            收件人们
	 * @param subject
	 *            主题
	 * @param content
	 *            内容
	 * @throws AddressException
	 * @throws MessagingException
	 */
	public void send(List<String> recipients, String subject, Object content)
			throws AddressException, MessagingException {
		// 创建mime类型邮件
		final MimeMessage message = new MimeMessage(session);
		// 设置发信人
		message.setFrom(new InternetAddress(authenticator.getUsername()));
		// 设置收件人们
		final int num = recipients.size();
		InternetAddress[] addresses = new InternetAddress[num];
		for (int i = 0; i < num; i++) {
			addresses[i] = new InternetAddress(recipients.get(i));
		}
		message.setRecipients(RecipientType.TO, addresses);
		// 设置主题
		message.setSubject(subject);
		// 设置邮件内容
		message.setContent(content.toString(), "text/html;charset=utf-8");
		// 发送
		Transport.send(message);
	}
 
	/**
	 * 服务器邮箱登录验证
	 * 
	 * @author MZULE
	 * 
	 */
	public class MailAuthenticator extends Authenticator {
 
		/**
		 * 用户名(登录邮箱)
		 */
		private String username;
		/**
		 * 密码
		 */
		private String password;
 
		/**
		 * 初始化邮箱和密码
		 * 
		 * @param username
		 *            邮箱
		 * @param password
		 *            密码
		 */
		public MailAuthenticator(String username, String password) {
			this.username = username;
			this.password = password;
		}
 
		String getPassword() {
			return password;
		}
 
		@Override
		protected PasswordAuthentication getPasswordAuthentication() {
			return new PasswordAuthentication(username, password);
		}
 
		String getUsername() {
			return username;
		}
 
		public void setPassword(String password) {
			this.password = password;
		}
 
		public void setUsername(String username) {
			this.username = username;
		}
 
	}
}

3.6.2 SendClient

import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
 
 
/**
 * @author 
 *
 */
public class MailSender {
    /**
     * 服务邮箱
     */
    private static MailServer mailServer = null;
 
	//
	private static String userName;
 
	
	private static String password;
 
	
	private static String stmp;
 
	/**
	 * @param userName the userName to set
	 */
	public void setUserName(String userName) {
		if(MailSender.userName==null)
			MailSender.userName = userName;
	}
	/**
	 * @param password the password to set
	 */
	public void setPassword(String password) {
		if(MailSender.password==null)
			MailSender.password = password;
	}
	/**
	 * @param stmp the stmp to set
	 */
	public void setStmp(String stmp) {
		if(MailSender.stmp==null)
			MailSender.stmp = stmp;
	}
    /**
     * 使用默认的用户名和密码发送邮件
     * @param recipient
     * @param subject
     * @param content
     * @throws MessagingException 
     * @throws AddressException 
     */
    public static void sendHtml(String recipient, String subject, Object content) throws AddressException, MessagingException{
    	if (mailServer == null) 
        	mailServer = new MailServer(stmp,userName,password);
    	mailServer.send(recipient, subject, content);
    }
    /**
     * 使用指定的用户名和密码发送邮件
     * @param server
     * @param password
     * @param recipient
     * @param subject
     * @param content
     * @throws MessagingException 
     * @throws AddressException 
     */
    public static void sendHtml(String server,String password,String stmpIp, String recipient, String subject, Object content) throws AddressException, MessagingException{
    	 new MailServer(stmpIp,server,password).send(recipient, subject, content);
    }
    public static void main(String[] args) {
    	try {
    		String s = "ceshi2:<br/>您好,我在给你们演示发邮件看见了没.";
			sendHtml("[email protected]","password","IP", "[email protected]", "我是是是", s);
		} catch (AddressException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (MessagingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}