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的建议可以买本郭神的《第一行代码》(第三版)先学习一下,这本书写的非常浅显易懂。

下面放几张效果图:

 

 

 

 

 

 

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐