JavaMail 简易教程.docx
- 文档编号:7081274
- 上传时间:2023-01-17
- 格式:DOCX
- 页数:81
- 大小:99.30KB
JavaMail 简易教程.docx
《JavaMail 简易教程.docx》由会员分享,可在线阅读,更多相关《JavaMail 简易教程.docx(81页珍藏版)》请在冰豆网上搜索。
JavaMail简易教程
JavaMail简易教程
AlexZhu2011.3Version0.1Beta
JavaMailAPI简介-2-
了解相关协议-2-
JavaMail的安装-4-
安装JavaBeansActivationFramework-4-
使用JavaEE企业版-4-
发送邮件的例子-5-
JavaMail核心类-7-
java.util.Properties类-7-
javax.mail.Session类-9-
javax.mail.Authenticator类-10-
javax.mail.Message类-12-
javax.mail.Address类-15-
javax.mail.Transport类-16-
javax.mail.Store和javax.mail.Folder类-17-
使用JavaMailAPI-19-
发送消息-19-
获取消息-21-
删除消息和标志-23-
自我验证-24-
回复消息-25-
转发消息-26-
操作附件-27-
发送附件-27-
获取附件-28-
处理HTML消息-29-
发送HTML消息-29-
在消息中包含图片-29-
用SearchTerm搜索-31-
常见问答-32-
JavaMail的常用类速查-35-
示例代码-38-
Gmail收发信-38-
JavaMail收取邮件属性配置(包括Gmail、hotmail等)-41-
JavaMail收取邮件IMAP-44-
JavaMail发送邮件[代码]MailSender.java-52-
JavaMail收取邮件POP3-57-
GmailFetch收取Gmail邮件-62-
GmailSender发送Gmail邮件-63-
JavaMailAPI简介
JavaMailAPI是一种可选的、能用于读取、编写和发送电子消息的包(标准扩展),可使用其创建邮件用户代理(MailUserAgent,MUA)类型的程序,类似于Eudora、Pine及MicrosoftOutlook邮件程序。
其主要目的不是像发送邮件或其他邮件传输代理(MailTransferAgent,MTA)类型的程序那样用于传输、发送和转发消息。
换句话说,用户可以与MUA类型的程序交互,以阅读和撰写电子邮件。
MUA依靠MTA处理实际的发送任务。
JavaMailAPI的设计是,为收发信息提供与协议无关的访问。
方式是把该API划分成两个部分:
•第一个部分基本上是如何发送和接收独立于提供程序/协议的消息。
•第二个部分使用特定的协议语言,如:
SMTP、POP、IMAP和NNTP。
如果要让JavaMailAPI与服务器通信,就需要为之提供协议。
Sun公司对特定协议提供程序有充分的介绍,用户可以免费获取。
了解相关协议
在学习JavaMailAPI的深层知识之前,让我们来看一看在该API中使用的协议,通常有4种人们常用的协议:
•SMTP
•POP
•IMAP
•MIME
还需要了解NNTP及其他一些协议。
理解这些协议的基本原理有助于理解如何使用JavaMailAPI。
而该API的设计要与协议无关,所以不能克服这些基础协议的限制。
如果选用的协议不支持某种功能,那么JavaMailAPI也无法在其上添加这种功能。
(如在操作POP协议时,常常会碰到这种问题)
SMTP
简单邮件传输协议(SimpleMailTransferProtocol)是用于传送电子邮件的机制。
在JavaMailAPI环境中,基于JavaMail的程序将与公司或Internet服务提供商(ISP)的SMTP服务器通信。
SMTP服务器将会把消息转发给用作接收消息的SMTP服务器,最后用户可通过POP或IMAP协议获取该消息。
由于支持身份验证,不需要SMTP服务器是一种开放的转发器,但需要确保SMTP服务器配置正确。
JavaMailAPI中没有集成用于处理诸如配置服务器以转发消息或添加/删除电子邮件帐户这一类任务的功能。
参阅RFC821。
POP
POP的含义是邮局协议(PostOfficeProtocol),当前的版本为3,也称作POP3,该协议是在RFC1939中定义的。
POP是Internet上的经常用来接收邮件的机制。
它为每个用户的每个邮箱定义支持,这是它所做的全部工作,也是大多数问题的根源。
在使用POP协议时,人们熟悉的很多功能,如查看收到了多少新邮件消息的功能,POP根本不支持。
这些功能都内置到诸如Eudora或MicrosoftOutlook之类的邮件程序中,能记住接收的上一封邮件,以及计算有多少新邮件这类信息。
因此,使用JavaMailAPI时,想获取这类信息,将需要由自己进行计算。
IMAP
IMAP用于接收消息的更高级的协议,在RFC2060中定义。
IMAP的含义是“InternetMessageAccessProtocol”,当前版本是第4版,也称作IMAP4。
使用IMAP时,邮件服务器必须支持该协议。
不能简单地把支持POP的程序用于IMAP协议,就指望能支持IMAP中的一切。
如果邮件服务器支持IMAP,那么基于JavaMail的程序就可访问在服务器上拥有的多个文件夹,并且这些文件夹可以被多个用户共享。
既然IMAP协议具有更高级的功能,那么IMAP应该被所有人使用?
!
事实不是这样!
因为IMAP会加重邮件服务器的负荷,它需要服务器接收新消息,发送消息给请求的用户,并在多个文件夹中为每个用户维护这些消息。
而这要集中备份,因而长期下去用户的文件夹会变得越来越大,当磁盘空间用光了时,每个人都会遭受损失。
而使用POP协议时,已保存消息可以解除服务器的重负。
MIME
MIME的含义是多用途的网际邮件扩充协议(MultipurposeInternetMailExtension)。
它不是一种邮件传输协议,相反,它定义传输的内容:
消息的格式、附件等。
许多文档都定义了MIME协议,包含:
RFC822、RFC2045、RFC2046和RFC2047。
作为JavaMailAPI的用户,一般不需要担心这些格式。
但是,这些格式确实存在,并为您的程序所用。
NNTP和其他协议
由于JavaMailAPI分开了提供程序和其他部分,可以轻松地为附加协议添加支持。
Sun公司提供第3方提供程序清单,这些提供程序要利用Sun公司不支持的少见的协议。
在这份清单中,您将会看到对NNTP(网络新闻传输协议)[新闻组]、S/MIME(安全多用途的网际邮件扩充协议)及其他协议的提供支持的第3方提供程序。
JavaMail的安装
目前JavaMailAPI最高版本1.4.4,可以到Oracle网站查看最新情况。
下载地址:
解压JavaMail安装包:
javamail1_4_4.zip
把其中的mail.jar文件添加到CLASSPATH路径下,或直接拷贝到Tomcat的lib目录下。
在JavaMail安装包的解压文件夹下,有demo演示目录可以看到许多示例程序[建议浏览]。
安装JavaBeansActivationFramework
JavaMailAPI的所有版本都需要JavaBeansActivationFramework(JavaBeans激活框架),这种框架提供了对输入任意数据块的支持,并能相应地对其进行处理。
JavaSE6以上版本中已经包含了最新的JAF,如果安装低版本的JavaSE则需要单独下载JAF框架。
下载该框架后,解压缩jaf-1_1_1.zip文件,并将activation.jar文件添加到典型安装路径下。
使用JavaEE企业版
如果使用的是JavaEE,则在使用基本JavaMailAPI时,不需要做什么特殊的工作;JavaEEAPI中包含有JavaMail。
只要确保j2ee.jar文件位于典型安装路径下,并完成了所有的设置工作,也不需要安装JavaBeansActivationFramework。
[推荐安装GlassFish]
练习
设置JavaMail环境。
发送邮件的例子
importjava.util.Properties;
importjavax.mail.Authenticator;
importjavax.mail.Message;
importjavax.mail.MessagingException;
importjavax.mail.PasswordAuthentication;
importjavax.mail.Session;
importjavax.mail.Transport;
importjavax.mail.internet.InternetAddress;
importjavax.mail.internet.MimeMessage;
publicclassSender{
privateStringreceiver="hui.zz@";
privateStringsubject="Hello!
MyFriend!
Sendingbestwishes!
";
privateStringcc="hui.zz@";//(Blind)CarbonCopy
privateStringmailContent="Hello!
Frodo!
perilisapproaching!
gotoMinasTirithnow@!
";
privateSessionsession;//session没有子类,可以被共享,来自javax.mail包
privateMessagemsg;//放内容,实现接口part,有子类MimeMessage,来自javax.mail
publicvoidsendNow(){
Propertiesprops=newProperties();//dictionary-hashtable-properties
props.put("mail.smtp.auth","true");
props.put("mail.smtp.host","");//没有开外网,程序就跑不动了
//呵呵运行这程序的时候必须有smtpserver
session=Session.getDefaultInstance(props,newAuthenticator(){
publicPasswordAuthenticationgetPasswordAuthentication(){
returnnewPasswordAuthentication("courses4public","hytczzh");
}
});
session.setDebug(true);//允许调试,因此可以用getDebug取调试信息,消息多得吓人。
哼哼
try{
msg=newMimeMessage(session);
msg.setFrom(newInternetAddress("courses4public@"));
InternetAddresstoAddress=newInternetAddress(receiver);//收件人
msg.addRecipient(Message.RecipientType.TO,toAddress);//加收件人
InternetAddressccAddress=newInternetAddress(cc);//收件人
msg.addRecipient(Message.RecipientType.CC,ccAddress);//加收件人
msg.setSubject(subject);
msg.setText(mailContent);
Transport.send(msg);
}catch(MessagingExceptionex){
while((ex=(MessagingException)ex.getNextException())!
=null)
ex.printStackTrace();
}
}//sendNowend
publicstaticvoidmain(String[]args){
newSender().sendNow();
}
}
JavaMail核心类
首先浏览一下构成JavaMailAPI的核心类:
会话、消息、地址、验证程序、传输,存储和文件夹。
所有这些类都可以在JavaMailAPI即javax.mail的顶层包中找到,但也会发现自己使用的具体子类是在javax.mail.internet包中找到的。
java.util.Properties类
JavaMail需要Properties来创建一个session对象。
它将寻找字符串"mail.smtp.host"属性值就是发送邮件的主机。
典型用法:
Propertiesprops=newProperties();//System.getProperties();
props.put("mail.smtp.host","");//可换上你的smtp主机名
或props.setProperty("mail.smtp.host","");
String
getProperty(String key)
用指定的键在此属性列表中搜索属性。
String
getProperty(String key,String defaultValue)
用指定的键在属性列表中搜索属性。
void
list(PrintStream out)
将属性列表输出到指定的输出流。
void
list(PrintWriter out)
将属性列表输出到指定的输出流。
void
load(InputStream inStream)
从输入流中读取属性列表(键和元素对)。
void
load(Reader reader)
按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。
void
loadFromXML(InputStream in)
将指定输入流中由XML文档所表示的所有属性加载到此属性表中。
Enumeration
>
propertyNames()
返回属性列表中所有键的枚举,如果在主属性列表中未找到同名的键,则包括默认属性列表中不同的键。
void
save(OutputStream out,String comments)
已过时。
如果在保存属性列表时发生I/O错误,则此方法不抛出IOException。
保存属性列表的首选方法是通过store(OutputStreamout,Stringcomments)方法或storeToXML(OutputStreamos,Stringcomment)方法来进行。
Object
setProperty(String key,String value)
调用Hashtable的方法put。
void
store(OutputStream out,String comments)
以适合使用load(InputStream)方法加载到Properties表中的格式,将此Properties表中的属性列表(键和元素对)写入输出流。
void
store(Writer writer,String comments)
以适合使用load(Reader)方法的格式,将此Properties表中的属性列表(键和元素对)写入输出字符。
void
storeToXML(OutputStream os,String comment)
发出一个表示此表中包含的所有属性的XML文档。
void
storeToXML(OutputStream os,String comment,String encoding)
使用指定的编码发出一个表示此表中包含的所有属性的XML文档。
Set
stringPropertyNames()
返回此属性列表中的键集,其中该键及其对应值是字符串,如果在主属性列表中未找到同名的键,则还包括默认属性列表中不同的键。
javax.mail.Session类
Session类定义了一个基本的邮件会话,建模同远程邮件系统服务器的交互应答过程。
Session对象利用java.util.Properties对象获取诸如邮件服务器、用户名、密码等信息,以及其他可在整个应用程序中共享的信息。
一般情况下,Session对象在一个JVM里只有一个,所以可能有多个用户共享一个Session。
然而Session里用户名和密码极有可能存在,所以安全问题要注意。
Session类没有Constructor(私有构造函数),所以只能用
staticSessiongetInstance(Propertiesprop)
返回一个独享的Session对象。
而
staticSessiongetDefaultInstance(Propertiesprop)
返回一个共享的Session对象。
后者在之后的调用时,返回同一个Session。
如果反复进行类似的操作,那么用后者不必每次都去重设Properites,显得更方便一些。
[具体看自己的操作需求]
Properties对象放的是Session所必须的参数,参数分两部份:
参数名,参数值
其内容既可以用put(key,value)存放,也可以用System.getProperties()取得系统默认值。
推荐使用Properties.setProperty(Stringkey,Stringvalue)
例如下面的语句:
props.put("mail.smtp.host","127.0.0.1");
其中mail.smtp.host是参数名,而127.0.0.1是值。
参数名不可以乱写,是JavaMail体系文档里规定的。
除了mail.smtp.host之外还有:
mail.transport.protocol
调用getTransport()时可以得到它。
返回默认的传输协议
mail.store.protocol
调用getStore()时可以得到它,返回默认存储协议实现
mail.host
在没指定主机时,存储和传输时使用这个主机
mail.user
默认的用户缺省值user.name
mail.from
当前用户缺省值username@host
mail.protocol.host
缺省值mail.host
mail.protocol.user
缺省值mail.user
mail.debug
会话调试开关,缺省是false
练习
准备Session对象以备后用。
Propertiesprops=newProperties();//开一个新特性
props.put(“mail.transport.protocol”,”smtp”);
props.put(“mail.smtp.host”,””);
props.put(“mail.smtp.port”,”25”);
SessionmySession=Session.getInstance(props);//好了!
创建成功!
如果用getDefaultInstance有什么区别?
?
javax.mail.Authenticator类
现在大多数邮件系统为了防止邮件乱发(spam),设定了smtp身份认证功能。
因此发送的时候需要提供用户名密码的情况越来越多了。
Java用一个类来封装用户认证操作,这个类就是
java.lang.Object
|
+--javax.mail.Authenticator(英文发音,重音在th上)
验证信息需要通过Session传给邮件服务器,所以getInstance有以下的变形
staticSessiongetInstance(Propertiesprop,Authenticatorauth);
staticSessiongetDefaultInstance(Propertiesprop,Authenticatorauth);
其中的Authenticator负责密码校验。
如果不需要验证身份,就用null做第二个参数,或者干脆用单参数的getInstance()。
如果session是需要密码的,那么session会自动发出如下调用:
javax.mail.PasswordAuthenticationgetPasswordAuthentication()
PasswordAuthentication是一个包装类,里面包了用户名和密码。
如果smtp需要身份验证,则程序中需要自定义一个类继承Authenticatior,然后在类中实现getPasswordAuthentication()方法。
classAuthextendsAuthenticator{
Propertiespwd;
publicAuth(){
在这里,构造方法建立一个用户名-密码列表,这个列表可以放在文件中,可以写死在java程序里,也可以从jndildap中去取。
try{
pwd=newProperties();
pwd.put("Alex","123");
pwd.put("Mary","456");
pwd.put("Obama","110");
}catch(Exceptione){
e.printStackTrace();
}
}
publicPasswordAuthenticationgetPasswordAuthentication(){
Stringstr=getDefaultUserName();//取得当前的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JavaMail 简易教程 简易 教程