邮件原理与JavaMail开发
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、电子邮件的传输过程
下图用于演示lisi@sina.com与wangwu@sohu.com帐户相互发送邮件的过程。
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:<itheima_park@sina.cn>
rcpt to:<itheima_park@sohu.com>
Data
from:<itheima_park@sina.cn>
to:<itheima_park@sohu.com>
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:<itcast1111@sohu.com>
(4)rcpt to:<itcast1111@sina.com>
(5)Data .号代表邮件内容的结束
(6)quit
8、创建邮件——RFC822文档
(1)RFC822文档规定了如何编写一封简单邮件
邮件头和邮件体,两者使用空行分隔
邮件头
from字段 (发件人)
to字段 (收件人)
subject字段 (邮件标题)
cc(抄送)、bcc字段(暗送)
邮件体
邮件内容
(2)利用RFC822文档漏洞发送假冒邮件
9、POP3协议
POP3协议
(1)user<SP>username<CRLF>
(2)pass<SP>password<CRLF>
(3)stat<CRLF> 返回邮箱的统计信息
(4)list<SP>[msg#]<CRLF>返回某一封邮件的统计信息
(5)retr<SP>msg#<CRLF> 最重要的一个命令
(6)quit<CRLF>
使用POP3协议手工接收邮件
10、使用JavaMail API 创建简单邮件
(1)Message message = new MimeMessage(session);
(2)message.setFrom(new InternetAddress("aaa@estore.com"));
(3)message.setRecipient(RecipientType.TO,
new InternetAddress("bbb@estore.com"));
(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("aa@park.cn"));
msg.setRecipient(RecipientType.TO, new InternetAddress("bb@park.cn"));
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("itheima_park@sina.cn"));
msg.setRecipient(RecipientType.TO, new InternetAddress("itheima_park@sohu.com"));
msg.setSubject(&q
补充:软件开发 , Java ,