文档章节

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

t
 timeyoyo
发布于 2015/02/25 16:04
字数 777
阅读 62
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

TypeScript基础入门之高级类型的字符串字面量类型

转发TypeScript基础入门之高级类型的字符串字面量类型 高级类型 字符串字面量类型 字符串字面量类型允许你指定字符串必须的固定值。 在实际应用中,字符串字面量类型可以与联合类型,类型保护...

durban
15分钟前
2
0
iOS权限授权添加

<!-- 相册 --> <key>NSPhotoLibraryUsageDescription</key> <string>App需要您的同意,才能访问相册</string> <!-- 相册写入 --> <key>NSPhotoLibraryAddUsageDescription</key> <string>App......

RainOrz
20分钟前
1
0
支配树(Dominator Tree)

MAT中的支配树 在使用MAT分析项目的内存泄漏问题时,其中有一个支配树(Dominator)视图。如果我们把Java对象之间的引用关系看做一张有向图(可以存在环)的话,对象的支配树体现了对象之间的...

akane_oimo
21分钟前
1
0
xshell官网下载及安装(免费版本)

百度搜索xshell,点击xshell官网下载链接,如图 然后点击下图的按钮 点击Latest Products,可以下载最新版本,选择要下载的版本,点击下载 选择上面红框里面的,并填写内容,submit之后会有邮...

曾大大胖
26分钟前
2
0
Android 调用系统分享文字、图片、文件,可直达微信、朋友圈、QQ、QQ空间、微博

兼容SDK 18以上的系统,直接调用系统分享功能,分享文本、图片、文件到第三方APP,如:微信、QQ、微博等 因为偷懒,可直达微信、朋友圈、QQ、QQ空间、微博的分享仅写了图片分享的,其他的文本...

她叫我小渝
28分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部