我的應用程式在用戶注冊程序中向電子郵件發送了一個激活碼,但由于未知的原因,在某些中國設備中無法正常作業,并且我無法獲取例外日志。
這是我發送電子郵件的地方:
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":"[email protected]",
"send_from":"[email protected]",
"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); 它將崩潰報告發送到我的電子郵件,但它也無法正常作業,所以我不知道該怎么辦。
我聯系了 AWS 支持團隊以檢查是否有可能看到任何 SES 日志,但還沒有回復。
關于如何更接近真正的例外的任何想法?仍然無法在 Google Play 開發者控制臺崩潰報告部分看到它。
uj5u.com熱心網友回復:
好的,幸運的是我自己發現了這個問題。與中國設備無關,但與Android版本有關。
我正在 Android 10 設備(我僅有的設備)上測驗我的應用程式,他們正在 Android 11 設備上進行測驗。
這個鏈接解決了我的問題:
Android Studio VerifyError 拒絕來自 JavaMail API 的類 text_plain
這就是解決方案:在 build.gradle 中添加這個
android { ... PackagingOptions { 排除 'META-INF/NOTICE.md' 排除 'META-INF/LICENSE.md' } }
依賴項 { 實施 'com.sun.mail:android-mail:1.6.6' 實施 'com.sun.mail:android-activation:1.6.6' ... }
希望我能幫助其他在發送電子郵件時遇到問題的人。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/448535.html
下一篇:如何使用JWT令牌驗證路由?
