加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

[JavaMail]1 基础

(2011-08-12 17:27:43)
标签:

抽象类

对象

邮件服务器

电子邮件

发送

A、简介

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

JavaMail包中用于处理电子邮件的核心类是:Session,Message,Address,Authenticator,Store,Transport, Folder等。Session定义了一个基本的邮件会话,它需要从Properties中读取类似于邮件服务器,用户名和密码等信息。

 

B、javaMail常用类

B .1、Properties

java.util.Properties:JavaMail需要Properties来创建一个session对象。它将寻找字符串"mail.smtp.host",属性值就是发送邮件的主机,如:

   Properties props = new Properties ();

   props.put("mail.smtp.host", "smtp.abcd.com");//可以换上你的smtp主机名。

B .2、Session

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

这个Session类代表JavaMail中的一个邮件session。每一个基于JavaMail的应用程序至少有一个session但是可以有任意多的session。Session对象需要知道用来处理邮件的SMTP服务器。为了做到这一点,你可以参照下面的例子用Properties 来创建一个Session 对象

  Session sendMailSession;

  sendMailSession = Session.getInstance(props, null);

B .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 = new MimeMessage(sendMailSession);

B .4、Transport

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。

B .5、Store

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

Store store=s.getSorte("pop3");

store.connect(popserver,username,password);

B .6、Folder

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

Folder folder=store.getFolder("INBOX");

folder.open(Folder.READ_ONLY);

B .7、Address、InternetAddress

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

B .8、Authenticator

Javax.mail. Authenticator:与 Java.net 类一样,JavaMail API 也可以利用 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 对象返回给调用程序。

B .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可以代表一个部分。

B .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的内容

 

C、应用

C.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 void main(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";

String msgAttachment = "This is an attachment string!";

 

           send(smtpServer, to, from, subject, body, msgAttachment);          } catch (Exception ex) {

           System.out.println(ex.toString());

       }

       System.exit(0);

    }

 

    // 发送一封简单的邮件

    public static void send(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);

          

           System.out.println("Message sent OK.");

       } catch (Exception ex) {

           ex.printStackTrace();

       }

    }

 

    // 发送一封带有附件的邮件

    public static void send(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();

       }

    }

}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有