Android: Amazon AWS SES 无法在某些中国手机上发送电子邮件

Android: Amazon AWS SES won't send emails in certain Chinese mobiles

我的应用程序在用户注册过程中向电子邮件发送了一个激活码,但出于某种未知的原因——对我来说——在某些中国设备上无法正常工作,我无法获得异常日志。

这是我发邮件的地方:

 private void getAwsResult_getAwsUser(String strResult)
 {
     try{
         CommunityUserDTO communityUser = CommunityUserService.deserializeUser(strResult);

         if(communityUser==null){ //email don't exist in database
             registerResult.setValue(new Pair<>(null, Enum.RegisterResult.SENDINGEMAIL));
             CreateUserUseCase.setActivationCode(this.user);
             sendConfirmationEmail(this.user.getEmail(), this.user.getActivationCode());
         }else{
             registerResult.setValue(new Pair<>(null, Enum.RegisterResult.EMAILALREADYREGISTERED));
         }
     }catch(Exception ex)
     {
         ExceptionHandler.logException(ex);
     }
 }

 private void sendConfirmationEmail(String recipient, int activationCode)
 {
     String jsonEmail = SendEmailUseCase.
             generateJsonConfirmationEmail(recipient, activationCode);

     TaskRunner taskRunner = new TaskRunner();
     taskRunner.executeAsync(new SendEmailTask(jsonEmail), this::getAwsResult_sendEmail);
 } 

public class SendEmailTask implements Callable<String>
{
    private final String jsonEmail;

    public SendEmailTask(String jsonEmail)
    {
        this.jsonEmail = jsonEmail;
    }

    @Override
    public String call()
    {
        return TMEmail.send(jsonEmail);
    }
}

这是 sendEmail 方法示例的 jsonEmail 输入参数:

{
   "subject":"Your activation code.",
   "message":"Your activation code is: xxxxxx",
   "send_to":"xxx@gmail.com",
   "send_from":"contact@xxx.com",
   "smtp_server":"xxx.amazonaws.com",
   "smtp_user":"xxx",
   "smtp_pass":"xxx",
   "smtp_useauth":"true",
   "smtp_port":"25",
   "center_text":"true"
}

public static String send(String jsonEmail)
{
   String result = Enum.Result.OK;

   JSONObject oJsonEmail = TMJson.str2JSON(jsonEmail);

   try {
      String subject = oJsonEmail.getString(Enum.Email.SUBJECT);
      String message = oJsonEmail.getString(Enum.Email.MESSAGE);
      String sendFrom = oJsonEmail.getString(Enum.Email.SEND_FROM);
      String sendTo = oJsonEmail.getString(Enum.Email.SEND_TO);

      String smtpServer = oJsonEmail.getString(Enum.Email.SMTP_SERVER);
      String smtpPort = oJsonEmail.getString(Enum.Email.SMTP_PORT);
      String smtpUseAuth = oJsonEmail.getString(Enum.Email.SMTP_USEAUTH);
      boolean centerBodyText = Boolean.parseBoolean(oJsonEmail.getString(Enum.Email.CENTER_TEXT));

      final String smtpUser = oJsonEmail.getString(Enum.Email.SMTP_USER);
      final String smtpPass = oJsonEmail.getString(Enum.Email.SMTP_PASS);

      Properties props = new Properties();
      props.put("mail.smtp.host", smtpServer);
      props.put("mail.smtp.port", smtpPort);
      props.put("mail.smtp.auth", smtpUseAuth);
      props.put("mail.smtp.starttls.enable", "true");
      props.put("mail.from.alias", "My App Name");

      Session session = Session.getInstance(props,
            new javax.mail.Authenticator() {
               protected PasswordAuthentication getPasswordAuthentication() {
                  return new PasswordAuthentication(smtpUser, smtpPass);
               }
            });

      message = TMJson.decodeEmail(message);
      message = format(message, centerBodyText);

      Message oMessage = new MimeMessage(session);
      oMessage.setFrom(new InternetAddress(sendFrom, session.getProperty("mail.from.alias"), "UTF-8"));
      oMessage.setRecipients(Message.RecipientType.TO, InternetAddress.parse(sendTo));
      oMessage.setSubject(subject);
      oMessage.setContent(message, "text/html; charset=iso-8859-2");

      Transport.send(oMessage);
   }catch (MessagingException | UnsupportedEncodingException | JSONException e) {
      result = Enum.Result.KO;
      ExceptionHandler.logException(e);
   }

   return result;
}

我已经在我的 Android 手机和平板电脑以及许多其他设备上测试过它并且工作正常,电子邮件已发送并且用户收到激活码,但在中国,我们在那里仍在测试测试版测试人员未收到电子邮件。

我知道应用程序在发送电子邮件之前崩溃了,但不知道为什么,如果你注意到,我用这个 ExceptionHandler.logException(e) 获得了一个 try/catch;将崩溃报告发送到我的电子邮件,但它也不起作用,所以我不知道该怎么做。

我联系了 AWS 支持团队以检查是否有可能看到任何 SES 日志,但还没有回复。

关于如何更接近真正的异常有什么想法吗?在 Google Play Developer Console 崩溃报告部分仍然看不到它。

好的,幸运的是我自己发现了问题。与中文设备无关,但与Android版本有关。

我在 Android 10 台设备(我仅有的一台)上测试我的应用程序,他们在 Android 11 台设备上测试。

这个 link 解决了我的问题:

这就是解决方案:将其添加到 build.gradle

android { ... 包装选项{ 排除 'META-INF/NOTICE.md' 排除 'META-INF/LICENSE.md' } }

依赖项{ 实施 'com.sun.mail:android-mail:1.6.6' 实施 'com.sun.mail:android-activation:1.6.6' ... }

希望我能帮助其他在发送电子邮件时遇到问题的人。