JavaMail 简易教程Word格式.docx

上传人:b****6 文档编号:20173453 上传时间:2023-01-17 格式:DOCX 页数:81 大小:99.30KB
下载 相关 举报
JavaMail 简易教程Word格式.docx_第1页
第1页 / 共81页
JavaMail 简易教程Word格式.docx_第2页
第2页 / 共81页
JavaMail 简易教程Word格式.docx_第3页
第3页 / 共81页
JavaMail 简易教程Word格式.docx_第4页
第4页 / 共81页
JavaMail 简易教程Word格式.docx_第5页
第5页 / 共81页
点击查看更多>>
下载资源
资源描述

JavaMail 简易教程Word格式.docx

《JavaMail 简易教程Word格式.docx》由会员分享,可在线阅读,更多相关《JavaMail 简易教程Word格式.docx(81页珍藏版)》请在冰豆网上搜索。

JavaMail 简易教程Word格式.docx

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="

//(Blind)CarbonCopy

privateStringmailContent="

Frodo!

perilisapproaching!

gotoMinasTirithnow@!

privateSessionsession;

//session没有子类,可以被共享,来自javax.mail包

privateMessagemsg;

//放内容,实现接口part,有子类MimeMessage,来自javax.mail

publicvoidsendNow(){

Propertiesprops=newProperties();

//dictionary-hashtable-properties

props.put("

mail.smtp.auth"

"

true"

);

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对象。

它将寻找字符串"

属性值就是发送邮件的主机。

典型用法:

 Propertiesprops=newProperties();

//System.getProperties();

 props.put("

//可换上你的smtp主机名

或props.setProperty("

 

String

getProperty(String 

key)

用指定的键在此属性列表中搜索属性。

key,String 

defaultValue)

用指定的键在属性列表中搜索属性。

void

list(PrintStream 

out)

将属性列表输出到指定的输出流。

list(PrintWriter 

load(InputStream 

inStream)

从输入流中读取属性列表(键和元素对)。

load(Reader 

reader)

按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。

loadFromXML(InputStream 

in)

将指定输入流中由XML文档所表示的所有属性加载到此属性表中。

Enumeration<

?

>

propertyNames()

返回属性列表中所有键的枚举,如果在主属性列表中未找到同名的键,则包括默认属性列表中不同的键。

save(OutputStream 

out,String 

comments)

已过时。

如果在保存属性列表时发生I/O错误,则此方法不抛出IOException。

保存属性列表的首选方法是通过store(OutputStreamout,Stringcomments)方法或storeToXML(OutputStreamos,Stringcomment)方法来进行。

Object

setProperty(String 

value)

调用Hashtable的方法put。

store(OutputStream 

以适合使用load(InputStream)方法加载到Properties表中的格式,将此Properties表中的属性列表(键和元素对)写入输出流。

store(Writer 

writer,String 

以适合使用load(Reader)方法的格式,将此Properties表中的属性列表(键和元素对)写入输出字符。

storeToXML(OutputStream 

os,String 

comment)

发出一个表示此表中包含的所有属性的XML文档。

comment,String 

encoding)

使用指定的编码发出一个表示此表中包含的所有属性的XML文档。

Set<

String>

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("

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"

Mary"

456"

Obama"

110"

}catch(Exceptione){

e.printStackTrace();

publicPasswordAuthenticationgetPasswordAuthentication(){

Stringstr=getDefaultUserName();

//取得当前的

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1