JavaMail 实战篇

1.发送邮件
    在获得了Session后,建立并填入邮件信息,然后发送它到邮件服务器。这便是使用Java Mail API发送邮件的过程,在发送邮件之前,我们需要设置SMTP服务器:通过设置Properties的mail.smtp.host属性。建立邮件信息和发送邮件的过程中可能会抛出异常。
  String from = "xxx@xxx.com";
  String to = "xxx@xxx.com";
  String subject = "Test mail";
  String body = "A text mail";
  Properties props = System.getProperties();
  // 设置SMTP邮件服务器:
  props.put("mail.smtp.host", "smtp.163.com");
  // SMTP服务器需要验证:
  props.put("mail.smtp.auth", "true");
  // 设置邮件传输协议为:smtp
  props.put("mail.transpost.protocol", "smtp");
  // 设置邮件服务器端口
  props.put("mail.smtp.port", "25");
  // 传入用户名和口令:
  Session session = Session.getDefaultInstance(props,
    new SMTPAuthenticator("xxx@xxx.com", "...."));
  // 创建新邮件:
  Message msg = new MimeMessage(session);
  msg.setFrom(new InternetAddress(from));
  msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to,
    false));
  msg.setSubject(subject);
  msg.setText(body);
  msg.setSentDate(new Date());
  // 发送:
  Transport.send(msg);
  System.out.println("OK");


  //定义的认证类
  public class SMTPAuthenticator extends Authenticator {
   String userName;
   String password;
   public SMTPAuthenticator(){
   }
   public SMTPAuthenticator(String userName, String password){
    this.userName = userName;
    this.password = password;
   }
   public PasswordAuthentication getPasswordAuthentication() {
     return new PasswordAuthentication(userName, password);
   }
  }



2.接收邮件
    为了在读取邮件,我们获得了session,并且连接到了邮箱的相应store,打开相应的Folder,然后得到我们想要的邮件,当然别忘记了在结束时关闭连接。
  String host = ...;
  String username = ...;
  String password = ...;
  // Create empty properties
  Properties props = new Properties();
  // Get session
  Session session = Session.getDefaultInstance(props, null);
  // Get the store
  Store store = session.getStore("pop3");
  store.connect(host, username, password);
  // Get folder
  Folder folder = store.getFolder("INBOX");
  folder.open(Folder.READ_ONLY);
  // Get directory
  Message message[] = folder.getMessages();
  for (int i=0, n=message.length; i<n; i++) {  
      System.out.println(i + ": " + message.getFrom()[0]
                                        + " " + message.getSubject());
  }
  // Close connection
  folder.close(false);
  store.close();  

上面的代码所作的是从邮箱中读取每个邮件,并且显示邮件的发信人地址和主题。从技术角度讲,这里存在着一个异常的可能:当发信人地址为空时,getFrom()[0]将抛出异常。

3.删除邮件和标志
    设置与message相关的Flags是删除邮件的常用方法。这些Flags表示了一些系统定义和用户定义的不同状态。在Flags类的内部类Flag中预定义了一些标志:
  Flags.Flag.ANSWERED
  Flags.Flag.DELETED
  Flags.Flag.DRAFT
  Flags.Flag.FLAGGED
  Flags.Flag.RECENT
  Flags.Flag.SEEN
  Flags.Flag.USER
但需要在使用时注意的:标志存在并非意味着这个标志被所有的邮件服务器所支持。例如,对于删除邮件的操作,POP协议不支持上面的任何一个。所以要确定哪些标志是被支持的——通过访问一个已经打开的Folder对象的getPermanetFlags()方法,它将返回当前被支持的Flags类对象。
删除邮件时,我们可以设置邮件的DELETED标志:
  message.setFlag(Flags.Flag.DELETED, true);  
但是首先要采用READ_WRITE的方式打开Folder:
  folder.open(Folder.READ_WRITE);  
在对邮件进行删除操作后关闭Folder时,需要传递一个true作为对删除邮件的擦除确认。
  folder.close(true);  
Folder类中另一种用于删除邮件的方法expunge()也同样可删除邮件,但是它并不为sun提供的POP3实现支持,而其它第三方提供的POP3实现支持或者并不支持这种方法。
另外,介绍一种检查某个标志是否被设置的方法:Message.isSet(Flags.Flag flag)方法,其中参数为被检查的标志。

4.邮件认证
    前面介绍了如何使用Authenticator类来代替直接使用用户名和密码这两字符串作为Session.getDefaultInstance()或者Session.getInstance()方法的参数。在前面的小试牛刀后,现在我们将了解到全面认识一下邮件认证。
我们在此取代了直接使用邮件服务器主机名、用户名、密码这三个字符串作为连接到POP3 Store的方式,使用存储了邮件服务器主机名信息的属性文件,并在获得Session时传入自定义的Authenticator实例:
  // Setup properties
  Properties props = System.getProperties();
  props.put("mail.pop3.host", host);
  // Setup authentication, get session
  Authenticator auth = new PopupAuthenticator();
  Session session = Session.getDefaultInstance(props, auth);
  // Get the store
  Store store = session.getStore("pop3");
  store.connect();
  

PopupAuthenticator类继承了抽象类Authenticator,并且通过重载Authenticator类的getPasswordAuthentication()方法返回PasswordAuthentication类对象。而getPasswordAuthentication()方法的参数param是以逗号分割的用户名、密码组成的字符串。
  import javax.mail.*;
  import java.util.*;
  public class PopupAuthenticator extends Authenticator {  
      public PasswordAuthentication getPasswordAuthentication() {
          String username, password;
          StringTokenizer st = new StringTokenizer(param, ",");
          username = st.nextToken();
          password = st.nextToken();
          return new PasswordAuthentication(username, password);
      }
  }


5.回复邮件
    回复邮件的方法很简单:使用Message类的reply()方法,通过配置回复邮件的收件人地址和主题(如果没有提供主题的话,系统将默认将“Re:”作为邮件的主体),这里不需要设置任何的邮件内容,只要复制发信人或者reply-to到新的收件人。而reply()方法中的boolean参数表示是否将邮件回复给发送者(参数值为false),或是恢复给所有人(参数值为true)。补充一下,reply-to地址需要在发信时使用setReplyTo()方法设置。
  MimeMessage reply = (MimeMessage)message.reply(false);
  reply.setFrom(new InternetAddress("xxx@xxx.com"));
  reply.setText("Thanks");
  Transport.send(reply);


6.转发邮件
    转发邮件的过程不如前面的回复邮件那样简单,它将建立一个转发邮件,这并非一个方法就能做到。
每个邮件是由多个部分组成,每个部分称为一个邮件体部分,是一个BodyPart类对象,对于MIME类型邮件来讲就是MimeBodyPart类对象。这些邮件体包含在成为Multipart的容器中对于MIME类型邮件来讲就是MimeMultiPart类对象。在转发邮件时,我们建立一个文字邮件体部分和一个被转发的文字邮件体部分,然后将这两个邮件体放到一个Multipart中。说明一下,复制一个邮件内容到另一个邮件的方法是仅复制它的DataHandler(数据处理者)即可。这是由JavaBeans Activation Framework定义的一个类,它提供了对邮件内容的操作命令的访问、管理了邮件内容操作,是不同的数据源和数据格式之间的一致性接口。
  // Create the message to forward
  Message forward = new MimeMessage(session);
  // Fill in header
  forward.setSubject("Fwd: " + message.getSubject());
  forward.setFrom(new InternetAddress(from));
  forward.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
  // Create your new message part
  BodyPart messageBodyPart = new MimeBodyPart();
  messageBodyPart.setText(  "Here you go with the original message:");
  // Create a multi-part to combine the parts
  Multipart multipart = new MimeMultipart();
  multipart.addBodyPart(messageBodyPart);
  // Create and fill part for the forwarded contentmessage
  BodyPart = new MimeBodyPart();
  messageBodyPart.setDataHandler(message.getDataHandler());
  // Add part to multi part
  multipart.addBodyPart(messageBodyPart);
  // Associate multi-part with message
  forward.setContent(multipart);  
  // Send message
  Transport.send(forward);


7.使用附件
    附件作为与邮件相关的资源经常以文本、表格、图片等格式出现,如流行的邮件客户端一样,我们可以用JavaMail API从邮件中获取附件或是发送带有附件的邮件。

8.处理HTML邮件 
    略

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值