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'
...
}
希望我能帮助其他在发送电子邮件时遇到问题的人。
我的应用程序在用户注册过程中向电子邮件发送了一个激活码,但出于某种未知的原因——对我来说——在某些中国设备上无法正常工作,我无法获得异常日志。
这是我发邮件的地方:
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' ... }
希望我能帮助其他在发送电子邮件时遇到问题的人。