1、Gmail收发信 - 38 -JavaMail收取邮件属性配置(包括Gmail、hotmail等) - 41 -JavaMail 收取邮件 IMAP - 44 -JavaMail 发送邮件 代码 MailSender.java - 52 -JavaMail 收取邮件 POP3 - 57 -GmailFetch 收取Gmail邮件 - 62 -Gmail Sender 发送 Gmail邮件 - 63 -JavaMail API简介JavaMail API是一种可选的、能用于读取、编写和发送电子消息的包(标准扩展),可使用其创建邮件用户代理(Mail User Agent ,MUA) 类型的程序,
2、类似于Eudora、Pine及Microsoft Outlook邮件程序。其主要目的不是像发送邮件或其他邮件传输代理(Mail Transfer Agent,MTA)类型的程序那样用于传输、发送和转发消息。换句话说,用户可以与MUA类型的程序交互,以阅读和撰写电子邮件。MUA依靠MTA处理实际的发送任务。JavaMail API的设计是,为收发信息提供与协议无关的访问。方式是把该API划分成两个部分: 第一个部分 基本上是如何发送和接收独立于提供程序/协议的消息。 第二个部分 使用特定的协议语言,如:SMTP、POP、IMAP和NNTP。如果要让JavaMail API与服务器通信,就需要为之
3、提供协议。Sun公司对特定协议提供程序有充分的介绍,用户可以免费获取。了解相关协议在学习JavaMail API的深层知识之前,让我们来看一看在该API中使用的协议,通常有4种人们常用的协议: SMTP POP IMAP MIME还需要了解NNTP及其他一些协议。理解这些协议的基本原理有助于理解如何使用JavaMail API。而该API的设计要与协议无关,所以不能克服这些基础协议的限制。如果选用的协议不支持某种功能,那么JavaMail API也无法在其上添加这种功能。(如在操作POP协议时,常常会碰到这种问题)SMTP简单邮件传输协议(Simple Mail Transfer Protoc
4、ol)是用于传送电子邮件的机制。在JavaMail API环境中,基于JavaMail的程序将与公司或Internet服务提供商(ISP)的SMTP服务器通信。SMTP服务器将会把消息转发给用作接收消息的SMTP服务器,最后用户可通过POP或IMAP协议获取该消息。由于支持身份验证,不需要SMTP服务器是一种开放的转发器,但需要确保SMTP服务器配置正确。JavaMail API中没有集成用于处理诸如配置服务器以转发消息或添加/删除电子邮件帐户这一类任务的功能。参阅RFC 821。POPPOP 的含义是邮局协议(Post Office Protocol),当前的版本为3,也称作POP3,该协议
5、是在RFC 1939中定义的。POP是Internet上的经常用来接收邮件的机制。它为每个用户的每个邮箱定义支持,这是它所做的全部工作,也是大多数问题的根源。在使用POP协议时,人们熟悉的很多功能,如查看收到了多少新邮件消息的功能,POP根本不支持。这些功能都内置到诸如Eudora或 Microsoft Outlook之类的邮件程序中,能记住接收的上一封邮件,以及计算有多少新邮件这类信息。因此,使用JavaMail API时,想获取这类信息,将需要由自己进行计算。IMAPIMAP用于接收消息的更高级的协议,在RFC 2060中定义。IMAP的含义是“Internet Message Acces
6、s Protocol”,当前版本是第4版,也称作IMAP4。使用IMAP时,邮件服务器必须支持该协议。不能简单地把支持POP的程序用于IMAP协议,就指望能支持IMAP中的一切。如果邮件服务器支持IMAP,那么基于 JavaMail的程序就可访问在服务器上拥有的多个文件夹,并且这些文件夹可以被多个用户共享。既然IMAP协议具有更高级的功能,那么IMAP应该被所有人使用?! 事实不是这样!因为IMAP会加重邮件服务器的负荷,它需要服务器接收新消息,发送消息给请求的用户,并在多个文件夹中为每个用户维护这些消息。而这要集中备份,因而长期下去用户的文件夹会变得越来越大,当磁盘空间用光了时,每个人都会遭
7、受损失。而使用POP协议时,已保存消息可以解除服务器的重负。MIMEMIME的含义是 多用途的网际邮件扩充协议 (Multipurpose Internet Mail Extension)。它不是一种邮件传输协议,相反,它定义传输的内容:消息的格式、附件等。许多文档都定义了MIME协议,包含:RFC 822、RFC 2045、RFC 2046和RFC 2047。作为JavaMail API的用户,一般不需要担心这些格式。但是,这些格式确实存在,并为您的程序所用。NNTP和其他协议由于JavaMail API分开了提供程序和其他部分,可以轻松地为附加协议添加支持。Sun公司提供第3方提供程序清单
8、,这些提供程序要利用 Sun公司不支持的少见的协议。在这份清单中,您将会看到对NNTP(网络新闻传输协议)新闻组、S/MIME(安全多用途的网际邮件扩充协议)及其他协议的提供支持的第3方提供程序。JavaMail 的安装目前JavaMail API最高版本1.4.4,可以到Oracle网站查看最新情况。下载地址:解压JavaMail安装包: javamail1_4_4.zip把其中的mail.jar文件添加到CLASSPATH路径下,或直接拷贝到Tomcat的lib目录下。在JavaMail安装包的解压文件夹下,有demo演示目录可以看到许多示例程序建议浏览。 安装JavaBeans Acti
9、vation FrameworkJavaMail API的所有版本都需要JavaBeans Activation Framework(JavaBeans激活框架),这种框架提供了对输入任意数据块的支持,并能相应地对其进行处理。Java SE 6以上版本中已经包含了最新的JAF,如果安装低版本的Java SE则需要单独下载JAF框架。下载该框架后,解压缩jaf-1_1_1.zip文件,并将activation.jar 文件添加到典型安装路径下。使用Java EE企业版如果使用的是Java EE,则在使用基本JavaMail API时,不需要做什么特殊的工作;Java EE API中包含有Java
10、Mail。只要确保j2ee.jar文件位于典型安装路径下,并完成了所有的设置工作,也不需要安装 JavaBeans Activation Framework。推荐安装GlassFish练习设置JavaMail 环境。发送邮件的例子import java.util.Properties;import javax.mail.Authenticator;import javax.mail.Message;import javax.mail.MessagingException;import javax.mail.PasswordAuthentication;import javax.mail.Ses
11、sion;import javax.mail.Transport;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeMessage;public class Sender private String receiver = hui.zz; private String subject = Hello! My Friend! Sending best wishes! private String cc = / (Blind) Carbon Copy private String mailConten
12、t = Frodo! peril is approaching! go to Minas Tirith now! private Session session;/ session 没有子类,可以被共享,来自javax.mail包 private Message msg;/ 放内容,实现接口part,有子类MimeMessage,来自javax.mail public void sendNow() Properties props = new Properties();/ dictionary-hashtable-properties props.put(mail.smtp.auth, tru
13、e);mail.smtp.host/ 没有开外网,程序就跑不动了 / 呵呵运行这程序的时候必须有smtp server session = Session.getDefaultInstance(props, new Authenticator() public PasswordAuthentication getPasswordAuthentication() return new PasswordAuthentication(courses4publichytczzh ); session.setDebug(true); / 允许调试,因此可以用getDebug 取调试信息,消息多得吓人。哼
14、哼 try msg = new MimeMessage(session); msg.setFrom(new InternetAddress(courses4public); InternetAddress toAddress = new InternetAddress(receiver);/ 收件人 msg.addRecipient(Message.RecipientType.TO, toAddress);/ 加收件人 InternetAddress ccAddress = new InternetAddress(cc); msg.addRecipient(Message.RecipientT
15、ype.CC, ccAddress); msg.setSubject(subject); msg.setText(mailContent); Transport.send(msg); catch (MessagingException ex) while (ex = (MessagingException) ex.getNextException() != null) ex.printStackTrace(); / sendNow end public static void main(String args) new Sender().sendNow(); JavaMail 核心类首先浏览一
16、下构成JavaMail API的核心类:会话、消息、地址、验证程序、传输,存储和文件夹。所有这些类都可以在 JavaMail API即javax.mail的顶层包中找到,但也会发现自己使用的具体子类是在javax.mail.internet包中找到的。java.util.Properties类JavaMail需要Properties来创建一个session对象。它将寻找字符串属性值就是发送邮件的主机。典型用法:Properties props = new Properties (); / System.getProperties();props.put(/可换上你的smtp主机名或 props
17、.setProperty(StringgetProperty(Stringkey) 用指定的键在此属性列表中搜索属性。key, StringdefaultValue) 用指定的键在属性列表中搜索属性。voidlist(PrintStreamout) 将属性列表输出到指定的输出流。list(PrintWriterload(InputStreaminStream) 从输入流中读取属性列表(键和元素对)。load(Readerreader) 按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。loadFromXML(InputStreamin) 将指定输入流中由 XML 文档所表示的所有属
18、性加载到此属性表中。EnumerationpropertyNames() 返回属性列表中所有键的枚举,如果在主属性列表中未找到同名的键,则包括默认属性列表中不同的键。save(OutputStreamout, Stringcomments) 已过时。如果在保存属性列表时发生 I/O 错误,则此方法不抛出 IOException。保存属性列表的首选方法是通过 store(OutputStream out, String comments) 方法或 storeToXML(OutputStream os, String comment) 方法来进行。ObjectsetProperty(Stringv
19、alue) 调用 Hashtable 的方法 put。store(OutputStream以适合使用 load(InputStream) 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流。store(Writerwriter, String以适合使用 load(Reader) 方法的格式,将此 Properties 表中的属性列表(键和元素对)写入输出字符。storeToXML(OutputStreamos, Stringcomment) 发出一个表示此表中包含的所有属性的 XML 文档。comment, Stringencodi
20、ng) 使用指定的编码发出一个表示此表中包含的所有属性的 XML 文档。SetstringPropertyNames() 返回此属性列表中的键集,其中该键及其对应值是字符串,如果在主属性列表中未找到同名的键,则还包括默认属性列表中不同的键。javax.mail.Session类Session类定义了一个基本的邮件会话,建模同远程邮件系统服务器的交互应答过程。Session对象利用java.util.Properties对象获取诸如邮件服务器、用户名、密码等信息,以及其他可在整个应用程序中共享的信息。一般情况下,Session对象在一个JVM里只有一个,所以可能有多个用户共享一个Session。
21、然而Session 里用户名和密码极有可能存在,所以安全问题要注意。Session 类没有Constructor (私有构造函数),所以只能用static Session getInstance(Properties prop)返回一个独享的 Session 对象。而static Session getDefaultInstance(Properties prop)返回一个共享的Session 对象。后者在之后的调用时,返回同一个Session。如果反复进行类似的操作,那么用后者不必每次都去重设Properites,显得更方便一些。具体看自己的操作需求Properties 对象放的是Sessi
22、on 所必须的参数,参数分两部份:参数名,参数值其内容既可以用put(key, value) 存放,也可以用System.getProperties()取得系统默认值。推荐使用 Properties.setProperty(String key, String value)例如下面的语句:props.put(127.0.0.1其中mail.smtp.host 是参数名,而127.0.0.1 是值。参数名不可以乱写,是JavaMail 体系文档里规定的。除了mail.smtp.host 之外还有:mail.transport.protocol调用getTransport()时可以得到它。返回默认
23、的传输协议mail.store.protocol调用getStore()时可以得到它,返回默认存储协议实现mail.host在没指定主机时,存储和传输时使用这个主机mail.user默认的用户 缺省值 user.namemail.from当前用户 缺省值 usernamehostmail.protocol.host缺省值 mail.hostmail.protocol.user缺省值 mail.usermail.debug会话调试开关,缺省是false 准备Session对象以备后用。Properties props = new Properties(); /开一个新特性props.put(“m
24、ail.transport.protocol”,”smtp”);props.put(“mail.smtp.host”,”);props.put(“mail.smtp.port”,”25”);Session mySession=Session.getInstance(props); /好了!创建成功!如果用getDefaultInstance 有什么区别?javax.mail.Authenticator类现在大多数邮件系统为了防止邮件乱发(spam),设定了smtp身份认证功能。因此发送的时候需要提供用户名密码的情况越来越多了。Java 用一个类来封装用户认证操作,这个类就是java.lang.
25、Object|+ - javax.mail.Authenticator(英文发音,重音在th 上)验证信息需要通过Session 传给邮件服务器,所以getInstance 有以下的变形static Session getInstance(Properties prop, Authenticator auth);static Session getDefaultInstance(Properties prop, Authenticator auth);其中的Authenticator 负责密码校验。如果不需要验证身份,就用 null 做第二个参数,或者干脆用单参数的getInstance()。
26、如果 session 是需要密码的,那么 session 会自动发出如下调用:javax.mail.PasswordAuthentication getPasswordAuthentication()PasswordAuthentication 是一个包装类,里面包了用户名和密码。如果smtp需要身份验证,则程序中需要自定义一个类继承Authenticatior,然后在类中实现getPasswordAuthentication()方法。class Auth extends AuthenticatorProperties pwd;public Auth() 在这里,构造方法建立一个 用户名-密码 列表,这个列表可以放在文件中,可以写死在java 程序里,也可以从jndi ldap 中去取。try pwd= new Properties();pwd.put(Alex,123Mary456Obama110 catch (Exception e) e.printStackTrace() ;public PasswordAuthentication getPasswordAuthentication() String str= getDefaultUserName(); / 取得当前的
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1