Javamail入门

Javamail还没加到java标准库里,所以需要额外导入mail.jar

发邮件
1、发送纯文本邮件:
需导入mail.jar包

import java.util.Properties;

import javax.mail.Address;

import javax.mail.Message;

import javax.mail.MessagingException;

import javax.mail.Session;

import javax.mail.Transport;

import javax.mail.internet.AddressException;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeMessage;

public class JavaEmail {

   public static void main(String[] args) throws AddressException, MessagingException {

      Properties properties = new Properties();

      properties.setProperty("mail.transport.protocol""smtp");//发送邮件协议

      properties.setProperty("mail.smtp.auth""true");//需要验证

      //下面3行代码是qq邮箱专用的

      properties.setProperty("mail.smtp.socketFactory.class""javax.net.ssl.SSLSocketFactory");

      properties.setProperty("mail.smtp.port""465");

      properties.setProperty("mail.smtp.socketFactory.port""465");

      Session session = Session.getInstance(properties);

      //邮件信息

      Message messgae = new MimeMessage(session);

      messgae.setFrom(new InternetAddress("774695423@qq.com"));//设置发送人

      messgae.setText("what's up man");//设置邮件内容

      messgae.setSubject("哥们该吃饭了");//设置邮件主题

      //发送邮件

      Transport tran = session.getTransport();

      //tran.connect("smtp.sina.com", 25, "xxxx@sina.cn", "xxxxxxx");//连接到新浪邮箱服务器

      tran.connect("smtp.qq.com", 25, "774695423@qq.com""wuhuarong92926%");//连接到QQ邮箱服务器

      tran.sendMessage(messgae, new Address[]{ new InternetAddress("349342993@qq.com")});//设置邮件接收人

      tran.close();

   }

}


2、发送文本(包括html文本,如图片、表格、文本式样等)、附件、抄送
需要导入mail.jar与activation.jar

import java.util.Properties;

import javax.activation.DataHandler;

import javax.activation.FileDataSource;

import javax.mail.Address;

import javax.mail.BodyPart;

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 Mail {

   private MimeMessage mimeMsg//MIME邮件对象

   private Session session//邮件会话对象

   private Properties props//系统属性

   private boolean needAuth = false//smtp是否需要认证

   //smtp认证用户名和密码

   private String username;

   private String password;

   private Multipart mp//Multipart对象,邮件内容,标题(不是主题),附件等内容均添加到其中后再生成MimeMessage对象

   /**

    * (1)设置邮件发送服务器

    * @param hostName String

    */

   public void setSmtpHost(String hostName) {

      System.out.println("设置系统属性:mail.smtp.host = "+hostName);

      if(props == null)

         props = System.getProperties(); //获得系统属性对象

      props.put("mail.smtp.host",hostName); //设置SMTP主机

      //qq邮箱还要设置以下属性

      if("smtp.qq.com".equals(hostName)){

         props.setProperty("mail.smtp.socketFactory.class""javax.net.ssl.SSLSocketFactory");

         props.setProperty("mail.smtp.port""465");

         props.setProperty("mail.smtp.socketFactory.port""465");

      }

   }

   /**

    * (2)创建MIME邮件对象 

    * @return

    */

   public boolean createMimeMessage()

   {

      try {

         System.out.println("准备获取邮件会话对象!");

         session = Session.getDefaultInstance(props,null); //获得邮件会话对象

      }

      catch(Exception e){

         System.err.println("获取邮件会话对象时发生错误!"+e);

         return false;

      }

      System.out.println("准备创建MIME邮件对象!");

      try {

         mimeMsg = new MimeMessage(session); //创建MIME邮件对象

         mp = new MimeMultipart();

         return true;

      } catch(Exception e){

         System.err.println("创建MIME邮件对象失败!"+e);

         return false;

      }

   }

   /**

    * (3)设置SMTP是否需要验证

    * @param need

    */

   public void setNeedAuth(boolean need) {

      System.out.println("设置smtp身份认证:mail.smtp.auth = "+need);

      if(props == nullprops = System.getProperties();

      if(need){

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

      }else{

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

      }

   }

   /**

    * (4)设置用户名和密码

    * @param name

    * @param pass

    */

   public void setNamePass(String name,String pass) {

      username = name;

      password = pass;

   }

   /**

    * (5)设置邮件主题

    * @param mailSubject

    * @return

    */

   public boolean setSubject(String mailSubject) {

      System.out.println("设置邮件主题!");

      try{

         mimeMsg.setSubject(mailSubject);

         return true;

      }

      catch(Exception e) {

         System.err.println("设置邮件主题发生错误!");

         return false;

      }

   }

   /**

    * (6)设置邮件正文

    * @param mailBody String

    */

   public boolean setBody(String mailBody) {

      try{

         BodyPart bp = new MimeBodyPart();

         bp.setContent(""+mailBody,"text/html;charset=GBK");

         mp.addBodyPart(bp);

     

         return true;

      } catch(Exception e){

      System.err.println("设置邮件正文时发生错误!"+e);

      return false;

      }

   }

   /**

    * (7)添加附件

    * @param filename String

    */

   public boolean addFileAffix(String filename) {

      System.out.println("增加邮件附件:"+filename);

      try{

         BodyPart bp = new MimeBodyPart();

         FileDataSource fileds = new FileDataSource(filename);

         DataHandler dh = new DataHandler(fileds);

         bp.setDataHandler(dh);

         bp.setFileName(fileds.getName());

         mp.addBodyPart(bp);

         return true;

      } catch(Exception e){

         System.err.println("增加邮件附件:"+filename+"发生错误!"+e);

         return false;

      }

   }

   /**

    * (8)设置发信人

    * @param from String

    */

   public boolean setFrom(String from) {

      System.out.println("设置发信人!");

      try{

         mimeMsg.setFrom(new InternetAddress(from)); //设置发信人

         return true;

      } catch(Exception e) {

         return false;

      }

   }

   /**

    * (9)设置收信人

    * @param to String

    */

   public boolean setTo(String to){

      if(to == null)return false;

      try{

         mimeMsg.setRecipients(Message.RecipientType.TO,InternetAddress.parse(to));

         return true;

      } catch(Exception e) {

         return false;

      }

   }

   /**

    * (10)设置抄送人

    * @param copyto String 

    */

   public boolean setCopyTo(String copyto)

   {

      if(copyto == null)return false;

      try{

   mimeMsg.setRecipients(Message.RecipientType.CC,(Address[])InternetAddress.parse(copyto));

      return true;

      }

      catch(Exception e)

      { return false; }

   }

   /**

    * (11)发送邮件

    */

   public boolean sendOut()

   {

      try{

         mimeMsg.setContent(mp);

         mimeMsg.saveChanges();

         System.out.println("正在发送邮件....");

         Session mailSession = Session.getInstance(props,null);

         Transport transport = mailSession.getTransport("smtp");

         transport.connect((String)props.get("mail.smtp.host"),username,password);

         if(mimeMsg.getRecipients(Message.RecipientType.CC)!=null)

            transport.sendMessage(mimeMsg,mimeMsg.getRecipients(Message.RecipientType.CC));

         if(mimeMsg.getRecipients(Message.RecipientType.TO)!=null)

            transport.sendMessage(mimeMsg,mimeMsg.getRecipients(Message.RecipientType.TO));

         System.out.println("发送邮件成功!");

         transport.close();

         return true;

      } catch(Exception e) {

         System.err.println("邮件发送失败!"+e);

         return false;

      }

   }

   /**

    * 调用sendOut方法完成邮件发送

    * @param smtp

    * @param from

    * @param to

    * @param subject

    * @param content

    * @param username

    * @param password

    * @return boolean

    */

   public boolean send(String smtp,String from,String to,String subject,String content,String username,String password) {

      setSmtpHost(smtp);

      if(!createMimeMessage()) return false;

      setNeedAuth(true); //需要验证

      if(!setSubject(subject)) return false;

      if(!setBody(content)) return false;

      if(!setTo(to)) return false;

      if(!setFrom(from)) return false;

      setNamePass(username,password);

      if(!sendOut()) return false;

      return true;

   }

   /**

    * 调用sendOut方法完成邮件发送,带抄送

    * @param smtp

    * @param from

    * @param to

    * @param copyto

    * @param subject

    * @param content

    * @param username

    * @param password

    * @return boolean

    */

   public boolean sendAndCc(String smtp,String from,String to,String copyto,String subject,String content,String username,String password) {

      setSmtpHost(smtp);

      if(!createMimeMessage()) return false;

      setNeedAuth(true); //需要验证

      if(!setSubject(subject)) return false;

      if(!setBody(content)) return false;

      if(!setTo(to)) return false;

      if(!setCopyTo(copyto)) return false;

      if(!setFrom(from)) return false;

      setNamePass(username,password);

      if(!sendOut()) return false;

      return true;

   }

   /**

    * 调用sendOut方法完成邮件发送,带附件

    * @param smtp

    * @param from

    * @param to

    * @param subject

    * @param content

    * @param username

    * @param password

    * @param filename 附件路径

    * @return

    */

   public boolean send(String smtp,String from,String to,String subject,String content,String username,String password,String filename) {

      setSmtpHost(smtp);

      if(!createMimeMessage()) return false;

      setNeedAuth(true); //需要验证

      if(!setSubject(subject)) return false;

      if(!setBody(content)) return false;

      if(!addFileAffix(filename)) return false;

      if(!setTo(to)) return false;

      if(!setFrom(from)) return false;

      setNamePass(username,password);

      if(!sendOut()) return false;

      return true;

   }

   /**

    * 调用sendOut方法完成邮件发送,带附件和抄送

    * @param smtp

    * @param from

    * @param to

    * @param copyto

    * @param subject

    * @param content

    * @param username

    * @param password

    * @param filename

    * @return

    */

   public boolean sendAndCc(String smtp,String from,String to,String copyto,String subject,String content,String username,String password,String filename) {

      setSmtpHost(smtp);

      if(!createMimeMessage()) return false;

      setNeedAuth(true); //需要验证

      if(!setSubject(subject)) return false;

      if(!setBody(content)) return false;

      if(!addFileAffix(filename)) return false;

      if(!setTo(to)) return false;

      if(!setCopyTo(copyto)) return false;

      if(!setFrom(from)) return false;

      setNamePass(username,password);

      if(!sendOut()) return false;

      return true;

   }

  

   public static void main(String[] args){

      String smtp = "smtp.qq.com";

      String from = "349342993@qq.com";

      String to = "774695423@qq.com";

      String copyto = "349342993@qq.com";

      String subject = "邮件主题";

      //邮件内容是纯文本

      String content = "邮件内容";

      String username="349342993@qq.com";

      String password="wuhuarong92926%";

      String filename = "C:\\Users\\Administrator\\Desktop\\a.txt";

      Mail mail = new Mail();

      mail.send(smtp, from, to, subject, content, username, password);

      mail.send(smtp, from, to, subject, content, username, password, filename);

      mail.sendAndCc(smtp, from, to, copyto, subject, content, username, password);

      mail.sendAndCc(smtp, from, to, copyto, subject, content, username, password, filename);

      //邮件内容是html

      String content = "<font style='BACKGROUND-COLOR: #666699' color='#ff0000' size='5'>测试格式化内容测试<a href='http://www.baidu.com'>格式化内容</a>测试格<em>式化</em>内容</font><img src='http://a.hiphotos.baidu.com/image/pic/item/96dda144ad345982d2e4dc9a0ef431adcbef844f.jpg'></img>";

      mail.send(smtp, from, to, subject, content, username, password);

      mail.send(smtp, from, to, subject, content, username, password, filename);

      mail.sendAndCc(smtp, from, to, copyto, subject, content, username, password);

      mail.sendAndCc(smtp, from, to, copyto, subject, content, username, password, filename);

   }

}

我们可以在邮件编辑窗口增加一些插件,如制作表格、设置背景、设置字体、插入图片等等,操作这些插件会使编辑框的内容自动生成一些html代码,我们把表单传给后台时,后台读取到的内容除了纯文本外还有一些html代码,如果包含图片,在提交表单时,除了向后台发送表单数据,还要把图片上传到服务器,这时后台读取表单数据(包含图片的url(服务器上的图片地址)),然后把表单数据作为邮件内容发送出去(当然包括图片的url)。


收邮件

接收邮件可以应用协议POP3或IMAP,后者功能更强

接收邮件过程 

参考下面例子中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 值,从而擦除有 delete 标志的消息:folder.close(true); 

一个 Folder 的 expunge() 方法可以用来删除消息。但Sun的POP3供应商不支持。其它供应商有的或许能够实现这一功能,而有的则不能。IMAP供应商极有可能实现此功能。因为 POP只支持单个对邮箱的访问,对Sun的供应商来说,您必需关闭folder以删除消息。 要取消标志,只要传递false给setFlag()方法就行了。想知道是否设置过标志,可以用 isSet() 检查。  

5、复制或移动邮件 

参考下面例子中moveMessage() 

Folder类的copyMessages(Message[] msgs, Folder otherFolder);方法可实现复制邮件的功能。参数msgs是你要复制的邮件数组。参数otherFolder为你要复制的目的邮件箱,该操作是复制邮件,然后把原邮件删除,则实现移动邮件。

6、获得、下载附件

见方法:getAttachment()

注意,如果附件是文本文件,如txt文件,该方法会把附件当做String类型处理,如何处理,有待解决


import java.io.BufferedReader;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.util.Date;

import java.util.Properties;

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;

import com.sun.mail.imap.IMAPFolder;

import com.sun.mail.imap.IMAPStore;

public class TreatMessages{

   private String pop3Server = "pop.163.com";

   private String imapServer = "imap.163.com";

   private String user = "18820702269@163.com";

   private String password = "wuhuarong92926%";

   // Pop3方式

   private Session getSessionForPop3(){

      Session session = null;

      try{

         Properties props = new Properties();

         props.setProperty("mail.store.protocol""pop3");

         props.setProperty("mail.transport.protocol""pop3");

//       props.setProperty("mail.smtp.auth", "true");

         props.setProperty("mail.pop3.host",pop3Server);

         session = Session.getInstance(props);

      }catch (Exception ex){

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

      }

      return session;

   }

   //Imap方式

   private Session getSessionForImap(){

      Session session = null;

      try{

         Properties props = new Properties();

         props.setProperty("mail.transport.protocol""smtp");

         props.setProperty("mail.store.protocol""imap");

         props.setProperty("mail.imap.host"imapServer);

         session = Session.getInstance(props);

      }catch (Exception ex){

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

      }

      return session;

   }

   //(1) 利用pop3显示所有邮件

   public void showMessagesByPop3() {

      try{

         Session session = getSessionForPop3();

         Store store = session.getStore("pop3");

         store.connect(pop3Server,user,password);

         // pop3协议连接到Storeport: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());

      }

   }

   //(1)利用Imap显示所有邮件

   public void showMessagesByImap() {

      try{

         Session session = getSessionForImap();

         IMAPStore store = (IMAPStore)session.getStore("imap");

         store.connect(imapServer,user,password);

         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 IMAP 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);

         // 获得发送邮件地址

         Date date = message.getSentDate();

         System.out.println(date);

         //获取发送时间

         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();

      }

   }

   // (2)利用pop3删除收件箱的第一封邮件,当然也可以用Imap

   public void deleteMessage(){

      try{

         Session session = getSessionForPop3();

         Store store = session.getStore("pop3");

         store.connect(pop3Server,user,password);

         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());

      }

   }

   // (3)imap协议连接,显示邮箱状况

   public void showFolderInfo(){

      try {

         Session session = getSessionForImap();

         IMAPStore store = (IMAPStore)session.getStore("imap");

         // imap协议连接到Storeport:143

         // pop3不支持判断邮件的已读、未读和新邮件标记,只有自己进行判断操作。

         store.connect(imapServer,user,password);

         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 IMAP INBOX");

         folder.open(Folder.READ_ONLY);

         // 以只读方式打开邮件夹

         int numberOfTotal = folder.getMessageCount();

         // 取得邮箱中总共有多少封信

         int numberOfUnread = folder.getUnreadMessageCount();

         // 取得邮箱中未读邮件

         int numberOfNew = folder.getNewMessageCount();

         // 取得邮箱中新邮件

         System.out.println("您的邮箱中共有" + numberOfTotal+"封邮件,其中有"+numberOfUnread+"封未读邮件"

         +","+numberOfNew+"封新邮件");

         Message[] messages = folder.getMessages();

         int messageNumber = 0;

         for(Message message:messages){

            System.out.println("发送时间:" + message.getSentDate());   

                  System.out.println("主题:" + message.getSubject());   

//                System.out.println("内容:" + message.getContent());   

                  Flags flags = message.getFlags();   

                  if (flags.contains(Flags.Flag.SEEN))   

                      System.out.println("这是一封已读邮件");   

                  else {   

                      System.out.println("未读邮件");   

                  }   

                  System.out   

                       .println("========================================================");

                  //每封邮件都有一个MessageNumber,可以通过邮件的MessageNumber在收件箱里面取得该邮件

                  messageNumber = message.getMessageNumber();

                  message = folder.getMessage(messageNumber);

                  printMessage(message);

         }

         folder.close(true);

         store.close();

      }catch(Exception ex){

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

      }

   }

   // (4)移动邮件

   public void moveMessage(){

      try{

         Session session = getSessionForImap();

         IMAPFolder folder = null;

         Folder to_folder = null;

         // 获取存储

         IMAPStore store = (IMAPStore)session.getStore("imap");   

         // 连接邮箱服务器   

         store.connect(imapServer ,user,password);

         // 获取收件箱文件夹

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

         // 以可读可写方式打开邮箱文件夹

         folder.open(Folder.READ_WRITE);   

         to_folder = store.getFolder("newFolder");   

         // 为了简单起见,移动第1封邮件

         Message[] messages = folder.getMessages();  

         Message[] needCopyMsgs = new Message[1]; 

         needCopyMsgs[0] = messages[0];

         // 将获取的邮件对象复制到其他文件夹中

         folder.copyMessages(needCopyMsgs, to_folder); 

         // 移动意味着要把收件箱中原有的邮件删除

         messages[0].setFlag(Flags.Flag.DELETEDtrue); 

         // 如果文件夹不为空且已经打开就将其关闭

         if(folder != null && folder.isOpen()) {  

            folder.close(true);

            }

         // 如果其他文件夹不为空着将其关闭

         if (to_folder != null && to_folder.isOpen()) { 

            to_folder.close(true);

            }

         // 如果存储为空且已经打开就将其关闭

         if (store != null && store.isConnected()) { 

            store.close();

            }

         } catch (Exception ex) {  

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

            }

      }

   //获得附件

   public void getAttachment(){

      try{

         Session session = getSessionForImap();

         IMAPStore store = (IMAPStore)session.getStore("imap");

         store.connect(imapServer ,user,password);

         // 获取收件箱文件夹

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

         folder.open(Folder.READ_WRITE);

         Message[] messages = folder.getMessages();

         //为了简单起见,我默认第1封信为有附件的邮件

         Message message = messages[10];

         Multipart mp = (Multipart)message.getContent();

         //获得BodyPart的数量

         int partCount = mp.getCount();

         for(int i = 0;i<partCount;i++){

            Part part = mp.getBodyPart(i);

            storeFile(part);

         }

         folder.close(true);

         store.close();

         } catch (Exception ex) {

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

         }

   }

   //保存附件

   public void storeFile(Part part) throws Exception{

      if(part.isMimeType("text/plain")){

         System.out.println("This is plain text");

      }else if(part.isMimeType("multipart/*")){

         System.out.println("This is multipart");

         Multipart mm = (Multipart)part.getContent();

         for(int i=0;i<mm.getCount();i++){

            storeFile(mm.getBodyPart(i));

         }

      }else if(part.isMimeType("message/rfc822")){

         System.out.println("This is message");

         storeFile((Part)part.getContent());

      }else{

         Object object = part.getContent();

         String attachmentFileName = "no_name";

         if((part.getFileName()!=null)&&!part.getFileName().equals("")){

            attachmentFileName = part.getFileName();

         }

         if(object instanceof String){

            System.out.println("This is a string");

         }else if(object instanceof InputStream){

            System.out.println("This is InputStream:");

            InputStream inputStream = (InputStream)object;

            FileOutputStream fos = new FileOutputStream("C:\\"+attachmentFileName);

            int c;

            int count = 0;

            while((c = inputStream.read())!=-1){

                fos.write(c);

                count++;

            }

            System.out.println("had save C:\\"+attachmentFileName);

         }else{

            System.out.println("This is an unkown type");

         }

      }

   }

  

   public static void main(String[] args) throws Exception { 

        TreatMessages treat = new TreatMessages(); 

        treat.getAttachment();

    }

}

 

 











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值