android使用JavaMail开发邮箱APP

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

下面放几张效果图:

 

 

 

 

 

 

 

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
AndroidJavaMail库提供了一个简单而强大的方式来实现邮箱登录。下面是一个示例,展示如何使用JavaMail库在Android应用程序中实现邮箱登录: 首先,你需要在你的Android项目中导入JavaMail库。你可以通过在build.gradle文件中添加以下代码来完成这一步骤: implementation 'javax.mail:javax.mail-api:1.6.2' implementation 'com.sun.mail:android-mail:1.6.2' implementation 'com.sun.mail:android-activation:1.6.2' 然后,你需要创建一个AsynTask类来处理与邮箱登录相关的网络请求。在这个AsynTask类的doInBackground方法中,你可以使用JavaMail库的API来连接到你的邮箱,并通过邮箱提供的验证机制进行登录。以下是一个基本的示例代码: private class EmailLoginTask extends AsyncTask<Void, Void, Boolean> { private String email; private String password; public EmailLoginTask(String email, String password) { this.email = email; this.password = password; } @Override protected Boolean doInBackground(Void... params) { try { Properties properties = new Properties(); properties.put("mail.store.protocol", "imaps"); // 使用IMAP协议连接到邮箱服务器 properties.put("mail.imaps.host", "imap.mail.com"); // 邮箱服务器地址 properties.put("mail.imaps.port", "993"); // 邮箱服务器端口号 Session session = Session.getDefaultInstance(properties); Store store = session.getStore("imaps"); store.connect(email, password); // 使用邮箱和密码进行登录 return true; // 登录成功 } catch (Exception e) { e.printStackTrace(); return false; // 登录失败 } } @Override protected void onPostExecute(final Boolean success) { if (success) { // 登录成功,执行相关逻辑操作 } else { // 登录失败,显示错误信息 } } } 最后,在你的Android活动或碎片中,你可以实例化这个AsynTask类,并调用execute方法来执行邮箱登录任务。例如: String email = "yourEmail@mail.com"; String password = "yourPassword"; EmailLoginTask loginTask = new EmailLoginTask(email, password); loginTask.execute(); 需要注意的是,这只是一个简单的示例。在实际开发中,你可能需要进一步处理验证失败、网络连接错误等异常情况,并根据实际需求在登录成功后执行相应的操作。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值