关于android邮件的收发(第二弹)

Android平台邮件收发软件开发实战 本章介绍Android平台下邮件系统的整体架构,包括邮件收发的基本流程、涉及的核心组件以及与邮件服务器之间的通信机制。通过对系统架构的全面解析,为后续深入开发和调试打下坚实基础。Android邮件系统的核心流程可分为邮件发送和接收两个部分,其底层依赖于标准邮件协议(如SMTP、IMAP、POP3)与邮件服务器进行交互。系统中通常涉及以下几个关键组件:邮件客户端(Mail Client):负责用户界面交互与邮件内容处理。协议处理器(Protocol Handler) 阅读详情

前面说完发邮件,现在开始收邮件了。

对不同的协议来进行不同的处理,POP3协议邮箱在服务器上只定义一个邮箱,所以需要自己完成删除,移动,标记等功能,

而Imap则相反,大大降低了客户端代码量。

1.Imap

接收时只需要知道服务器,账户,密码就可以了,当然也可以设置端口号。

public static Message[] getAllIMAPMail(String mailBoxType, String mailType) {
		Message[] messages = null;
<span style="white-space:pre">		</span>// 设置邮件支持多种格式
<span style="white-space:pre">		</span>sendAndCollect();
		// 用户名,密码登陆
		PopupAuthenticator popupAuthenticator = new PopupAuthenticator();

		Session session = Session.getDefaultInstance(System.getProperties(),
				popupAuthenticator);
		Store store = null;
		Folder folder = null;
		try {
			// 修改协议
			// pop3/imap
			store = session.getStore(mailBoxType);

			// 服务器, 用户名, 密码
			store.connect("", "", "");

			// pop3只有INBOX
			// 而imap则有如下
			// INBOX --- 收件箱
			// 已发送 --- 已发送邮件
			// 已删除 --- 已删除邮件
			// 草稿箱 --- 草稿箱
			folder = store.getFolder(mailType);

			folder.open(Folder.READ_WRITE);

			// 得到总邮件数
			int mailCount = folder.getMessageCount();

			if (mailCount > 0) {
				messages = folder.getMessages();
			}

		} catch (NoSuchProviderException e) {
			e.printStackTrace();
		} catch (MessagingException e) {
			e.printStackTrace();
		} finally {

		}

		// 将数据倒序显示
		List<Message> list = new ArrayList<>();
		for (int i = 0; i < messages.length; i++) {
			list.add(messages[i]);
		}
		Collections.reverse(list);
		list.toArray(messages);

		return messages;
	}

如上所示,在后面需要将得到的邮箱内容倒序,因为我们得到的邮箱是时间排序,第一个是最早收到的邮件。在这里说一下,在将

邮件内容插入到界面后,一定要将打开的邮箱关闭。并且要支持多种格式的邮件,否则会得到一个流而不是邮件容器。

在得到邮件后可以得到基本的邮件内容:发送人,收件人,抄送人,密送人,主题,时间。




之后就都是需要一步步解析的了(拆包)。

判断邮件类型,得到邮件容器,找到对应类型并处理相对应的数据。在这里我做的并完整,但是该代码可以基本解析大部分

HTML邮件+内嵌图片,在匹配到内嵌图片时也只能用最笨的方法把HTML中img标签的cid转换为下载好图片文件的绝对地址,来

勉强实现内嵌图片的内容(如果有更好的方法,据说是Swing JEditorPane,不吝赐教)。在通过查找标签,删除标签,插入标签后,

就可以显示内嵌图片到WebView上。

// 得到HTML数据
	// 显示在具体内容中
	public static String getHTMLContent(Part message, StringBuffer bodytext)
			throws MessagingException, IOException {

		if (message.isMimeType("message/rfc822")) {

		} else if (message.isMimeType("multipart/*")) {
			Multipart multipart = (Multipart) message.getContent();

			for (int i = 0; i < multipart.getCount(); i++) {
				BodyPart m = multipart.getBodyPart(i);
				if (m.isMimeType("multipart/*")) {
					getHTMLContent(m, bodytext);
				}
				if (m.isMimeType("text/html")) {
					bodytext.append((String) m.getContent());
				}

				if (m.isMimeType("image/*")) {

					// 得到HTML文件中所有图片的Content-ID,里面包含图片的cid名称
					String[] strs = m.getHeader("Content-ID");

					for (int j = 0; j < strs.length; j++) {
						// cid名称规范化
						if (strs[0].startsWith("<") && strs[0].endsWith(">")) {
							strs[0] = "cid:"
									+ strs[0]
											.substring(1, strs[0].length() - 1);
						} else {
							strs[0] = "\"cid:" + strs[0] + "\"";
						}

						// 文件名
						File file = new File(
								Environment.getExternalStorageDirectory() + "/"
										+ m.getFileName());

						// 文件判断是否存在
						if (!file.exists()) {

							try {
								BufferedInputStream bis = new BufferedInputStream(
										m.getInputStream());
								BufferedOutputStream bos;
								bos = new BufferedOutputStream(
										new FileOutputStream(file));
								int len = -1;
								while ((len = bis.read()) != -1) {
									bos.write(len);
									bos.flush();
								}
								bos.close();
								bis.close();
							} catch (IOException e) {
								e.printStackTrace();
								Log.d("--->", "下载失败");
							}
						}

						// 找到图片绝对路径
						String url = file.getAbsolutePath();

						int index = bodytext.indexOf(strs[0]);

						// 交换图片内嵌地址
						// TODO 图片缩放
						if (index != -1) {
							bodytext.delete(index, bodytext.indexOf(">", index));
							bodytext.insert(index, "file://" + url
									+ "\" width=\"100%\"");
						}
					}
				}

			}
		}
		
		return bodytext.toString();
	}


当然还可以得到邮件的纯文本内容,和上面很想:

// 得到邮件文本内容
	// 只显示在列表上
	public static StringBuffer getMailContent(Part message,
			StringBuffer bodytext) throws Exception {

		boolean isContainTextAttach = message.getContentType().indexOf("name") > 0;
		if (message.isMimeType("text/*") && !isContainTextAttach) {
			bodytext.append(message.getContent() + "");
		} else if (message.isMimeType("message/rfc822")) {
			getMailContent((Part) message.getContent(), bodytext);
		} else if (message.isMimeType("multipart/*")) {
			Multipart multipart = (Multipart) message.getContent();

			if (multipart.getCount() > 0) {
				BodyPart bodyPart = multipart.getBodyPart(0);
				if (bodyPart.isMimeType("multipart/alternative")) {
					getMailContent(bodyPart, bodytext);
				} else if (bodyPart.isMimeType("text/plain")) {

					bodytext.append(bodyPart.getContent());
				}
			}

		}

		return bodytext;
	}



最后就是附件了,问题不会很大,也可以在网上找些代码来设置点击打开相对应的附件,在这里会放回文件名及文件的Map集合。

	// 下载附件
	public static Map<String, File> getEnFilesDownload(Message message)
			throws MessagingException, IOException {
		Map<String, File> files = new HashMap<>();

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

		for (int i = 0, n = multipart.getCount(); i < n; i++) {

			Part part = multipart.getBodyPart(i);

			String disposition = part.getDisposition();

			if ((disposition != null)
					&& ((disposition.equals(Part.ATTACHMENT) || (disposition
							.equals(Part.INLINE))))) {

				String fileName = part.getFileName();
				if (fileName.startsWith("=?")) {
					// 需要解析中文名称的文件名(将中文名称加入邮件时用encodeText)
					fileName = MimeUtility.decodeText(fileName);
				}

				// 文件名
				File file = new File(Environment.getExternalStorageDirectory()
						+ "/" + fileName);

				// 文件判断是否存在
				if (!file.exists()) {

					try {
						BufferedInputStream bis = new BufferedInputStream(
								part.getInputStream());
						BufferedOutputStream bos;
						bos = new BufferedOutputStream(new FileOutputStream(
								file));
						int len = -1;
						while ((len = bis.read()) != -1) {
							bos.write(len);
							bos.flush();
						}
						bos.close();
						bis.close();
					} catch (IOException e) {
						e.printStackTrace();
						Log.d("--->", "下载失败");
					}

				}

				// 直接寻找
				files.put(fileName, file);

			}

		}

		return files;
	}



基于JavaWeb的邮件收发系统的设计与实现(源码+文档) 📧 基于SpringBoot的邮件管理系统 功能模块: 用户端支持注册登录、邮件收发、通讯录管理、黑名单设置、记事本等功能;管理员端提供用户管理、公告管理、留言板管理等后台功能。 技术栈: 后端:Java+SpringBoot 前端:HTML 数据库:MySQL 特色功能: ✔️ 多级邮件管理(收/发件箱+草稿箱) ✔️ 通讯录与黑名单机制 ✔️ 集成公告和留言系统 🔗 获取方式: 源码+数据库可联系作者获取,支持远程部署。更多计算机项目资源(Java/Python/PHP等)详见文末联系方式。 (注: 阅读详情

相关推荐

手把手教你玩转CPU微架构专栏--​​​​第二章:流水线——微架构的“效率引擎”​​​​2.4 超标量与超线程:如何突破“单指令流”的限制?

例如,Intel酷睿i5-13600K拥有6个性能核(P核,支持超线程,共12线程)和8个能效核(E核,无超线程,共8线程),兼顾多线程性能与能效比。通过引入“物理寄存器”替代“逻辑寄存器”(如x86的RAX、RBX),消除数据冒险中的“假依赖”(False Dependency)。引入“混合架构”(Performance Core+Efficient Core),大核(P核)专注高性能任务,小核(E核)处理后台任务;​:6发射超标量,IPC≈3.5(通过3D V-Cache优化缓存,进一步提升效率)。

xiaoheshang_123的博客 958

java发送邮件、接收邮件

当你给别人发送邮件时,你的机器的某个动态端口(大于1024)就会与邮件服务器的25端口建立一个连接,你发送的邮件就会通过这个连接传送到邮件服务器上,保存起来。SMTPS和SMTP协议一样,也是用来发送邮件的,只是更安全些,防止邮件被黑客截取泄露,还可实现邮件发送者抗抵赖功能。开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。接收邮件常用的协议有pop3,imap和exchange。

m0_56799642的博客 8261

Ubuntu20.04复现instant-ngp,自建数据集,导出mesh

本次仅仅记录一下自己复现instant-ngp的过程,如果里面的参考有冒犯到原博主请联系我删除,本人也是nerf的小白一枚,可以一起交流学习神经辐射场,希望大家在复现instant-ngp的时候少走一些坑,情况允许下可以去复现一下npg-pl和nerfStudio,最后希望大家一起进步。看到一些博主说葵司的npg_pl也不错,而且葵司是台湾人,在youtube上也有讲解的视频。渲染的效果还是可以的,相对于源码来说还是有点模糊,我一些参数也没有设置,直接就拉进来进行渲染,速度是非常快的。

weixin_59961223的博客 9453

Message详解

                                                       Message详解   每个部分都有可以表现为字节序列的内容。例如,在简单电子邮件消息的部分中,内容是消息的主体。但是在多部分消息中,内容本身可以包含其他部分。 读取部分内容 Part接口声明了两个可以确定部分的MIME内容类型的方法。 getContentType() is...

stay hungry ! stay foolish! 3381

售货机非现金支付开发指南:MDB协议下VPOS刷卡器的那些坑

本文深入探讨了MDB协议下非现金支付设备的开发实践,重点解析了NAYAX VPOS刷卡器的集成难点与解决方案。从RS232通信参数配置到Always idle功能实现,提供了一套完整的售货机支付系统开发指南,帮助开发者规避常见陷阱,提升设备兼容性与交易稳定性。

weixin_29258297的博客 137

阿里云 Docker 镜像加速收费后:这些免费替代方案值得收藏

阿里云Docker镜像加速服务收费后,国内开发者急需免费替代方案。本文推荐2025年仍可用的7个免费镜像源,包括轩辕镜像、DaoCloud、网易云等,并提供多源配置方案以提高稳定性。建议开发者在CI/CD环境中配置多个镜像源,避免构建失败。文章还提供了详细的配置步骤和使用建议,适合个人和团队开发者参考。

sg_knight的专栏 1932

关于android邮件的收发

讲到android的邮件收发,首先就要讲讲关于邮件协议的一下基础,度娘基本都有,这里是怕自己忘记,贴点备忘录。 现在常用的电子邮件协议有SMTP(25)、POP3(110)、IMAP4(143)。他们都处于TCP/IP协议簇,还包括他们的加密协议,SMTPS(465)、POPS(995)、IMAPS(993),他们的默认端口号都在后面的小括号里面了。其中的细节就不讲了,SMTP协议负责发送...

羊羊的学习旅程 2853

012、乘累加单元(MAC):NPU中最基本的计算单元

本文深入剖析了神经网络处理器(NPU)中的核心计算单元——乘累加单元(MAC)。作者通过实际调试案例揭示了MAC单元设计中的关键问题:定点数格式对齐、累加器位宽陷阱、流水线优化和多MAC同步方案。重点讨论了INT8量化中的边界条件处理、偏置项截断风险以及零值检测等实战经验,并提供了三点实用建议:建立精确的C模型、参考RISC-V P扩展指令集、仔细审查芯片规格书。文章强调硬件加速的实际瓶颈往往在于数据搬运而非计算单元本身,为NPU开发者提供了宝贵的工程实践参考。

m0_50546716的博客 299

java mail学习笔记4——Message类详解

Message类 在Java Mail 中Message类是所有电子邮件的的超类它的定义如下: public abstract class javax.mail.Message implements javax.mail.Part 1.标准的Java Mail API中有一个Message的子类:MimeMessage,它可用于电子邮件和Usenet新闻消息。除此之外,其他厂

ilemon 4万+

《UDS/OBD诊断需求编辑工具》总目录

目录 1 基于CANdela Studio编辑CDD诊断描述文件 2 基于ODX Studio编辑ODX/PDX文件 2.1 编辑ODX-D诊断描述文件 2.2 编辑ODX-F刷写软件 该专栏主要负责介绍CANdela Studio和ODX Studio编辑CDD/ODX/PDX诊断描述文件。 1 基于CANdela Studio编辑CDD诊断描述文件 2 基于ODX Studio编辑ODX/PDX文件 【ODX介绍 】-1- 标准梳理 【ODX介绍】 -2-如何手..

「汽车电子助手」的博客 1万+

YOLOv8改进 | Conv篇 | 利用YOLO-MS的MSBlock轻量化网络结构(既轻量又长点)

本文给大家带来的改进机制是利用YOLO-MS提出的一种针对于实时目标检测的MSBlock模块,我们将其用于C2f中组合出一种新的结构,来替换我们网络中的模块可以达到一种轻量化的作用,我将其用于我的数据集上实验,包括多个类别的数据集,其在轻量网络结构的同时,却能够提高一定的mAP精度,所以这是一种十分高效的模块,该网络结构非常适合那些模型精度已经无法提到,想要从轻量化模型的角度入手的读者使用。欢迎大家订阅本专栏,本专栏每周更新3-5篇最新机制,更有包含我所有改进的文件和交流群提供给大家。

Snu77的博客 6096

android pop3与imap方式接收邮件(javamail)

需要下载3个jar包:mail.jar/    activation.jar/    additionnal.jar 1.pop3 /** * 以pop3方式读取邮件,此方法不能读取邮件是否为已读,已经通过测试 * */ private void getEmail() { List> list = new ArrayList>(); try { Proper

Elena_wang的专栏 7420

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Android邮件服务,关于android邮件的收发

讲到android的邮件收发,首先就要讲讲关于邮件协议的一下基础,度娘基本都有,这里是怕自己忘记,贴点备忘录。现在常用的电子邮件协议有SMTP(25)、POP3(110)、IMAP4(143)。他们都处于TCP/IP协议簇,还包括他们的加密协议,SMTPS(465)、POPS(995)、IMAPS(993),他们的默认端口号都在后面的小括号里面了。其中的细节就不讲了,SMTP协议负责发送邮件,而P...

weixin_26782843的博客 1048

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

android 使用javamail收发邮件

1 发送邮件 今天学习了一下JavaMail,javamail发送邮件确实是一个比较麻烦的问题不用第三方邮件程序。为了以后使用方便,自己写了段代码. Javamail-Android配置步骤: 下载Android版本JavaMail包,additional.jar、mail.jar和activation.jar,下载地址JavaMail-Android 在项

svenke2011的专栏 9960

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

android平台收发邮件

转自:http://blog.sina.com.cn/s/blog_56e5b1410101lael.html 一、开发前准备 1、下载jar包,下载地址 http://code.google.com/p/javamail-android/downloads/list additionnal.jar、mail.jar 和 activation.jar 2、在eclipse中新建一个and

Elena_wang的专栏 3193

android 获取邮件内容,android 收发邮件(发送邮件、读取收件列表等)亲测通过

【实例简介】【实例截图】【核心代码】package mi.email.activity;import mi.learn.com.R;import android.app.Activity;import android.app.Dialog;import android.app.ProgressDialog;import android.content.Intent;import android.o...

weixin_32920055的博客 1054

基于Android的邮件收发

基于Android的邮件收发

weixin_34195364的博客 170

android平台收发邮件教程

http://blog.sina.com.cn/s/blog_56e5b1410101lael.html 一、开发前准备 1、下载jar包,下载地址 http://code.google.com/p/javamail-android/downloads/list additionnal.jar、mail.jar 和 activation.jar 2、在ec

zzzhhhjjj3的专栏 749

android手机邮件6,Android手机邮箱设置详细教程

许多人喜欢用手机来收发邮件,但是有很多朋友却不知道如何在自己的android手机上去设置邮箱,以至于无法通过手机来进行邮件的收发,其实设置很简单,跟着小编的步骤走,让你轻松顺利地使用上手机邮箱。首先,要在电脑上进入你的网络邮箱对其进行设置,在此以163邮箱为例(其他邮箱都大同小异):1、在电脑上登录你的163邮箱,点击邮箱界面右上角的设置,进入设置界面。2、在设置界面的高级栏中,找到POP3/IM...

weixin_32204175的博客 5287

java resolvemail_Android 基于Android的手机邮件收发(JavaMail)之三(邮件接收)

初次做这个程序的时候,是仿照着网上别人的程序做的。因为本人比较菜,是一个新手,以前的基础知识没有学好,所以尽管有了别人的代码但是还是不知道怎么在界面上显示出它的效果来,废话不多少,现在就贴出我的参考程序的来源。http://www.cnblogs.com/love2009/archive/2009/02/24/1397201.html大家可以在看以下内容前,通读一下。想要了解javamail的机...

weixin_28707739的博客 2566

Android系统手机邮件收发设置教程

智能手机、移动网络应用的大众化普及,让最初只能靠电脑办公的业务,逐步走向了手机终端。企业邮箱与手机终端的接合就是最早的商务应用之一。而 Android手机则以53%的市场占有率,成为全球主流。这里,笔者就以Android手机给大家介绍一下,企业自建邮件服务器后,应如何进行手机邮件 收发设置。 范例邮箱信息: 用户邮箱账号:hqq@comingchin...

weixin_33910460的博客 539

android 邮件收发功能,Android中使用Service实现后台发送邮件功能实例

本文实例讲述了Android中使用Service实现后台发送邮件功能。分享给大家供大家参考,具体如下:程序如下:import android.app.Activity;import android.content.Intent;import android.content.res.Resources.NotFoundException;import android.os.Bundle;import...

weixin_31974443的博客 479

Android下调用收发短信邮件等

Android下调用收发短信邮件等 1,调web浏览器 Uri myBlogUri = Uri.parse("http://xxxxx.com"); returnIt = new Intent(Intent.ACTION_VIEW, myBlogUri); 2,地图 Uri mapUri = Uri.parse("geo:38.899533,-77.036476"); returnIt = new Intent(Intent.ACTION_VIEW, mapUri); 3,调拨打电话界面 Uri telUr

liuliuhelingdao的博客 192

android如何设置qq邮箱格式,如何利用安卓“电子邮件”客户端添加QQ邮箱

如何利用安卓“电子邮件”客户端添加QQ邮箱部分安卓系统都会预装谷歌“电子邮件”客户端,手机用户可以将“电子邮件”与用户的QQ邮箱账户进行绑定,从而实现收发QQ邮箱内邮件的功能,大大简化了用户的操作,给用户的工作乃至生活提供了便利,绑定后还可以实现同步QQ邮箱操作的设置。方法/步骤步骤一:在安卓移动端打开浏览器(如UC浏览器),进入QQ邮箱官网登录自己的QQ邮箱账户,这里的登录界面就不做展示了,我之...

weixin_39956009的博客 1336
上一篇: 关于android邮件的收发
下一篇: Android状态栏微技巧,带你真正理解沉浸式模式
羊羊爱代码
博客等级 码龄11年 8粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值