JavaMail--基础类详解

来源:互联网 发布:python 3程序开发指南 编辑:程序博客网 时间:2024/04/30 21:31

一、JavaMail简介

JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口。它是Sun发布的用来处理email的API。它可以方便地执行一些常用的邮件传输。我们可以基于JavaMail开发出类似于Microsoft Outlook的应用程序。

JavaMail包中用于处理电子邮件的核心类是:Session,Message,Address,Authenticator,Store,Transport, Folder等。Session定义了一个基本的邮件会话,它需要从Properties中读取类似于邮件服务器,用户名和密码等信息。不过JDK中并没有包含,使用JavaMail发送邮件需要使用Sun发布的mail.jar和activtion.jar两个包。下载地址:http://download.csdn.net/detail/ljheee/9597518

二、javaMail常用类

1、Properties

由于JavaMail需要和邮件服务器进行通信,这就要求程序提供许多诸如服务器地址、端口、用户名、密码等信息,JavaMail通过Properties对象封装这些属性西信息。如下面的代码封装了两个属性信息:

    Properties props = new Properties();

    props.put("mail.smtp.host","smtp.sina.com.cn");

    props.put("mail.smtp.auth","true");

针对不同的的邮件协议,JavaMail规定了服务提供者必须支持一系列属性,下表是针对SMTP协议的一些常见属性(属性值都以String类型进行设置,属性类型栏仅表示属性是如何被解析的):

属性名

属性类型

说明

mail.stmp.host

String

SMTP服务器地址,如smtp.sina.com.cn

mail.stmp.port

int

SMTP服务器端口号,默认为25

mail.stmp.auth

boolean

SMTP服务器是否需要用户认证,默认为false

mail.stmp.user

String

SMTP默认的登陆用户名

mail.stmp.from

String

默认的邮件发送源地址

mail.stmp.socketFactory.class

String

socket工厂类类名,通过设置该属性可以覆盖提供者默认的实现,必须实现javax.net.SocketFactory接口

mail.stmp.socketFactory.port

int

指定socket工厂类所用的端口号,如果没有规定,则使用默认的端口号

mail.smtp.socketFactory.fallback

boolean

设置为true时,当使用指定的socket类创建socket失败后,将使用java.net.Socket创建socket,默认为true

mail.stmp.timeout

int

I/O连接超时时间,单位为毫秒,默认为永不超时

其他几个协议也有类似的一系列属性,如POP3mail.pop3.hostmail.pop3.port以及IMAPmail.imap.hostmail.imap.port等。

更详细的信息请查看com.sun.mail.smtpcom.sun.mail.pop3com.sun.mail.imap这三个包的Javadochttp://java.sun.com/products/javamail/javadocs/index.html


2、Session

Javax.mail.Session:Session类定义了一个基本邮件会话(session),是Java Mail API最高层入口类。所有其它类都是经由这个session才得以生效。Session对象用Java.util.Properties对象获取信息,如邮件服务器、用户名、密码及整个应用程序中共享的其它信息。

Session是一个很容易被误解的类,这归咎于混淆视听的类名。千万不要以为这里的SessionHttpSession一样代表真实的交互会话,但创建Session对象时,并没有对应的物理连接,它只不过是一对配置信息的集合。Session的主要作用包括两个方面:

1.接收各种配置属性信息:通过Properties对象设置的属性信息;

2.初始化JavaMail环境:根据JavaMail的配置文件,初始化JavaMail环境,以便通过Session对象创建其他重要类的实例。

所以,如果把Session更名为Configure也许更容易理解一些。

Session通过JavaMail配置文件以及程序中设置的Properties对象构建一个邮件处理环境,后续的处理将在Session基础上进行。Session拥有多个静态工厂方法用于创建Session实例。

这个Session类代表JavaMail中的一个邮件session。每一个基于JavaMail的应用程序至少有一个session但是可以有任意多的session。Session对象需要知道用来处理邮件的SMTP服务器。SessionJavaMail提供者配置文件以及设置属性信息的容器Session本身不会和邮件服务器进行任何的通信。所以在一般情况下,我们仅需要通过getDefaultInstance()获取一个共享的Session实例就可以了,下面的代码创建了一个Session实例:
  Session sendMailSession;
        sendMailSession =Session.getInstance(props, null);

3、Message、MimeMessage
Javax.mail.Message、javax.mail.MimeMessage:一旦获得Session对象,就可以继续创建要发送的消息。这由Message类来完成。因为Message是个抽象类,必需用一个子类,多数情况下为Javax.mail.internet.MimeMessage。MimeMessage是个能理解MIME类型和头的电子邮件消息,正如不同RFC中所定义的。虽然在某些头部域非ASCII字符也能被译码,但Message头只能被限制为用US-ASCII 字符。

Message对象将存储我们实际发送的电子邮件信息,Message对象被作为一个MimeMessage对象来创建并且需要知道应当选择哪一个JavaMail session。
Message newMessage = newMimeMessage(sendMailSession);

4、Transport-----邮件操作只有发送或接收两种处理方式,JavaMail将这两种不同操作描述为传输(javax.mail.Transport)和存储(javax.mail.Store

Javax.mail.Transport:消息发送的最后一部分是使用Transport类。这个类用协议指定的语言发送消息(通常是SMTP)。它是抽象类,它的工作方式与Session有些类似。仅调用静态send() 方法,就能使用类的缺省版本:Transport.send(message)。或者,读者也可以从针对自己的协议的会话中获得一个特定的实例,传递用户名和密码(如果不必要就不传),发送消息,然后关闭连接。

邮件是既可以被发送也可以被接收到。JavaMail使用了两个不同的类来完成这两个功能:Transport和Store。Transport是用来发送信息的,而Store用来收信。

  Transport transport;

        transport =sendMailSession.getTransport(smtp);

用JavaMail Session对象的getTransport方法来初始化Transport。传过去的字符串申明了对象所要使用的协议,如smtp。这将为我们省了很多时间。因为JavaMail以境内置了很多协议的实现方法。

注意: JavaMail并不是绝对支持每一个协议,目前支持IMAP、 SMTP和POP3。

5、Store
Javax.mail.Store:Store类实现特定邮件协议上的读、写、监视、查找等操作。通过Javax.mail.Store类可以访问Javax.mail.Folder类。

Store store=s.getSorte(pop3);
store.connect(popserver,username,password);

6、Folder
Javax.mail.Folder:Folder类用于分级组织邮件,并提供照Javax.mail.Message格式访问email的能力。

Folder folder=store.getFolder(INBOX);
folder.open(Folder.READ_ONLY);

7、Address、InternetAddress
Javax.mail.Address、Javax.mail.internet.InternetAddress:一旦您创建了Session 和Message,并将内容填入消息后,就可以用 Address 确定信件地址了。和 Message 一样,Address也是个抽象类。您用的是Javax.mail.internet.InternetAddress 类。

一旦创建了 address(地址),将它们与消息连接的方法有两种。如果要识别发件人,您可以用 setFrom() setReplyTo()方法。

message.setFrom(address)

需要消息显示多个 from地址,可以使用 addFrom()方法:

Address address[] = ...;

message.addFrom(address);

若要识别消息recipient(收件人),您可以使用addRecipient()方法。除 address(地址)外,这一方法还请求一个 Message.RecipientType

message.addRecipient(type, address)

三种预定义的地址类型是:

Message.RecipientType.TO

Message.RecipientType.CC

Message.RecipientType.BCC


8、Authenticator
Javax.mail. Authenticator:与 Java.net 类一样,JavaMailAPI 也可以利用 Authenticator 通过用户名和密码访问受保护的资源。对于JavaMail API来说,这些资源就是邮件服务器。JavaMail Authenticator在Javax.mail包中,而且它和Java.net中同名的类Authenticator不同。两者并不共享同一个Authenticator,因为JavaMail API 用于Java 1.1,它没有Java.net 类别。

要使用 Authenticator,先创建一个抽象类的子类,并从getPasswordAuthentication() 方法中返回PasswordAuthentication 实例。创建完成后,您必需向session 注册Authenticator。然后,在需要认证的时候,就会通知Authenticator。您可以弹出窗口,也可以从配置文件中(虽然没有加密是不安全的)读取用户名和密码,将它们作为PasswordAuthentication 对象返回给调用程序。

9、Multipart、MimeMultpart
javax.mail.Multipart、javax.mail.Internet.MimeMultpart:一般保存电子邮件内容的容器是Multipart抽象类,它定义了增加和删除及获得电子邮件不同部分内容的方法。由于Multipart是抽象类,我们必须为它使用一个具体的子类,JavaMail API提供javax.mail.Internet.MimeMultpart类来使用MimeMessage对象。

        MimeMultipart multipart=new MimeMultipart();

注:我们使用MimeMultipart对象的一个方法是addBodyPart(),它在我们的电子邮件内容里添加BodyPart对象。消息可以有很多部分,一个BodyPart可以代表一个部分。

10、BodyPart、MimeBodyPart
javax.mail.BodyPart、javax.mail.Internet.MimeBodyPart:MimeBodyPart是BodyPart具体用于mimeMessage的一个子类。MimeBodyPart对象代表一个MimeMessage对象内容的一部分。每个MimeBodyPart被认为有两部分:MIME类型和匹配这个类型的内容

MimeBodyPart mdp=new MimeBodyPart();

String text=Hello JavaMail!;

mdp.setContent(text,text/plain);

//定义MIME类型为text/plain,并设置MimeBodyPart的内容

 三、实例应用

1、通过SMTP发送一封普通邮件

package com.test;

import java.util.Date;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

public class SimpleSender {

    public static voidmain(String args[]) {

       try {

          String smtpServer = 192.168.1.254;
          String to =  jizhou@xxxx.com ;
          String from =  lijy@xxxx.com ;
          String subject =  test mail ;
          String body =  test mail ;

    StringmsgAttachment =  This is an attachment string! ;
          send(smtpServer, to, from, subject, body,msgAttachment);         

}catch (Exception ex) {
          System.out.println(ex.toString());
       }
      
    }

    // 发送一封简单的邮件
    public static voidsend(String smtpServer, String to, String from,

     String subject, String body) {

       try {

          Properties props = System.getProperties();//属性封装

          props.put( mail.smtp.host , smtpServer);

          Session session = Session.getDefaultInstance(props, null);//建立会话

          Message msg = new MimeMessage(session);//生成消息体
          msg.setFrom(new InternetAddress(from)); // 发件人地址

          InternetAddress[] address = { new InternetAddress(to) };

          msg.setRecipients(Message.RecipientType.TO, address);  // 收件人地址,可以是一个或多个。

          msg.setSubject(subject);// 邮件主题

          msg.setSentDate(new Date());// 发送时间

          msg.setText(body);  // 邮件正文的内容

          msg.setHeader( X-Mailer ,  LOTONtechEmail );

          Transport.send(msg);//利用消息发送message
          System.out.println( Message sent OK. );

       } catch(Exception ex) {
          ex.printStackTrace();
       }
    }

    // 发送一封带有附件的邮件
    public static voidsend(String smtpServer, String to, String from,

          String subject, String body, String msgAttachment) {

       try {
          Properties props = System.getProperties();

          props.put( mail.smtp.host , smtpServer);

          Session session = Session.getDefaultInstance(props, null);

          Message msg = new MimeMessage(session);

          msg.setFrom(new InternetAddress(from));

          InternetAddress[] address = { new InternetAddress(to) };

          msg.setRecipients(Message.RecipientType.TO, address);

          msg.setSubject(subject);

          msg.setSentDate(new Date());

          msg.setHeader( X-Mailer ,  LOTONtechEmail );

          MimeBodyPart mbp1 = new MimeBodyPart();

          mbp1.setText(body);

          // 把前面定义的msgText中的文字设定为邮件正文的内容
          MimeBodyPart mbp2 = new MimeBodyPart();
          mbp2.setText(msgAttachment,  utf-8 );

          // 创建附件部分
          Multipart mp = new MimeMultipart();

          // 创建Multipart
          mp.addBodyPart(mbp1);

          mp.addBodyPart(mbp2);

          // 把前面定义的正文和附件都添加到Multipart中
          msg.setContent(mp);

          // 添加 Multipart到Message中
          Transport.send(msg);

          System.out.println( Message sent OK. );
       } catch(Exception ex) {
          ex.printStackTrace();
       }
    }

}

参考引用:http://blog.csdn.net/perfect2011/article/details/19193841

1 0
原创粉丝点击