JAVA邮件开发
---------------------- android培训、 java培训、期待与您交流! ----------------------
课程目标
●用程序代码生成一封带附件和内嵌图片的复杂邮件
●用自己的程序代码将复杂邮件发送出去
●一些特殊的经验和高级应用
1.中文名的邮件附件的乱码问题
2.TOMACAT中JAVAMAIL指出与冲突问题
3.SMTP邮件服务器程序的开发
为什么学习邮件开发
●因为在很多方面都需要邮件的发送和接受,例如:办公自动化项目(OA),咋许多网站项目中也都需要附件发送邮件的额功能,即要求软件开发人员在WEB应用中编写相应的邮件处理程序
●给新注册的用户自动发送一封包含其注册信息的欢迎E-MAIL
●给过生日的注册会员自动发送一封便是祝福的E-MAIL
●将网站的最新活动信息通过E-MAIL发送给所有的注册会员
学习邮件开发包括两大方面
●发送与接受邮件
●创建与解析邮件内容
电子邮件的一些基本常识
●邮件服务器
●邮件客户端软件
●邮件传输协议
●电子邮件的成熟过程
邮件服务器:
1..电子邮件服务器主要提供以下功能
2.接收用户投递的邮件
3.将用户投递进来的邮件转发给目标邮件服务器
4.接收其他邮件服务器转发来的邮件并把邮件存储到其管理的用户邮件中
4.为前来读取邮件的用户提供读取服务
邮件服务器按通讯协议可以分为来两种类型
●SMTP服务器(发和收是一对,把邮件传出去和把邮件收进来)
●POP3/IMAP服务器(去查看有没有我的邮件,如果有我就把它取走)
电子邮箱
每个电子邮件服务器之一都可以开设多个电子有幸,电子邮箱也称之为E-MAIL地址,它类似现实生活中的通讯地址,用户可通过这个地址接收别人发来的单子邮件和向别人发送电子邮件,电子有幸的获得需要在邮件服务器上进行申请,确切地说,电子有幸其实就是用户在邮件服务器上申请一个账号,邮件服务器已接收到邮件保存到位某个账号所分配的邮箱空间中,用户通过其申请的用户名和密码德鲁到邮件服务器上查收该地址一收到的电子邮件。
邮件客户端软件
邮件客户端软件爱你负责与邮件服务器通讯,主要用于帮助用户将邮件发送给SMTP服务器和从POPO3邮件服务器读取用户的电子邮件,邮件客户端软件通常是邮件撰写,发送和接受功能于一体。
电子邮件的传输过程
longqiankun@sina.com发一封邮件给qiankun@163.com,首先longqiankun@sina.com通过SMTP服务器发送到qiankun@163.com的SMTP服务器,,qiankun@163.com通过SMTP服务器接收到longqiankun@sina.com传过来的邮件并把它保存到存储设备中,如果qiankun@163.com要查看有没有邮件,就通过pop3服务器查看,如果在存储设备中有longqiankun@sina.com发过来的邮件,就交给qiankun@163.com..如下图:
准备实验环境
●提前在sina和163上开设一个免费账号
●回取smtp和pop3服务器的名称
●在outlook中配置sina账号
●使用outlook发送和接收邮件
邮件传输协议
●SMTP协议
全称:Simple Mail Transfer Protocal(简单邮件传输协议),它定义了邮件客户端软件与SMTP服务器之间,以及两台SMTP服务器之间的通讯规则。
●POP3协议
全称为Post Office Protocal(邮局协议),它定义了邮件客户端软件与POP3服务器的通讯规则。
●IMAP协议
全称为Internet Message Access Protocal(internet消息访问协议),它是对POP3协议的一种扩展,定义了邮件客户端软件与IMAP服务器的通讯规则。
自己手动发送邮件
连接SMTP服务器:telnet SMTP.sina.com 25(端口号)
>>ehlo itcast_test //ehlo
<<auth login plain(计算机告诉你要选择login登陆方式还是选择plain登陆方式)
>>auth login(我选择了login登陆方式)
<<
>>base64 username
<<
>>base64 password
<<
>>mail from:itcast_test@sina.com
<<
>>rept to:itcst_test@sohu.com
<<
>>data
From:<lili@126.com>
To:xx
Subject:
Date:
Content!!
.
<<
>>quit
什么事JAVA MAIL
要自己写程序发送和接收邮件,可以直接采用socket编程连接上远程的邮件服务器,然后按照邮件协议与邮件服务器进行交互,涉及较多细节。另外,要想自己编程创建出复杂的mime格式的邮件,是一件非常困难和麻烦的事情,
JAVAMAIL 是SUN公司为方便JAVA开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发包。它支持一些常用的邮件协议,如:SMTP ,POP3.IMAP
开发人员使用JAVAMAIL API 编写邮件处理软件是,无须考虑邮件协议的底层实施细节。只要调用JAVAMAIL开发包中相应的API类就可以了。
JAVAMAIL 也提供了能够创建出各种复杂MIME格式的邮件内容的相关API.
.javaMail 的体系结构和分类
JavaMail API按其功能划分通常可分为如下三大类:
●创建和解析邮件内容的API,Message类是创建和解析邮件的核心API,它的实例对象代表一封电子邮件。
●发送邮件的API,,Transport类是发送邮件的而核心API类,它的实例对象代表实现了某个邮件发送协议的邮件发送对象,例如:SMTP协议。
●接收邮件的API,Store类是接收邮件的二和心APIl类,它的脸实例对象代表实现了某个邮件接收协议的邮件接收对象,例如POP3协议。
Session类
Session类是用了定义整个应用程序所需的环境信息,以及收集客户端与邮件服务器建立网络连接会话信息,如偶见服务器的主机名,端口号,采用的邮件发送和接收协议等。
JAF简介
JAF(javaBeans Acivation Framework,,javaBeans激活框架)是一个我专业的数据处理框架,它用于封装数据,并为应用程序提供访问和操作数据的接口。
JAF的主要作用在于让java应用程序知道如何对一个数据源进行查看,编辑和打印等错做。对于通过FAF封装的数据,应用程序通过FAF提供的接口可以完成如下功能:
●访问数据源中的数据
●获知暑假园地数据类型。
●获知可对数据进行的各种错做
●用户对数据执行某种操作时,自动创建执行该操作的软件不见的实例对象
●JavaMail API 可以利用JAF从某种数据源中读取数据和获知数据的MIME类型,并用这些数据生成么么消息中的消息体和消息类。
编写第一个JAVAMAIL发送邮件程序
package cn.itcast.javamail;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
/*
* 定义一个发送邮件的类,并且此类作为独立运行的类
* 导入javaMail的相关包
* 创建环境属性的实例
* 创建环境并接收已有的环境属性实例
* 定义信息实例对象
* 定义发送信息实例对象的工具
* 信息工具把信息发送出去
* 关闭信息工具
*/
publicclass Demo {
/**
*@paramargs
*/
publicstaticvoid main(String[] args)throws Exception {
// TODO Auto-generated method stub
Properties props=new Properties();
props.setProperty("mail.smtp.auth", "true"); //告诉程序是要通过验证的,是需要用户名和密码的
props.setProperty("mail.transport.protocal", "smtp"); //设置要使用什么样的协议
Session session=Session.getInstance(props);
session.setDebug(true); //增加调试信息。把与服务器对话的过程在控制台打印出来
Message msg=new MimeMessage(session);
msg.setText("你好吗?");
msg.setFrom(new InternetAddress("lili@suhu.com"));
Transport transport=session.getTransport();
transport.connect("smtp.sina.com", 25, "itcast_test", "123456");
transport.sendMessage(msg, new Address[]{new InternetAddress("itcast_test@suhu.com")});
transport.close();
}
}
在发送邮件程序中使用authentication和send静态方法
Authentication:返回一个验证器;
Send:transprot类直接调用的send静态方法,在send静态方法中做了连接,发送,关闭这些动作。所以使用时send方法就可以省去了这些工作。
例如:
package cn.itcast.javamail;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.Message.RecipientType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
/*
* 定义一个发送邮件的类,并且此类作为独立运行的类
* 导入javaMail的相关包
* 创建环境属性的实例
* 创建环境并接收已有的环境属性实例
* 定义信息实例对象
* 定义发送信息实例对象的工具
* 信息工具把信息发送出去
* 关闭信息工具
*/
publicclass Demo1 {
/**
*@paramargs
*/
publicstaticvoid main(String[] args)throws Exception {
// TODO Auto-generated method stub
Properties props=new Properties();
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.transport.protocal", "smtp");
props.setProperty("mail.host","smtp.sina.com");
//使用了策略模式,定义了一个类来封装用户名和密码,利用子类覆盖他的方法返回PasswordAuthenticastion对象,
Session session=Session.getInstance(props,
new Authenticator(){
protected PasswordAuthentication getPasswordAuthentication()
{
returnnew PasswordAuthentication("itcast_test","123456");
}
}
);
Message msg=new MimeMessage(session);
msg.setFrom(new InternetAddress("itcast_test@sohu.com"));
msg.setSubject(“中文主题”);
msg.setContent("<span style='color:red'>haha</span>","text/html;charaset=gbk");
//setRecipients方法接收了两个参数,第一个是所要发送的类型,这里有几个常量:TO是要发到那些目标地址,BCC是密送,CC是抄送。第二个是目标地址数组
msg.setRecipients(RecipientType.TO, InternetAddress.parse("itcast_test@sohu.com,itcast_test@sina.com"));
Transport.send(msg);
}
}
邮件的基本格式与编码
基本格式:
From::=?gb2312?B?TWljcm9zb2Z0IE91dGxvb2sgRXhwcmVzcyC/qrei1+k=?= <msoe@microsoft.com>
To: =?gb2312?B?0MK1xCBPdXRsb29rIEV4cHJlc3Mg08O7pw==?=
Subject: =?gb2312?B?u7bTrcq508MgT3V0bG9vayBFeHByZXNzIDY=?=
Date: Thu, 22 Mar 2012 12:48:27 +0800
MIME-Version: 1.0
Content-Type: text/html;
charset="gb2312"
Content-Transfer-Encoding: quoted-printable
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6157
后面是要输入的内容以点结束
编码:也就是把中文转换成字符形式,把二进制转换成字符形式等
1, base 64编码:一个字符可以变为两个字符,两个可变为三个。
2, quoted-printable编码: 一个字符可以变为三个字符,两个可变为六个。
邮件内容的组织结构
●RFC822邮件格式
●MIME协议
●邮件编码
●复合邮件结构分析
复合邮件的整体结构图:
复合邮件的分割线层次结构分析
邮件组织结构相关的API
邮件内容的创建程序
●简单邮件内容
●包含内嵌图片的复杂邮件
●包含内嵌图片和房间的复杂邮件
●中文名的邮件附件的乱码问题
●收件人和发件人的地址中附带友好名称
●让回复地址与发件人地址不同
复杂邮件整体架构
例子:
package cn.itcast.javamail;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Session;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
/*
* 定义一个复杂邮件类,并独立运行
* 导入相关包
* 得到环境属性
* 创建复杂邮件并接收环境
* 创建复杂体由三部分组合
* 创建两个附件和一个文本加到复杂体中
* 创建一个复杂体,包含了html部分和图片部分
* 保存
* 把邮件写到一个输出流文件中
* 关闭流
*/
publicclass demo2 {
/**
*@paramargs
*/
publicstaticvoid main(String[] args)throws Exception {
// TODO Auto-generated method stub
Session session=Session.getInstance(new Properties());
MimeMessage msg=new MimeMessage(session);
MimeMultipart msgMultipart=new MimeMultipart("mixed");
msg.setContent(msgMultipart);
msg.setFrom(new InternetAddress("\"" + MimeUtility.encodeText("传智播客") + "\" <itcast_test@sina.com>"));
msg.setSubject("你的Java真的很牛吗?");
msg.setReplyTo(new Address[]{new InternetAddress("lili@sina.com")});
msg.setRecipients(RecipientType.TO, InternetAddress.parse(MimeUtility.decodeText("黎活明") +"<lhm@itcast.com>,"+MimeUtility.decodeText("张孝祥")+"<zxx@itcast.com>"));
MimeBodyPart attach1=new MimeBodyPart();
MimeBodyPart attach2=new MimeBodyPart();
MimeBodyPart content=new MimeBodyPart();
msgMultipart.addBodyPart(attach1);
msgMultipart.addBodyPart(attach2);
msgMultipart.addBodyPart(content);
DataSource ds1=new FileDataSource("e:java.txt");
DataHandler dh1=new DataHandler(ds1);
attach1.setDataHandler(dh1);
attach1.setFileName(MimeUtility.decodeText("java.txt"));
DataSource ds2=new FileDataSource("e:java.java");
DataHandler dh2=new DataHandler(ds2);
attach2.setDataHandler(dh2);
attach2.setFileName("logo.gif");
MimeMultipart bodyMultipart=new MimeMultipart("related");
content.setContent(bodyMultipart);
MimeBodyPart htmlPart=new MimeBodyPart();
MimeBodyPart gifPart=new MimeBodyPart();
bodyMultipart.addBodyPart(htmlPart);
bodyMultipart.addBodyPart(gifPart);
DataSource ds3=new FileDataSource("e:java.gif");
DataHandler dh3=new DataHandler(ds3);
htmlPart.setDataHandler(dh3);
DataSource ds4=new FileDataSource("e:itcast.gif");
DataHandler dh4=new DataHandler(ds4);
gifPart.setDataHandler(dh4);
gifPart.setHeader("Content-Location", "http://www.itcast.cn/logo.gif");
htmlPart.setContent("你们的Java培训真的是最牛的吗?大家都这么说,我想跟你们比试一下!这可是我自己用程序生成和发送的邮件哦!<img src='http://www.itcast.cn/logo.gif'>"
, "text/html;charset=gbk");
msg.saveChanges();
OutputStream ops = new FileOutputStream("resource\\demo3.eml");
msg.writeTo(ops);
ops.close();
}
}
要把已经有的邮件发送出去
package cn.itcast.javamail;
import java.io.FileInputStream;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.Message.RecipientType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
/*
* 定义一个发送邮件的类,并且此类作为独立运行的类
* 导入javaMail的相关包
* 创建环境属性的实例
* 创建环境并接收已有的环境属性实例
* 定义信息实例对象
* 定义发送信息实例对象的工具
* 信息工具把信息发送出去
* 关闭信息工具
*/
public class Demo3 {
/**
* @param args
*/
public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
Properties props=new Properties();
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.transport.protocal", "smtp");
props.setProperty("mail.host","smtp.sina.com");
//使用了策略模式,定义了一个类来封装用户名和密码,利用子类覆盖他的方法返回PasswordAuthenticastion对象,
Session session=Session.getInstance(props,
new Authenticator(){
protected PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication("itcast_test","123456");
}
}
);
//直接发送已经创建好的邮件
Message msg=new MimeMessage(session,new FileInputStream("e:demo3.java"));
Transport.send(msg,InternetAddress.parse("lhm@itcast.com"));
}
}
在WEB应用中增加邮件发送功能
WEB邮件发送的界面示意
Tomcat中JavaMail支持与冲突
●用普通方式在eclipse没有导入mail.jar可以编译,但部署运行有问题的原因
●用Tomact支持的jndi资源方式,步骤:
1.配置JNDI资源
2.将mail.jar拷贝到<tomcat_home>/lib目录下。
3.在Java程序中使用JNDI API 获得mail的session对象。
●分析类加载的冲突问题
SMTP邮件服务器程序
●配置与查看DNS服务器
●验证DNS服务的作用
●MX(mail box)记录
●域名解析原理
---------------------- android培训、 java培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net/heima