zoukankan      html  css  js  c++  java
  • Java Mail(三):Session、Message详解

    http://blog.csdn.net/ghsau/article/details/17909093

    *************************************

           本文来自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/17909093,转载请注明。
           上篇文章介绍了JavaMail并实现了一个发送邮件的简单示例,JavaMail API使用上非常灵活,比如,服务器信息可以设置到Session中,也可以设置到Transport中,收件人可以设置到Message中,也可以设置到Transport中,如何使用,取决于我们应用程序中的实际情况。本文详细的介绍一下这三个类的主要方法。

    Session

     
           Session用于收集JavaMail运行过程中的环境信息,它可以创建一个单例的对象,也可以每次创建新的对象,Session没有构造器,只能通过如下方法创造实例:
    static Session getDefaultInstance(Properties props)
              Get the default Session object.
    static Session getDefaultInstance(Properties props,Authenticator authenticator)
              Get the default Session object.
    static Session getInstance(Properties props)
              Get a new Session object.
    static Session getInstance(Properties props,Authenticator authenticator)
              Get a new Session object.

           getDefaultInstance得到的始终是该方法初次创建的缺省的对象,而getInstance得到的始终是新的对象,Authenticator的使用后面会说到。通过Session可以创建Transport(用于发送邮件)和Store(用于接收邮件),Transport和Store是JavaMail API中定义好的接口,通过上文我们知道JavaMail分为API和service provider两部分,API定义了相关接口(eg.:Transport and Store),service provider中实现了这些接口,这些实现类配置在名为javamail.providersjavamail.default.providers的文件中,该文件放在mail.jar/smtp.jar/pop3.jar/imap.jar中的META-INF下,文件内容格式如:

        # JavaMail IMAP provider Sun Microsystems, Inc  
        protocol=imap; type=store; class=com.sun.mail.imap.IMAPStore; vendor=Sun Microsystems, Inc;  
        protocol=imaps; type=store; class=com.sun.mail.imap.IMAPSSLStore; vendor=Sun Microsystems, Inc;  
        # JavaMail SMTP provider Sun Microsystems, Inc  
        protocol=smtp; type=transport; class=com.sun.mail.smtp.SMTPTransport; vendor=Sun Microsystems, Inc;  
        protocol=smtps; type=transport; class=com.sun.mail.smtp.SMTPSSLTransport; vendor=Sun Microsystems, Inc;  
        # JavaMail POP3 provider Sun Microsystems, Inc  
        protocol=pop3; type=store; class=com.sun.mail.pop3.POP3Store; vendor=Sun Microsystems, Inc;  
        protocol=pop3s; type=store; class=com.sun.mail.pop3.POP3SSLStore; vendor=Sun Microsystems, Inc;  

         每一行声明了协议名称、类型、实现类、供应商、版本等信息,如果需要自己实现相应的协议,必须按照该格式配置好,Java Mail API中才能正确的调用到。Session中提供的创建Trasnsport和Store的方法如下:

     Store getStore()
              Get a Store object that implements this user's desired Store protocol.
     Store getStore(Provider provider)
              Get an instance of the store specified by Provider.
     Store getStore(String protocol)
              Get a Store object that implements the specified protocol.
     Store getStore(URLName url)
              Get a Store object for the given URLName.
     Transport getTransport()
              Get a Transport object that implements this user's desired Transport protcol.
     Transport getTransport(Address address)
              Get a Transport object that can transport a Message of the specified address type.
     Transport getTransport(Provider provider)
              Get an instance of the transport specified in the Provider.
     Transport getTransport(String protocol)
              Get a Transport object that implements the specified protocol.
     Transport getTransport(URLName url)
              Get a Transport object for the given URLName.

           可以看到,重载了很多,这些方法最终都会去解析上文提到的配置文件,找到对应配置信息。

     

    Message


           Message是邮件的载体,用于封装邮件的所有信息,Message是一个抽象类,已知的实现类有MimeMessage。一封完整的邮件都有哪些信息呢?我们打开一个邮件客户端,我用的是FoxMail,新建一封邮件,如下图所示:

           这就是一封完整的邮件包含的所有信息,默认情况下是没有暗送和回复设置的,可以通过菜单栏-->查看-->暗送地址/回复地址来显示出来,回复地址默认情况下为发件人,暗送是比较猥琐的发邮件方式,暗送邮件除了被暗送者,没有人能知道暗送给谁了,邮件头信息中也不会记录。下面来看下Message中设置邮件信息的一些方法。

    发件人

    abstract  void setFrom()
              Set the "From" attribute in this Message.
    abstract  void setFrom(Address address)
              Set the "From" attribute in this Message.
           现在大多数SMTP服务器要求发件人与连接账户必须一致,否则会抛出验证失败的异常,这样是防止用户伪装成其它人的账户恶意发送邮件。

    收件人/抄送人/暗送人

    void setRecipient(Message.RecipientType type,Address address)
              Set the recipient address.
    abstract  void setRecipients(Message.RecipientType type,Address[] addresses)
              Set the recipient addresses.
           第一个方法设置单个人,第二个方法设置多个人。方法中第一个参数涉及到另一个类RecipientType,该类是Message的静态内部类,期内有三个常量值:
    static Message.RecipientType BCC
              The "Bcc" (blind carbon copy) recipients.
    static Message.RecipientType CC
              The "Cc" (carbon copy) recipients.
    static Message.RecipientType TO
              The "To" (primary) recipients.
           TO - 收件人;CC - 抄送人;BCC - 暗送人。

    回复人

     void setReplyTo(Address[] addresses)
              Set the addresses to which replies should be directed.
           设置收件人收到邮件后的回复地址。

    标题

    abstract  void setSubject(String subject)
              Set the subject of this message.
           设置邮件标题/主题。

    内容

     void setContent(Multipart mp)
              This method sets the given Multipart object as this message's content.
     void setContent(Object obj,String type)
              A convenience method for setting this part's content.
     void setText(String text)
              A convenience method that sets the given String as this part's content with a MIME type of "text/plain".
           设置邮件文本内容、HTML内容、附件内容。
     

    示例

     

           下面来看一个稍复杂点的示例:

        public class JavaMailTest2 {  
          
            public static void main(String[] args) throws MessagingException {  
                Properties props = new Properties();  
                // 开启debug调试  
                props.setProperty("mail.debug", "true");  
                // 发送服务器需要身份验证  
                props.setProperty("mail.smtp.auth", "true");  
                // 设置邮件服务器主机名  
                props.setProperty("mail.host", "smtp.163.com");  
                // 发送邮件协议名称  
                props.setProperty("mail.transport.protocol", "smtp");  
                  
                // 设置环境信息  
                Session session = Session.getInstance(props, new Authenticator() {  
                    // 在session中设置账户信息,Transport发送邮件时会使用  
                    protected PasswordAuthentication getPasswordAuthentication() {  
                        return new PasswordAuthentication("java_mail_001", "javamail");  
                    }  
                });  
                  
                // 创建邮件对象  
                Message msg = new MimeMessage(session);  
                // 发件人  
                msg.setFrom(new InternetAddress("java_mail_001@163.com"));  
                // 多个收件人  
                msg.setRecipients(RecipientType.TO, InternetAddress.parse("java_mail_002@163.com,java_mail_003@163.com"));  
                // 抄送人  
                msg.setRecipient(RecipientType.CC, new InternetAddress("java_mail_001@163.com"));  
                // 暗送人  
                msg.setRecipient(RecipientType.BCC, new InternetAddress("java_mail_004@163.com"));  
                  
                // 主题  
                msg.setSubject("中文主题");  
                // HTML内容  
                msg.setContent("<div align="center">你好啊</div>", "text/html;charset=utf-8");  
                  
                // 连接邮件服务器、发送邮件、关闭连接,全干了  
                Transport.send(msg);  
            }  
          
        }  
  • 相关阅读:
    AX ERROR: Could not find my mock parent, most likely I am stale 不及格的程序员
    利用Segue在视图控制器间传值的问题 不及格的程序员
    Creating a Singleton Instance 不及格的程序员
    iPad 通知 UIKeyboardWillShowNotification 不会在keyBoard处在Undock状态下接到通知 不及格的程序员
    Why RootViewController's view is rotated Automatically by System when the app first loaded? 不及格的程序员
    如何弹出UIDatePicker最好 不及格的程序员
    jQuery开始做恶了 不及格的程序员
    what is the SEL,id and IMP,Class ,Method? 不及格的程序员
    Objectivec 字符串比较的陷井 不及格的程序员
    Unable to create any keyboard shortcuts after the iOS 6.1.3 update on iPad. 不及格的程序员
  • 原文地址:https://www.cnblogs.com/zhao1949/p/6427261.html
Copyright © 2011-2022 走看看