65.9K
CodeProject 正在变化。 阅读更多。
Home

离线 Gmail 桌面应用教程 [第一部分]

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (2投票s)

2011年8月18日

CPOL

3分钟阅读

viewsIcon

29525

downloadIcon

1766

帮助您同步您的 Gmail 邮件,并让您即使在离线状态下也能查看您的邮件。

引言

本系列文章将帮助您创建一个支持离线的 Gmail 应用。它将允许您搜索邮件、查看邮件、在新邮件到达时发出警报等等… 本部分涵盖基础知识。

Using the Code

我们开始逐步进行教程

  1. 首先,您需要添加三个 jar 文件,它们是:
    1. mail.jar
    2. mailapi.jar
    3. smtp.jar

    您可以通过在您的 IDE 中将它们添加到构建路径来完成此操作

  2. 现在我们导入必要的类
  3. import java.util.Properties;
    import javax.activation.DataHandler;
    import javax.mail.BodyPart;
    import javax.mail.Folder;
    import javax.mail.Message;
    import javax.mail.Multipart;
    import javax.mail.Session;
    import javax.mail.Store;
  4. 为了检查邮件,我们使用 IMAP 协议,所以我们通过以下代码进行设置
  5. Properties props = System.getProperties();
    	props.setProperty("mail.store.protocol", "imaps");

    说明

    为了访问邮件,我们有两个协议,分别是 POP3 和 IMAP。在这两个协议中,IMAP 比 POP 协议提供更多的功能。这里我们设置系统属性以使用 IMAP 协议。

  6. 现在我们创建 session 和 store 对象,它们连接到相应的 Gmail IMAP 服务器
  7. Session session = Session.getDefaultInstance(props, null);
    	Store store = session.getStore("imaps");
    	store.connect("imap.gmail.com", "Your Username here","Your password here");

    说明

    这里 store 是一个抽象类,它模拟一个消息存储及其访问协议(在本例中为 IMAP),用于存储和检索消息。我们已经将 session 设置为使用上面创建的属性

  8. 现在当我们连接上之后,我们移动到包含我们所有邮件的收件箱文件夹
  9. Folder inbox = store.getFolder("Inbox");
    	inbox.open(Folder.READ_WRITE);

    说明

    所有消息都存储在 folder 对象中。在这里,我们通过名称 Inbox 检索一个文件夹。要访问该文件夹,我们需要打开它,这通过 inbox.Open(Folder.READ_WRITE) 完成。现在 inbox 包含我们收到的所有邮件,并且这些邮件都是可编辑的。

  10. 您可以使用以下命令检查消息总数
    System.out.println("Total number of messages-->"+inbox.getMessageCount());
  11. 现在要检查您最近的消息(例如,您的前 10 条消息),请执行以下操作
  12. Message[] messages1 = inbox.getMessages(inbox.getMessageCount()-9,inbox.getMessageCount());
    	for(Message message:messages1)
    	{
    		System.out.println("From:"+message.getFrom()[0]+"\nSubject:"+message.getSubject()+"\nDate Receving:"+message.getReceivedDate()+"\nMessage Number:"+message.getMessageNumber());
    		System.out.println("--------------------------------------------------------------");
    	}

    说明

    这里 inbox.getMessageCount() 给我们消息的总数。我们使用 inbox.getMessage(from message number,to message number),它检索 10 条消息并将它们放入 messages1 中。现在我们使用 foreach 数组来检索信息。

    message.getFrom()[0]-->给出发送消息的人的地址

    message.getSubject()-->提供消息的主题

    message.getReceivedDate()-->给出接收日期

    message.getMessageNumber()-->给出消息编号。如果您想检索任何特定消息,这非常重要

  13. 现在,如果我们想查看任何特定邮件的内容,那么首先我们检索该邮件,然后检查其内容类型,以便如果它是 mutipart,则需要进行一些进一步的处理
    System.out.println("Lets suppose we retrieve content of message number 1");
    	Message message=inbox.getMessage(1);
    	String content=null;
    	if(message.getContentType().toLowerCase().contains("text/plain")){
    		content=(String)message.getContent();
    		
    		}
    	   else if(message.getContentType().toLowerCase().contains("text/html")){
    		content=(String)message.getContent();
    		
    		}
    	   else
    	   {
    		  Multipart multipart = (Multipart) message.getContent();
    		  
    		  for (int x = 0; x < multipart.getCount(); x++) {
    		  BodyPart bodyPart = multipart.getBodyPart(x);
    		  content=bodyPart.getContent().toString();
    
    		  }
    	   }
    		content=content.replaceAll("<.*?>","");
    		System.out.println("Contents of mail are:\n"+content);

    说明

    现在,当我们提取消息的内容时,我们需要查看该消息的内容类型。如果消息是 multipart,那么它由许多消息组成,我们需要整理出每个消息的正文部分。对于文本和 HTML 内容,不需要任何特殊操作。在 multipart 的情况下,我们计算组件的数量,然后提取正文部分。

    content.replaceAll("<.*?>","");-->这样做是为了删除我们获得的输出的 HTML 标签。

  14. 现在,如果我们想显示所有可能的邮件,而不是显示一些选定的邮件,那么请执行以下操作(请记住,它以从旧到新的方式显示邮件)
    Message[] messages = inbox.getMessages();
    	for(Message msg:messages)
    	{
    		System.out.println("From:"+msg.getFrom()[0]+"\nSubject:"+msg.getSubject()+"\nDate Receving:"+msg.getReceivedDate()+"\nMessage Number:"+msg.getMessageNumber());
    		System.out.println("--------------------------------------------------------------");
    	}

    说明

    inbox.getMessages() 检索所有消息,这些消息通过 foreach 数组显示。

  15. 如果您想以从新到旧的方式查看消息,那么只需反转消息数组,然后显示数据
  16. 要注销,请执行以下操作
    inbox.close(true);
    store.close();

关注点

这仅仅是基础知识,在下一部分中,我们将讨论一些高级内容,例如为离线查看制作缓存、发送邮件、仅查看未读邮件、标记邮件和搜索邮件。

我制作了一个演示(涵盖的内容比这更多,但将在后面的部分中解释),在“下载演示项目(1MB)”中。

© . All rights reserved.