引用自http://blog.sina.com.cn/s/articlelist_1832656582_7_1.html
[JavaMail]1 基础
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);//利用消息发送message
?????????? 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();
?????? }
??? }
}
[JavaMail]2 身份验证
A、原理
Authenticator
Authenticator (Javax.mail.Authenticator):JavaMail利用Authenticator通过用户名和密码访问受保护的资源。对于JavaMail API来说,这些资源就是邮件服务器。
要使用Authenticator,先创建一个抽象类的子类(extends Authenticator),在子类中覆盖父类中的 getPasswordAuthentication() 方法,就可以实现以不同的方式来进行登录邮箱时的用户身份认证。JavaMail 中的这种设计是使用了策略模式(Strategy),具体的请参看相关文章。创建完成后,您必需向session注册Authenticator。然后,在需要认证的时候,就会通知Authenticator。
?
B、应用
下面例子,我们设计了一种简单的 SimpleAuthenticator 子类通过构造函数传入用户名和密码,而另一种 GUIAuthenticator 子类则使用 GUI 界面的形式进行身份认证,它可以使得程序在运行时弹出输入对话框来让用户提交用户名和密码。
package com.test;
?
import java.util.Date;
import java.util.Properties;
import java.util.StringTokenizer;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
import javax.swing.JOptionPane;
?
// 创建抽象类Authenticator的子类,SimpleAuthenticator通过构造函数传入身份验证信息
class SimpleAuthenticator extends Authenticator {
??? private String user;
??? private String pwd;
?
??? public SimpleAuthenticator(String user, String pwd) {
?????? this.user = user;
?????? this.pwd = pwd;
??? }
?
??? @Override
??? protected PasswordAuthentication getPasswordAuthentication() {
?????? return new PasswordAuthentication(user, pwd);
??? }
}
?
// 通过弹出输入对话框传入身份验证信息
class GUIAuthenticator extends Authenticator {
??? @Override
??? protected PasswordAuthentication getPasswordAuthentication() {
?????? String user;
?????? String pwd;
?????? // 弹出输入对话框
?????? String result = JOptionPane.showInputDialog( 请输入用户名和密码,以','隔开! );
?????? StringTokenizer st = new StringTokenizer(result,? , );
?????? user = st.nextToken();
?????? pwd = st.nextToken();
?????? return new PasswordAuthentication(user, pwd);
??? }
}
?
public class UseAuthenticatorSender {
??? private String smtpServer =? 192.168.1.254 ;
??? private String from =? lijy@xxxx.com ;
??? private String to =? jizhou@xxx.com ;
??? private String subject =? 使用Authenticator子类进行用户身份认证 ;
??? private String body =? 使用Authenticator子类进行用户身份认证的测试! ;
?
??? public void sendMails(Authenticator auth) throws Exception {
?????? // 设置协议、是否身份验证、服务器等信息
?????? Properties props = new Properties();
?????? props.setProperty( mail.transport.protocol ,? smtp );
?????? // 指定发送邮件协议
?????? props.setProperty( mail.smtp.auth ,? true );
?????? // 向SMTP服务器提交用户认证
?????? props.setProperty( mail.host , smtpServer);
?????? // SMTP服务器主机地址
?????? Session session = Session.getInstance(props, auth);
?????? // 通过传入的参数获得Authenticator子类对
?????? session.setDebug(true);
?????? // 调试模式
?????? MimeMessage msg = new MimeMessage(session);
?????? msg.setFrom(new InternetAddress(from));
?????? msg.setRecipient(RecipientType.BCC, new InternetAddress(to));
?????? msg.setSubject(subject);
?????? msg.setSentDate(new Date());
?????? msg.setText(body);
?????? msg.saveChanges();
?????? Transport.send(msg);
??? }
?
??? public static void main(String[] args) throws Exception {
?????? UseAuthenticatorSender sender = new UseAuthenticatorSender();
?????? // 这里体现了使用策略模式的好处,客户端可以选择使用
?????? // 具体的哪一种身份验证方式来提交信息
?????? // Authenticator auth = new SimpleAuthenticator( xxx ,? xxxx );
?????? Authenticator auth = new GUIAuthenticator();
?????? sender.sendMails(auth);
??? }
}
[JavaMail]3 接收、处理邮件
A、原理
接收邮件可以应用协议(POP3或IMAP)。
A.1、接收邮件过程
参考下面例子中showMessages()
1.Store(Javax.mail.Store)
接收邮件和发送邮件很类似都要用到Session。但是在获得Session后,我们需要从Session中获取特定类型的Store,然后连接到Store,这里的Store代表了存储邮件的邮件服务器。在连接Store的过程中,极有可能需要用到用户名、密码或者Authenticator。
Store store = session.getStore( imap );
Store store = session.getStore( pop3 );
store.connect(host, username, password);
2.Folder(Javax.mail.Folder)
在连接到Store后,一个Folder对象即目录对象将通过Store的getFolder()方法被返回,我们可从这个Folder中读取邮件信息:
Folder folder = store.getFolder( INBOX );
folder.open(Folder.READ_ONLY);
上面的例子首先从Store中获得INBOX这个Folder(对于POP3协议只有一个名为INBOX的Folder有效),然后以只读(Folder.READ_ONLY)的方式打开Folder,
注意:对于POP3协议只有一个名为INBOX的Folder有效,而对于IMAP协议,我们可以访问多个Folder。
3.Message (Javax.mail.Message)
最后调用Folder的getMessages()方法得到目录中所有Message的数组。
Message message[] = folder.getMessages();
Folder的getMessages()方法时采取了很智能的方式:首先接收新邮件列表,然后再需要的时候(比如读取邮件内容)才从邮件服务器读取邮件内容。在读取邮件时,我们可以用Message类的getContent()方法接收邮件或是writeTo()方法将邮件保存,getContent()方法只接收邮件内容(不包含邮件头),而writeTo()方法将包括邮件头。
((MimeMessage)message).getContent();
4.关闭连接
在读取邮件内容后,别忘记了关闭Folder和Store。
folder.close(Boolean);
store.close();
传递给Folder.close()方法的boolean 类型参数表示是否在删除操作邮件后更新Folder。
A.2、查看邮件数、新邮件和未读邮件
参考下面例子中showFolderInfo()
想知道邮箱中共有多少邮件、有多少邮件读过和有多少邮件没有读过。
Folder对象提供了三个方法。GetMessageCount方法显示邮箱中总共有多少封信,getNewMessageCount显示邮箱中新邮件的封数,getUnreadMessageCount显示邮箱中未读邮件的封数。
注意:对于POP3协议,只支持GetMessageCount查询邮件总数。不支持判断邮件的未读和新邮件标记,只有自己进行判断操作了。
A.3、消息标识(删除邮件)
消息的删除涉及使用与消息相关的 Flags(标志)。不同 flag 对应不同的状态,有些由系统定义而有些则由用户定义。下面列出在内部类 Flags.Flag 中预定义的标志:
??? * Flags.Flag.ANSWERED
??? * Flags.Flag.DELETED
??? * Flags.Flag.DRAFT
??? * Flags.Flag.FLAGGED
??? * Flags.Flag.RECENT
??? * Flags.Flag.SEEN
??? * Flags.Flag.USER
?
仅仅因为存在一个标志,并不意味着所有邮件服务器或供应商都支持这个标志。例如,除了删除消息标志外,POP 协议不再支持其它任何标志。检查是否存在新邮件,这也不是个POP任务,而是内建于邮件客户机的任务。为找出哪些标志能被支持,可以用 getPermanentFlags() 向 folder 提出要求。
消息标识的应用删除邮件
参考下面例子中deleteMessage()
要删除消息,您可以设置消息的 DELETED flag:
message.setFlag(Flags.Flag.DELETED, true);
首先,请以 READ_WRITE 模式打开 folder:
folder.open(Folder.READ_WRITE);
然后,当所有消息的处理完成后,关闭 folder,并传递一个 true 值,从而擦除(expunge)有 delete 标志的消息。
folder.close(true);
一个 Folder 的 expunge() 方法可以用来删除消息。但Sun的POP3供应商不支持。其它供应商有的或许能够实现这一功能,而有的则不能。IMAP供应商极有可能实现此功能。因为 POP只支持单个对邮箱的访问,对Sun的供应商来说,您必需关闭folder以删除消息。
要取消标志,只要传递false给setFlag()方法就行了。想知道是否设置过标志,可以用 isSet() 检查。
A.4、复制或移动邮件
参考下面例子中moveMessage()
Folder类的copyMessages(Message[] msgs, Folder folder);方法可实现复制邮件的功能。参数msgs为你要复制的邮件数组。参数folder为你要复制的目的邮件箱。该操作是复制邮件,把原邮件删除,则实现移动邮件。
?
B、应用
package com.test;
?
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.InternetAddress;
?
public class TreatMessages {
??? private String smtpServer =? 192.168.1.254 ;
?
??? // 连接Session
??? private Session getSession() {
?????? Session session = null;
?????? try {
?????????? Authenticator auth = new SimpleAuthenticator( xx ,? xx );
?????????? // 身份验证,SimpleAuthenticator在UseAuthenticatorSender中定义。
?????????? Properties props = new Properties();
?????????? props.setProperty( mail.transport.protocol ,? smtp );
?????????? props.setProperty( mail.smtp.auth ,? true );
?????????? props.setProperty( mail.host , smtpServer);
?????????? session = Session.getInstance(props, auth);
?????????? // session.setDebug(true);
?????? } catch (Exception ex) {
?????????? System.out.println(ex.toString());
?????? }
?????? return session;
??? }
?
??? // 显示所有邮件
??? public void showMessages() {
?????? try {
?????????? Session session = getSession();
?????????? Store store = session.getStore( pop3 );
?????????? store.connect();
?????????? // 以pop3协议连接到Store。port:25
?????????? Folder folder = null;
?????????? folder = store.getDefaultFolder();
?????????? if (folder == null)
????????????? throw new Exception( No default folder );
?????????? // 获取默认文件夹
?????????? folder = folder.getFolder( INBOX );
?????????? if (folder == null)
????????????? throw new Exception( No POP3 INBOX );
?????????? // 如果是收件箱
?????????? folder.open(Folder.READ_WRITE);
?????????? // 使用读写方式打开收件箱
?????????? Message[] msgs = folder.getMessages();
?????????? // 得到文件夹信息,获取邮件列表
?????????? for (int msgNum = 0; msgNum < msgs.length; msgNum++) {
????????????? printMessage(msgs[msgNum]);
?????????? }
?????????? // 显示所有邮件信息。
?????????? folder.close(true);
?????????? // 参数表示是否在删除操作邮件后更新Folder
?????????? store.close();
?????????? // 关闭store。
?????? } catch (Exception ex) {
?????????? System.out.println(ex.toString());
?????? }
??? }
?
??? // 打印邮件信息
??? public static void printMessage(Message message) {
?????? try {
?????????? String from = ((InternetAddress) message.getFrom()[0])
????????????????? .getPersonal();
?????????? if (from == null)
from = ((InternetAddress) message.getFrom()[0]).getAddress();
?????????? System.out.println( FROM:?? + from);
?????????? // 获得发送邮件地址
?????????? String subject = message.getSubject();
?????????? System.out.println( SUBJECT:?? + subject);
?????????? // 获取主题
?????????? Part messagePart = message;
?????????? Object content = messagePart.getContent();
?????????? // 获取信息对象
?????????? if (content instanceof Multipart) {
????????????? messagePart = ((Multipart) content).getBodyPart(0);
????????????? System.out.println( [ Multipart Message ] );
?????????? }
?????????? // 附件
?????????? String contentType = messagePart.getContentType();
?????????? System.out.println( CONTENT:? + contentType);
?????????? // 获取content类型
?????????? if (contentType.startsWith( text/plain )
????????????????? || contentType.startsWith( text/html )) {
????????????? InputStream is = messagePart.getInputStream();
????????????? BufferedReader reader = new BufferedReader(
???????????????????? new InputStreamReader(is));
????????????? String thisLine = reader.readLine();
????????????? while (thisLine != null) {
????????????????? System.out.println(thisLine);
????????????????? thisLine = reader.readLine();
????????????? }
?????????? }
?????????? // 如果邮件内容是纯文本或者是HTML,那么打印出信息
?????????? System.out.println( ----------------------------- );
?????? } catch (Exception ex) {
?????????? ex.printStackTrace();
?????? }
??? }
?
??? // 删除收件箱的第一封邮件
??? public void deleteMessage() {
?????? try {
?????????? Session session = getSession();
?????????? Store store = session.getStore( pop3 );
?????????? store.connect();
?????????? Folder folder = null;
?????????? folder = store.getDefaultFolder();
?????????? if (folder == null)
????????????? throw new Exception( No default folder );
?????????? folder = folder.getFolder( INBOX );
?????????? if (folder == null)
????????????? throw new Exception( No POP3 INBOX );
?????????? folder.open(Folder.READ_WRITE);
?????????? Message[] msgs = folder.getMessages();
?????????? Message message = msgs[0];
?????????? // 获取第一封邮件
?????????? message.setFlag(Flags.Flag.DELETED, true);
?????????? if (message.isSet(Flags.Flag.DELETED))
????????????? System.out.println( 这封信已被删除,请返回! );
?????????? // 删除这一封邮件
?????????? folder.close(true);
?????????? // 参数表示是否在删除操作邮件后更新Folder
?????????? store.close();
?????? } catch (Exception ex) {
?????????? System.out.println(ex.toString());
?????? }
??? }
?
// 以imap协议连接,显示邮箱状况
??? public void showFolderInfo() {
?????? try {
?????????? Session session = getSession();
?????????? Store store = session.getStore( imap );
?????????? // 以imap协议连接到Store,port:143。
// pop3不支持判断邮件的已读、未读和新邮件标记,只有自己进行判断操作。
?????????? store.connect();
?????????? Folder folder = null;
?????????? folder = store.getDefaultFolder();
?????????? if (folder == null)
?????????????? throw new Exception( No default folder );
?????????? folder = folder.getFolder( INBOX );
?????????? if (folder == null)
????????????? throw new Exception( No POP3 INBOX );
?????????? folder.open(Folder.READ_ONLY);
?????????? // 以只读方式打开邮件夹
?????????? int numberOfTotal = folder.getMessageCount();
?????????? // 取得邮箱中总共有多少封信
?????????? int numberOfUnread = folder.getUnreadMessageCount();
?????????? // 取得邮箱中未读邮件
?????????? int numberOfNew = folder.getNewMessageCount();
?????????? // 取得邮箱中新邮件
?????????? System.out.println( 您的邮箱中共有? + numberOfTotal
+? 封邮件,其中有 + numberOfUnread +? 封未读邮件
+? ,有? + numberOfNew +? 封新邮件 );
?????????? folder.close(true);
?????????? store.close();
?????? } catch (Exception ex) {
?????????? System.out.println(ex.toString());
?????? }
??? }
?
// 移动邮件
??? public void moveMessage() {
?????? try {
?????????? Session session = getSession();
?????????? Store store = null;
?????????? IMAPFolder folder = null;
?????????? Folder to_folder = null;
?????????? // 获取存储
?????????? store = session.getStore( imap );
?????????? // 连接邮箱服务器