android使用JavaMail开发邮箱APP
JavaMail是大名鼎鼎的Oracle公司开发的电子邮件开发框架,如果使用JAVA语言开发邮箱应用基本都绕不开它。在Android端开发邮箱APP的过程中,我遇到了不少问题并一一解决,这里列举了一些做为备忘录,后续开发差不多了我会把源码全部放在github上,以便一起学习讨论。1、邮箱服务器连接失败2、获取邮件内容乱码3、附件名称乱码4、附件下载速度慢5、邮件正文包含图片时,对图片的处理(重点难
JavaMail是大名鼎鼎的Oracle公司开发的电子邮件开发框架,如果使用JAVA语言开发邮箱应用基本都绕不开它。在Android端开发邮箱APP的过程中,我遇到了不少问题并一一解决,这里列举了一些做为备忘录,后续开发差不多了我会把源码全部放在github上,以便一起学习讨论。
1、邮箱服务器连接失败
2、获取邮件内容乱码
3、附件名称乱码
4、附件下载速度慢
5、邮件正文包含图片时,对图片的处理(重点难点)
6、对正文图片和附件的拆分(难点)(可根据Content-ID参数判断)
7、对邮件正文html的解析和封装,包括收件箱和发件箱(借助正则表达式和richeditor开源框架)
8、附件的添加
9、与IOS客户端的联调(主要是对Part的封装)
10、不同邮箱服务器所发邮件格式的适配
关于第5点说一下,因为邮箱内容一般都用html格式,在Android自然就用WebView去加载,面对一张下载下来的图片时,WebView要如何去加载呢?注意,WebView无法直接访问Android本地的图片,也不要试图转换成base64,那会很容易就发生OOM,正确的方式是重写shouldInterceptRequest方法,这里简单贴下代码:
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
FileInputStream input;
String url = request.getUrl().toString();
try {
url = URLDecoder.decode(url, "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
/*如果请求包含约定的字段 说明是要拿本地的图片*/
if (url.contains(IMG_HEADER)) {
String imgPath = url.replace(IMG_HEADER, "");
try {
/*重新构造WebResourceResponse 将数据以流的方式传入*/
input = new FileInputStream(new File(imgPath.trim()));
/*返回WebResourceResponse*/
return new WebResourceResponse("image/jpg", "UTF-8", input);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
return super.shouldInterceptRequest(view, request);
}
关于最后一点,真想吐槽下新浪邮箱,对邮件正文图片的命名极其随意,默认为“附件1.jpg”,导致如果正文插入了一张图片,同时附件又添加了一张叫做“附件1.jpg”的图片,在个别邮箱当中会显示错误,如QQ邮箱,这一点我在自己的APP里面也进行改正了。
2021-3-4 基本开发完毕,github地址是:https://github.com/qugengting/AndroidEmail,如果需要使用,请自行在MailContants.java类当中修改邮箱登录地址和密码。另外请注意,本项目大部分代码是用kotlin写的,不会kotlin的建议可以买本郭神的《第一行代码》(第三版)先学习一下,这本书写的非常浅显易懂。
下面放几张效果图:
更多推荐
所有评论(0)