最近写的项目中,注册模块需要给注册用户发送一封邮件用于激活,在网上查了一下,有很多相关的资料,代码实现很简单,就把最近看的整理一下
一、关于邮件开发的基本概念
1.电子邮件服务器:是处理邮件交换的软硬件设施的总称,包括电子邮件程序、电子邮件箱等。它是为用户提供全由E-mail服务的电子邮件系统,人们通过访问服务器实现邮件的交换。服务器程序通常不能由用户启动,而是一直在系统中运行,它一方面负责把本机器上发出的E-mail发送出去,另一方面负责接收其他主机发过来的E-mail,并把各种电子邮件分发给每个用户。现在网上有很多提供邮件服务的厂商,例如:163、126、sina、sohu等。
2.电子邮箱(E-MAIL BOX):通过网络电子邮局为网络客户提供的网络交流的电子信息空间。它需要在邮件服务器上进行申请获得,具有存储和收发电子信息的功能,是因特网中最重要的信息交流工具。在网络中,电子邮箱可以自动接收网络任何电子邮箱所发的电子邮件,并能存储规定大小的等多种格式的电子文件。电子邮箱具有单独的网络域名,其电子邮局地址在@后标注。
3.邮件协议:指用户在客户端计算机上可以通过哪些方式进行电子邮件的发送和接收。常见的协议有SMTP、POP3和IMAP
SMTP协议
SMTP称为简单邮件传输协议,可以向用户提供高效、可靠的邮件传输方式。SMTP的一个重要特点是它能够在传送过程中转发电子邮件,即邮件可以通过不同网络上的邮件服务器转发到其他的邮件服务器。 SMTP协议工作在两种情况下:一是电子邮件从客户机传输到邮件服务器;二是从某一台邮件服务器传输到另一台邮件服务器。SMTP是个请求/响应协议,它监听25号端口,用于接收用户的邮件请求,并与远端邮件服务器建立SMTP连接。 |
POP3协议
POP称为邮局协议,用于电子邮件的接收,它使用TCP的110端口,常用的是第三版,所以简称为POP3。 POP3仍采用C/S工作模式。当客户机需要服务时,客户端的软件(如Outlook Express)将与POP3服务器建立TCP连接,然后要经过POP3协议的3种工作状态:首先是认证过程,确认客户机提供的用户名和密码;在认证通过后便转入处理状态,在此状态下用户可收取自己的邮件,在完成相应操作后,客户机便发出quit命令;此后便进入更新状态,将作删除标记的邮件从服务器端删除掉。到此为止,整个POP过程完成。 |
IMAP协议
IMAP称为Internet信息访问协议,主要提供的是通过Internet获取信息的一种协议。IMAP像POP3那样提供了方便的邮件下载服务,让用户能进行离线阅读,但IMAP能完成的却远远不只这些。IMAP提供的摘要浏览功能可以让你在阅读完所有的邮件到达时间、主题、发件人、大小等信息后再作出是否下载的决定。 |
想进一步了解这些协议,可以查看RFC文档,http://man.chinaunix.net/develop/rfc/default.htm(中文)
二、使用JavaMail实现邮件发送
JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口。它是Sun发布的用来处理email的API。虽然JavaMail是Sun的API之一,但它目前还没有被加在标准的java开发工具包中(Java Development Kit),这就意味着你在使用前必须另外下载JavaMail文件。除此以外,你还需要有Sun的JavaBeans Activation Framework (JAF),是一个专用的数据处理框架,它用于封装数据,并为应用程序提供访问和操作数据的接口,JavaMail API可以利用JAF从某种数据源中读取数据和获知数据的MIME类型,并用这些数据生成MIME消息中的消息体和消息类型。
JavaMail的下载地址:http://www.oracle.com/technetwork/java/javamail/index.html
JAF的下载地址:http://www.oracle.com/technetwork/articles/java/index-135046.html(不过jdk1.6及以上版本包含了JAF的jar包)
1.JavaMail核心API
Message
Message他的实例对象代表一封电子邮件,用于封装邮件的信息。Message是一个抽象类,已知子类是MimeMessage.
常用的方法
void | setFrom(Address address) | 发件人 |
void | setSubject(String subject) | 主题 |
void | setContent(Object o, String type) | 内容 |
void | setRecipients(Message.RecipientType type, Address[] addresses) | 收件人 |
邮件的抄送,暗送(密送)?
比如,我发了一封邮件给a,抄送给b,密送给c。
表明:
1.我希望a去做邮件要求的事或者我要告知a某件事,这封邮件a是应该要看的。
2.我只是告知b有这封邮件或者告知b我做了这件事,b不需要办理邮件中的事项。
3.我希望c知道这件事,同时不希望ab知道我告诉了c。
4.a、b可以看到邮件发给了他们,不能看到发给了c,c可以看到邮件发送给了a、b
Transport
Transport类是发送邮件的核心API类,它的实例对象代表实现了某个邮件发送协议的邮件发送对象,例如SMTP协议
常用的方法
void | connect(String host, int port, String user, String password) |
static void | send(Message msg, Address[] addresses) |
abstract void | sendMessage(Message msg, Address[] addresses) |
Store
Store类是接收邮件的核心API类,它的实例对象代表实现了某个邮件接收协议的邮件接收对象,例如POP3协议。
Session
Session类用于定义整个应用程序所需的环境信息,以及收集客户端与邮件服务器建立网络连接的会话信息,如邮件服务器的主机名、端口号、采用的邮件发送和接收协议等。Session对象根据这些信息构建用于邮件收发的Transport和Store对象,以及为客户端创建Message对象时提供信息支持
static Session | getInstance(Properties props) |
Transport | getTransport() |
void | setDebug(boolean debug) |
2.发送一封简单邮件
public class SendMail {
public static void main(String[] args) throws Exception {
Properties props = new Properties();
props.setProperty("mail.smtp.auth", "true");//指定邮件发送的协议
props.setProperty("mail.transport.protocol", "smtp");//指定发送邮件的服务器地址
//邮件发送所需要的环境信息
Session session = Session.getInstance(props);
session.setDebug(true);//debug调试
//创建一封邮件
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("[email protected]"));//发送人
message.setSubject("中文主题");
message.setContent("hello
","text/html;charset=utf-8");
Transport transport = session.getTransport();
transport.connect("smtp.sina.com", 25, "wd_frank", "xxxxxx");//连接发送邮件的邮件服务器
transport.sendMessage(message, new Address[]{new InternetAddress("[email protected]")});//发送给收件人
transport.close();
}
}
public class SendMail {
public static void main(String[] args) throws Exception {
Properties props = new Properties();
props.setProperty("mail.smtp.auth", "true");//指定邮件发送的协议
props.setProperty("mail.transport.protocol", "smtp");//指定发送邮件的服务器地址
props.setProperty("mail.host", "smtp.sina.com");
//邮件发送所需要的环境信息
Session session = Session.getInstance(props,
new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("wd_frank", "xxxxxx");
}
}
);
session.setDebug(true);//debug调试
//创建一封邮件
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("[email protected]"));
message.setSubject("中文主题");
message.setRecipients(RecipientType.TO, InternetAddress.parse("[email protected]"));
message.setContent("hello
", "text/html;charset=utf-8");
//发送
Transport.send(message);
}
}
debug:
3.发送一封复杂邮件(图片,附件)
public class SendMail {
public static void main(String[] args) throws Exception {
Properties props = new Properties();
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.host", "smtp.sina.com");
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("wd_frank", "wd123456");
}
});
MimeMessage message = new MimeMessage(session);
// 正文
MimeMultipart multipart = new MimeMultipart("mixed");
message.setContent(multipart);
message.setSubject("复杂邮件");
message.setFrom(new InternetAddress("\"" + MimeUtility.encodeText("王小二") + "\" "));
message.setReplyTo(new Address[] { new InternetAddress("[email protected]") });
message.setRecipients(RecipientType.TO, InternetAddress.parse(""));
// 这封邮件由2个附件和邮件正文组成
MimeBodyPart attch1 = new MimeBodyPart();// 附件1
MimeBodyPart attch2 = new MimeBodyPart();// 附件2
MimeBodyPart content = new MimeBodyPart();// 邮件内容
// 把附件和内容组合到multipart中
multipart.addBodyPart(attch1);
multipart.addBodyPart(attch2);
multipart.addBodyPart(content);
// 第一个附件
DataSource ds1 = new FileDataSource("E:\\mail\\note.txt");
DataHandler dh1 = new DataHandler(ds1);
attch1.setDataHandler(dh1);
// 附件名(点击查看,下载)
attch1.setFileName(MimeUtility.encodeText("笔记.txt"));
// 第二个附件
DataSource ds2 = new FileDataSource("E:\\mail\\dog.jpg");
DataHandler dh2 = new DataHandler(ds2);
attch2.setDataHandler(dh2);
attch2.setFileName("dog.jpg");
/**
* 设置正文内容 包括HTML正文和显示一张图片
*/
MimeMultipart bodyMultipart = new MimeMultipart("related");
content.setContent(bodyMultipart);
// 构造正文
MimeBodyPart htmlPart = new MimeBodyPart();
MimeBodyPart gifPart = new MimeBodyPart();
bodyMultipart.addBodyPart(htmlPart);
bodyMultipart.addBodyPart(gifPart);
// 正文图片
DataSource gifds = new FileDataSource("E:\\mail\\th.jpg");
DataHandler gifdh = new DataHandler(gifds);
gifPart.setDataHandler(gifdh);
gifPart.setHeader("Content-Location", "https://www.csdn.net/th.jpg");
// HTML正文
htmlPart.setContent("复杂邮件 ","text/html;charset=utf-8");
message.saveChanges();
Transport.send(message);
}
}