文档章节

【Android】邮件客户端开发:仅仅获得邮件头

t
 timeyoyo
发布于 2015/02/25 16:04
字数 777
阅读 58
收藏 0
点赞 0
评论 0

【1】功能实现:仅获得邮件头而不下载整个邮件

初次进入邮箱的时候,如果邮件包含的附件较多的情况下,显示加载会很慢

用户体验不好,一般设计为仅仅加载邮件头


File file = new File("uids.txt");
UIDStore uids = new UIDStore();
uids.load(file);
URLName url = new URLName("pop3",
                          parameters[0],
                          110,
                          "",
                          parameters[1],
                          parameters[2]);
Session session = Session.getDefaultInstance(System.getProperties(),null);
Store store = session.getStore(url);
store.connect();
POP3Folder inbox = (POP3Folder)store.getFolder("INBOX");
inbox.open(Folder.READ_WRITE);
//重点在这里 开始
FetchProfile profile = new FetchProfile();
profile.add(UIDFolder.FetchProfileItem.UID);
Message[] messages = inbox.getMessages();
inbox.fetch(messages,profile);
//重点在这里 结束
for(int i = 0;i < messages.length;i++)
{
   String uid = inbox.getUID(messages[i]);
   if(uids.isNew(uid))
   {
      System.out.print(i);
      System.out.print(". ");
      System.out.println(inbox.getMessage(i + 1).getSubject());
   }
}
System.out.println("Done.");
uids.store(file);

参考网站:

http://www.developer.com/java/other/article.php/3092171/JavaMail-More-Efficiently.htm

【2】工程Demo代码参考

                   Message[] messages = folder.getMessages(startPosition,
                            endPosition);
                    // // add by fnst for i信4.0 邮箱 on 2015-02-10 start
                    // 重新设计,仅仅只是获得邮件头部信息【邮件地址+邮件时间+邮件是否包含附件+邮件标题】
                    FetchProfile fp = new FetchProfile();
                    fp.add(FetchProfile.Item.ENVELOPE);
                    folder.fetch(messages, fp);
                    for (int i = 0; (i < messages.length); i++) {
                        String uid = inbox.getUID(messages[i]);
                        if (EmailDao.getEmailInfoById(uid) == null) {
                            try {
                                saveEmailMsg2DB(handler, inbox, messages, i,startPosition);
                            } catch (Exception e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                    }


【3】扯点别的

1> getContent()的使用注意

messgaes.getContent()返回一个Multipart对象一个Multipart对象包含一个或多个BodyPart对象,来组成邮件的正文部分(包括附件)。

但是... 使用getContent()会去遍历整封邮件,会将整个邮件下载下来,效率很差


2> 邮件头与邮件体

邮件头包含了发件人、收件人、主题、时间、MIME版本、邮件内容的类型等重要信息。每条信息称为一个域,由域名后加“: ”和信息内容构成,可以是一行,较长的也可以占用多行。域的首行必须“顶头”写,即左边不能有空白字符(空格和制表符);续行则必须以空白字符打头,且第一个空白字符不是信息本身固有的,解码时要过滤掉。

邮件体包含邮件的内容,它的类型由邮件头的“Content-Type”域指出。常见的简单类型有text/plain(纯文本)text/html(超文本)。有时也会出现的multipart类型,是MIME邮件的精髓。邮件体被分为多个段,每个段又包含段头和段体两部分,这两部分之间也以空行分隔。常见的multipart类型有三种:multipart/mixed, multipart/relatedmultipart/alternative

multipart/mixed:附件。

multipart/related:内嵌资源。

multipart/alternative:纯文本与超文本共存。


3> 构造函数

mpRoot = new MimeMultipart("alternative");
mpRoot = new MimeMultipart("related");
mpRoot = new MimeMultipart();【默认是mixed】


4> 很大可能性会遇到的一个报错处理代码

            message.setContent(mpRoot);
            MailcapCommandMap mc = (MailcapCommandMap) CommandMap
                    .getDefaultCommandMap();
            mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
            mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
            mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
            mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
            mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
            CommandMap.setDefaultCommandMap(mc);
            Transport.send(message);
            handler.obtainMessage(1).sendToTarget();


参考

http://blog.sina.com.cn/s/blog_6d3c1ec601010bzd.html

http://blog.csdn.net/perfect2011/article/details/19193841

http://blog.sina.com.cn/s/blog_86d3fabb01012lp4.html




© 著作权归作者所有

共有 人打赏支持
t
粉丝 2
博文 31
码字总数 8678
作品 0
南京
请问一下,开发一个邮箱系统(学校的小项目),要求有客服端和服务器,我不知道如何下手,能给一些建议么?

项目是基于 POP3 和 SMTP 的邮件服务端和移动客户端(安卓系统)的设计,设计一个邮件 服务器和一个移动端(安卓系统)的邮件客户端,服务器端除了提供最基本的收发邮件功能 之外,还应具有注...

昱晟
04/22
0
0
Intent中的四个重要属性——Action、Data、Category、Extras

Intent作为联系各Activity之间的纽带,其作用并不仅仅只限于简单的数据传递。通过其自带的属性,其实可以方便的完成很多较为复杂的操作。例如直接调用拨号功能、直接自动调用合适的程序打开不...

亭子happy
2015/02/08
0
1
Intent中的四个重要属性——Action、Data、Category、Extras

原文地址 http://www.cnblogs.com/wisekingokok/archive/2011/08/22/2149847.html   Intent作为联系各Activity之间的纽带,其作用并不仅仅只限于简单的数据传递。通过其自带的属性,其实可...

截图
2014/10/22
0
0
Android中Fragment的使用

Fragment可能是我心中一直以来的执念,由于Android开发并没有像一般流程一样系统的学习,而是直接在公司项目中改bug开始的。当时正是Fragment被提出来的时候,那时把全部精力放到了梳理代码业...

votzone
07/11
0
0
Android解析ActivityManagerService(二)ActivityTask和Activity栈管理

相关文章 Android系统启动流程系列 Android应用进程系列 Android深入四大组件系列 Android深入解析AMS系列 前言 关于AMS,原计划是只写一篇文章来介绍,但是AMS功能繁多,一篇文章的篇幅远远...

刘望舒
2017/09/03
0
0
Android开发中“即编即达”的用户模型

Android开发官方网站http://developer.android.com 给我们Android开发从入门到深入提供了完善的文档支持。 在Dev Guide标签下,文档完整定义了Android(What is Android?),包括给出其特性、...

xyxzfj
2011/12/07
0
0
刚刚学习到的Android使用Javamail通过XOauth调用Gmail API发送邮件的方法

前景知识:OAuth,Javamail-android,Javamail api in android using XOauth 我的一个App项目需要在Service中自动发送邮件的功能,因为是后台自动发送邮件,不能出现邮件UI所以需要使用Javam...

since1986
2014/04/12
0
0
Android task和back stack详解一:概述

一个应用往往包含很多activities.每个activity都应围绕着用户可执行的特定动作来设计,并且可以启动其它activitie.例如,一个email应用可能可能有一个显示新邮件列表的activity.当用户选择...

晨曦之光
2012/03/12
0
0
华为发大招,将推出名为 EROFS 的 Linux 只读文件系统

华为工程师高翔近日在 Linux kernel 的邮件列表中公布了一个名为 EROFS 的面向 Android 的 Linux 只读文件系统。 EROFS 的全称为 Extendable Read-Only File System ,目前正处于早期开发阶段...

王练
06/03
0
0
Android Notification详解——响应notification事件

上一篇讲了如何创建并显示一个notification,这一篇就总结下点击notification后,程序应该如何响应。 一般来讲,点击一个notification后,都会打开一个Activity做为对点击事件的响应,这个A...

Carl_
2015/04/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

关于DCL双重锁失效及解决方案

关于DCL双重锁失效及解决方案 Double Check Lock (DCL)实现单例 DCL 方式实现单例的优点是既能够在需要时才初始化单例,又能够保证线程安全,且单例对象初始化后调用getInstance方法不进行...

DannyCoder
6分钟前
0
0
PowerDesigner 16.5 安装配置

PowerDesigner16.5破解版是一款业内领先且开发人员常用的数据库建模工具,PowerDesigner可以从物理和概念两个层面设计数据库,方便用户制作处清晰直观的数据流程图和结构模型,欢迎有需要的朋...

Gibbons
31分钟前
0
0
前端Tips: 创建, 发布自己的 Vue UI 组件库

创建, 发布自己的 Vue UI 组件库 前言 在使用 Vue 进行日常开发时, 我们经常会用到一些开源的 UI 库, 如: Element-UI, Vuetify 等. 只需一行命令, 即可方便的将这些库引入我们当前的项目: n...

ssthouse_hust
今天
1
0
大数据教程(2.13):keepalived+nginx(多主多活)高可用集群搭建教程【自动化脚本】

上一章节博主为大家介绍了目前大型互联网项目的keepalived+nginx(主备)高可用系统架构体系,相信大家应该看了博主的文章对keepalived/nginx技术已经有一定的了解,在本节博主将为大家分享k...

em_aaron
今天
4
0
Git 2.18版本发布:支持Git协议v2,提升性能

在最新的官方 Git 客户端正式版2.18中添加了对 Git wire 协议 v2 的支持,并引入了一些性能与 UI 改进的新特性。在 Git 的核心团队成员 Brandon Williams 公开宣布这一消息前几周,Git 协议 ...

六库科技
今天
0
0
Java8新特性之接口

在JDK8以前,我们定义接口类中,方法都是抽象的,并且不能存在静态方法。所有的方法命名规则基本上都是 public [返回类型] [方法名](参数params) throws [异常类型] {}。 JDK8为接口的定义带...

developlee的潇洒人生
今天
0
0
aop + annotation 实现统一日志记录

aop + annotation 实现统一日志记录 在开发中,我们可能需要记录异常日志。由于异常比较分散,每个 service 方法都可能发生异常,如果我们都去做处理,会出现很多重复编码,也不好维护。这种...

长安一梦
今天
2
0
将博客搬至CSDN

AHUSKY
今天
2
0
Python web框架Django学习(1)

1.Django简介 (1)Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。Django是一个开放源代码的Web应用框架,由Python写成。 (2...

十年磨一剑3344
今天
0
0
Databook-数据之书

Databook-数据之书 用于数据分析的Jupyter Notebooks。 不需购买服务器,快速开始自己的数据分析过程。 源码:https://github.com/openthings/databook 作者:openthings,https://github.co...

openthings
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部