技术开发 频道

JavaMail API细节详细解析大全系列之二

  若在邮件中存在多个发信人地址,我们可用addForm()方法增加发信人:
 
Address address[] = ...;
message.addFrom(address);
 
  为了设置收信人,我们使用addRecipient()方法增加收信人,此方法需要使用Message.RecipientType的常量来区分收信人的类型:
 
message.addRecipient(type, address)
 
下面是Message.RecipientType的三个常量:
 
Message.RecipientType.TO
Message.RecipientType.CC
Message.RecipientType.BCC
 
  因此,如果我们要发送邮件给总统,并发用一个副本给第一夫人的话,下面的方法将被用到:
 
Address toAddress = new InternetAddress
("vice.president@whitehouse.gov");
Address ccAddress =
new InternetAddress("first.lady@whitehouse.gov");
message.addRecipient
(Message.RecipientType.TO, toAddress);
message.addRecipient
(Message.RecipientType.CC, ccAddress);
 
  JavaMail API并没有提供检查邮件地址有效性的机制。当然我们可以自己完成这个功能:验证邮件地址的字符是否按照RFC822规定的格式书写或者通过DNS服务器上的MX记录验证等。
 
E.Authenticator
 
  像java.net类那样,JavaMail API通过使用授权者类(Authenticator)以用户名、密码的方式访问那些受到保护的资源,在这里资源就是指邮件服务器。在javax.mail包中可以找到这个JavaMail的授权者类(Authenticator)。
 
  在使用Authenticator这个抽象类时,我们必须采用继承该抽象类的方式,并且该继承类必须具有返回PasswordAuthentication对象(用于存储认证时要用到的用户名、密码)getPasswordAuthentication()方法。并且要在Session中进行注册,使Session能够了解在认证时该使用哪个类。下面代码片断中的MyAuthenticator就是一个Authenticator的子类。
 
Properties props = new Properties();
// fill props with
any informationAuthenticator
auth = new MyAuthenticator();
Session session =
Session.getDefaultInstance(props, auth);
 
F.Transport
 
  在发送信息时,Transport类将被用到。这个类实现了发送信息的协议(通称为SMTP),此类是一个抽象类,我们可以使用这个类的静态方法send()来发送消息:
 
Transport.send(message);
 
  当然,方法是多样的。我们也可由Session获得相应协议对应的Transport实例。并通过传递用户名、密码、邮件服务器主机名等参数建立与邮件服务器的连接,并使用sendMessage()方法将信息发送,最后关闭连接:
 
message.saveChanges();
// implicit with send()
Transport transport =
session.getTransport("smtp");
transport.connect(host, username, password);
transport.sendMessage
(message, message.getAllRecipients());
transport.close();
 
  评论:上面的方法是一个很好的方法,尤其是在我们在同一个邮件服务器上发送多个邮件时。因为这时我们将在连接邮件服务器后连续发送邮件,然后再关闭掉连接。send()这个基本的方法是在每次调用时进行与邮件服务器的连接的,对于在同一个邮件服务器上发送多个邮件来讲可谓低效的方式。
 
注意:如果需要在发送邮件过程中监控mail命令的话,可以在发送前设置debug标志:
 
session.setDebug(true)
 
G.Store和Folder
 
  接收邮件和发送邮件很类似都要用到Session。但是在获得Session后,我们需要从Session中获取特定类型的Store,然后连接到Store,这里的Store代表了存储邮件的邮件服务器。在连接Store的过程中,极有可能需要用到用户名、密码或者Authenticator。
 
// Store store = session.getStore("imap");
Store store = session.getStore("pop3");
store.connect(host, username, password);
 
  在连接到Store后,一个Folder对象即目录对象将通过Store的getFolder()方法被返回,我们可从这个Folder中读取邮件信息:
 
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
Message message[] = folder.getMessages();
 
  上面的例子首先从Store中获得INBOX这个Folder(对于POP3协议只有一个名为INBOX的Folder有效),然后以只读(Folder.READ_ONLY)的方式打开Folder,最后调用Folder的getMessages()方法得到目录中所有Message的数组。
 
  注意:对于POP3协议只有一个名为INBOX的Folder有效,而对于IMAP协议,我们可以访问多个Folder(想想前面讲的IMAP协议)。而且SUN在设计Folder的getMessages()方法时采取了很智能的方式:首先接收新邮件列表,然后再需要的时候(比如读取邮件内容)才从邮件服务器读取邮件内容。
 
  在读取邮件时,我们可以用Message类的getContent()方法接收邮件或是writeTo()方法将邮件保存,getContent()方法只接收邮件内容(不包含邮件头),而writeTo()方法将包括邮件头。
 
System.out.println
(((MimeMessage)message).getContent());
 
在读取邮件内容后,别忘记了关闭Folder和Store。
 
folder.close(aBoolean);
store.close();
 
传递给Folder.close()方法的boolean 类型参数表示是否在删除操作邮件后更新Folder。
 
H.继续向前进!
 
  在讲解了以上的七个Java Mail核心类定义和理解了简单的代码片断后,下文将详细讲解怎样使用这些类实现JavaMail API所要完成的高级功能。
0
相关文章