1、Java邮件开发介绍
为什么要学习javamail开发
现在很多WEB应用在开发时都需要集成邮件发送功能,例如:
给新注册的用户自动发送一封包含其注册信息的欢迎E-Mail。
给过生日的注册会员自动发送一封表示祝贺的E-Mail 。
将网站的最新活动信息通过E-Mail发送给所有的注册会员。
等等 …...
这些功能的实现都需要软件开发人员在开发WEB应用中编写相应的邮件处理程序。
2、邮件服务器和电子邮箱
(1)邮件服务器:
要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器。例如现在Internet很多提供邮件服务的厂商:sina、sohu、163等等他们都有自己的邮件服务器。
这些服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。
(2)电子邮箱:
电子邮箱(E-mail地址)的获得需要在邮件服务器上进行申请 ,确切地说,电子邮箱其实就是用户在邮件服务器上申请的一个帐户。用户在邮件服务器上申请了一个帐号后,邮件服务器就会为这个帐号分配一定的空间,用户从而可以使用这个帐号以及空间,发送电子邮件和保存别人发送过来的电子邮件。
3、邮件传输协议和邮件服务器类型
(1)SMTP协议(发送邮件)
用户连上邮件服务器后,要想给它发送一封电子邮件,需要遵循一定的通迅规则,SMTP协议就是用于定义这种通讯规则的。
因而,通常我们也把处理用户smtp请求(邮件发送请求)的邮件服务器称之为SMTP服务器。(25)
(2)POP3协议(接收)
同样,用户若想从邮件服务器管理的电子邮箱中接收一封电子邮件的话,他连上邮件服务器后,也需要遵循一定的通迅格式,POP3协议用于定义这种通讯格式。
因而,通常我们也把处理用户pop3请求(邮件接收请求)的邮件服务器称之为POP3服务器。(110)
4、电子邮件的传输过程
下图用于演示[email protected]与[email protected]帐户相互发送邮件的过程。
6、手工演示电子邮件的发送
(1)准备实验环境
提前在sohu 和sina上注册一个免费帐号
获取smtp和pop3服务器的名称
sina或 sohu会在其帮助中心里提示管理当前注册帐号的邮件服务器的主机名。
编写base64编码程序对用户名和密码进行编码。
手工使用SMTP协议发送电子邮件
手工使用POP3协议接收电子邮件
(2)如何收发邮件客户端软件 outlook / foxmail
(3)安装本地邮件服务器 – 易邮
outlook 连接本地邮件服务器 IPv6问题
============手动发送邮件==============================
D:\Documents and Settings\park>telnet smtp.sina.cn 25
ehlo park
auth login
aXRoZWltYV9wYXJrQHNpbmEuY24=
cXExMjMzMjE=
mail from:
rcpt to:
Data
from:
to:
subject: 测试邮件
xxx 自作主张
.
Quit
=============Base64编码===============================
public class Base64 {
public static void main(String[] args) throws Exception {
System.out.print("请输入用户名:");
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String userName = in.readLine();
System.out.print("请输入密码:");
String password = in.readLine();
BASE64Encoder encoder = new BASE64Encoder();
System.out.println("编码后的用户名为:"
+ encoder.encode(userName.getBytes()));
System.out.println("编码后的密码为:"
+ encoder.encode(password.getBytes()));
}
}
7、SMTP协议
SMTP协议
(1)ehlo 主机名 (smtp2代)
(2)auth login //经过base64编码后的用户名和密码
(3)mail from:
(4)rcpt to:
(5)Data .号代表邮件内容的结束
(6)quit
8、创建邮件——RFC822文档
(1)RFC822文档规定了如何编写一封简单邮件
邮件头和邮件体,两者使用空行分隔
邮件头
from字段 (发件人)
to字段 (收件人)
subject字段 (邮件标题)
cc(抄送)、bcc字段(暗送)
邮件体
邮件内容
(2)利用RFC822文档漏洞发送假冒邮件
9、POP3协议
POP3协议
(1)user
(2)pass
(3)stat
(4)list
(5)retr
(6)quit
使用POP3协议手工接收邮件
10、使用JavaMail API 创建简单邮件
(1)Message message = new MimeMessage(session);
(2)message.setFrom(new InternetAddress("[email protected]"));
(3)message.setRecipient(RecipientType.TO,
new InternetAddress("[email protected]"));
(4)message.setSubject("简单邮件");
(5)message.setText("简单邮件正文");
11、JavaMail与MyEclipsejar 冲突解决
(1)JavaMail的java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream错误
(2)原因
MyEclipse的javaee.jar中的mail包与JavaMail包冲突
(3)解决
在MyEclipse目录下,找javaee.jar包,用WinRar打包,删除里面的mail目录和activation目录然后加入mail.jar和activition.jar
12、使用JavaMail API收发邮件
JavaMail API按其功能划分通常可分为如下三大类:
创建和解析邮件内容的API :Message类是创建和解析邮件的核心API,它的实例对象代表一封电子邮件。
(1)发送邮件的API:Transport类是发送邮件的核心API类,它的实例对象代表实现了某个邮件发送协议的邮件发送对象,例如SMTP协议。
(2)接收邮件的API:Store类是接收邮件的核心API类,它的实例对象代表实现了某个邮件接收协议的邮件接收对象,例如POP3协议。
(3)Session类
Session类用于定义整个应用程序所需的环境信息,以及收集客户端与邮件服务器建立网络连接的会话信息,如邮件服务器的主机名、端口号、采用的邮件发送和接收协议等。Session对象根据这些信息构建用于邮件收发的Transport和Store对象,以及为客户端创建Message对象时提供信息支持。
13、邮件发送程序
使用JavaMail发送一封简单的邮件:
创建包含邮件服务器的网络连接信息的Session对象。
创建代表邮件内容的Message对象。
创建Transport对象、连接服务器、发送Message、关闭连接。
==============JavaMail发送简单邮件-=====================
@Test
public void test1() throws Exception, MessagingException{
Properties prop = new Properties();
prop.setProperty("mail.transport.protocol", "smtp");
prop.setProperty("mail.smtp.host", "localhost");
// prop.setProperty("mail.smtp.auth", "true");
prop.setProperty("mail.debug", "true");
Session session = Session.getInstance(prop);
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress("[email protected]"));
msg.setRecipient(RecipientType.TO, new InternetAddress("[email protected]"));
msg.setSubject("来自javaMail的测试邮件!");
msg.setText("来自javaMail的正文内容。。");
Transport tran = session.getTransport();
tran.connect("aa", "123");
tran.send(msg, msg.getAllRecipients());
}
=========================================================
public static void main(String[] args) throws MessagingException {
Properties prop = new Properties();
prop.setProperty("mail.transport.protocol", "smtp");
prop.setProperty("mail.smtp.host", "smtp.sina.cn");
prop.setProperty("mail.smtp.auth", "true");
prop.setProperty("mail.debug", "true");
Session session = Session.getInstance(prop);
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress("[email protected]"));
msg.setRecipient(RecipientType.TO, new InternetAddress("[email protected]"));
msg.setSubject("这是我写的标题XXXXXXXXXX");
msg.setText("这是邮件的正文");