资源描述
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主机名。
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:与 J 类一样,JavaMail API 也可以利用 Authenticator 通过用户名和密码访问受保护的资源。对于JavaMail API来说,这些资源就是邮件服务器。JavaMail Authenticator在Javax.mail包中,而且它和J中同名的类Authenticator不同。两者并不共享同一个Authenticator,因为JavaMail API 用于Java 1.1,它没有 J 类别。
要使用 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@";
String from = "lijy@";
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);
/**
* java 通过System.getProperties()获取系统参数,
* 为Sesion.getDefultInstance准备参数。
*/
Session session = Session.getDefaultInstance(props, null);
/**
* 首先要一个emailsession(java.mail.Session),没有它什么都做不了。
* 调用了Sesion.getDefultInstance(…)来得到一个共享session。
* 建立一个session需要设置一些属性。 如果你通过SMTP发送消息,
* 那么至少需要设置mail.smtp.host属性。
* 在API文档中你可以找到其它的属性。
*/
Message msg = new MimeMessage(session);
/**
* 一旦获得Session对象,就可以继续创建要发送的消息。
* 可以设置email地址信息、主题、正文、头信息、日期、复制(CC)收件人。
*/
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);
/**
* 通过javax.mail.Transport类发送消息。
*/
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来创建邮件,
* 只需把上面的程序稍加修改就可以了,为了简单起见,
* 我在这里只是使用了一条字符串作为附件内容来解释如何添加附件。
*/
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();
}
}
}
展开阅读全文