java mail 实践(简介)

    技术2022-05-19  24

     

    开发之前先要有两个jar包

    写代码之前先要了解几个mail中的常用对象

    * Session

    这个Session类定义了一个基础的mail会话。

    就像Http会话那样,我们进行收发邮件的工作都是基于这个会话的。Session对象利用了java.util.Properties对象获得了邮件服务器、用户名、密码信息和整个应用程序都要使用到的共享信息。

    由于Session类的构造器是private权限的,所以只能通过static方法来获得Session instance。

    即:

        // 第一种方式 Session session = Session.getIanstance(Properties properties, Authentic authentic); // 第二种方式 Session session = Session.getDefaultIanstance(Properties properties, Authentic authentic);

    getDefaultInstance方法使用的是代理模式,Session中的属性只初始化一次。

    getInstance方法是,每调用一次,就获得一个新的对象。

     

    * Message

    有了Session会话对象,下一步就是创建要发送的消息体了。因为Message是一个抽象类,所以我们通常使用它的一个子类 -  javax.mail.internet.MimeMessage这个子类,该类是使用MIME类型、MIME信息头的邮箱信息。信息头只能使用US-ASCII字符,而非ASCII字符将通过编码转换为ASCII的方式使用。

    MimeMessage message = new MimeMessage(session);

    注意:对于MimeMessage类来讲存在着多种构造方法,比如使用输入流作为参数的构造方法。

    在建立了MimeMessage对象后,我们需要设置它的各个part,对于MimeMessage类来说,这些part就是MimePart接口。最基本的设置信息内容的方法就是通过表示信息内容和米么类型的参数调用setContent()方法: message.setContent("Hello", "text/plain");  

    然而,如果我们所使用的MimeMessage中信息内容是文本的话,我们便可以直接使用setText()方法来方便的设置文本内容。

    message.setText("Hello");

    前面所讲的两种方法,对于文本信息,后者更为合适。而对于其它的一些信息类型,比如HTML信息,则要使用前者。

    别忘记了,使用setSubject()方法对邮件设置邮件主题:

    message.setSubject("First");

     

    * 邮件地址类Address

    有了Session,Message,下一步要填充Message。Address也是一个抽象类。这里要用到Address的一个子类 - javax.mail.internet.InternetAddress。

    下边是用一个email地址来创建一个Address对象。

    Address address = new InternetAddress("youremail@domain.name");

     

    创建一个带名字的Address

    Address address = new InternetAddress("youremail@domain.name","your name");  

    有了地址,我们可以设置发件人和收件人了。

    发件人设置有两个方法:

    message.setFrom(address); message.setReplyTo(address);

    如果有多个发件人,你可以是用setForm设置:

     

    Address address[] = new InternetAddress[]{new InternetAddress("sender1@domain.com"),new InternetAddress("sender2@domain.com")}; message.setFrom(address);

    收件人的设置:

    message.addRecipient(type, address)

    type - 收件人的类型

    // 发送 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);

     

    * 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 information Authenticator auth = new MyAuthenticator(); Session session = Session.getDefaultInstance(props, auth);

     

    * Transport

    在发送信息时,Transport类将被用到。这个类实现了发送信息的协议(通称为SMTP),此类是一个抽象类,我们可以使用这个类的静态方法send()来发送消息:

     

    当然,方法是多样的。我们也可由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)。

     

    * Store and 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所要完成的高级功能。


    源自:http://www.5dmail.net/html/2006-1-5/200615154918.htm

     

     

     


    最新回复(0)