我目前正在使用标准的javamail / jsse提供程序设置从Android应用程序中的预定义gmail帐户发送电子邮件,即:
try{
MimeMessage message = new MimeMessage(session);
DataHandler handler = new DataHandler(new ByteArrayDataSource(body.getBytes(), "text/plain"));
message.setFrom(new InternetAddress("xxxxxxxxxxxx - No Reply" +"<xxxxxxxxxx@gmail.com>"));//new InternetAddress(sender,user));
message.setSubject(subject);
message.setDataHandler(handler);
if (recipients.indexOf(',') > 0)
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients));
else
message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients));
Transport.send(message);
return true;
}catch(Exception e){
Log.d("SendMail" , e.getMessage().toString());
return false;
}
应用在尝试发送
之前检查连接 ConnectivityManager cm = (ConnectivityManager) mContext.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = cm.getActiveNetworkInfo();
return networkInfo != null && networkInfo.isConnected() && checkSignal(mContext) > 1;
并使用接收器监视连接,如果没有连接则再次尝试。
<receiver android:name=".Modules.mod_internet_receiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
在大多数情况下,电子邮件都可以通过,但我注意到有些电子邮件丢失了,并且没有报告异常。我已经发现这个问题发生在信号强度较差和不断变化的区域。为了抵消,我们添加了一些原始信号电平测试,并且只尝试发送信号大于1的位置。
try {
final TelephonyManager tm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
for (final CellInfo info : tm.getAllCellInfo()) {
if (info instanceof CellInfoGsm) {
final CellSignalStrengthGsm gsm = ((CellInfoGsm) info).getCellSignalStrength();
mSignalStrength = gsm.getLevel();
Log.d("GSM Signal",String.valueOf(mSignalStrength));
break;
} else if (info instanceof CellInfoCdma) {
final CellSignalStrengthCdma cdma = ((CellInfoCdma) info).getCellSignalStrength();
mSignalStrength = cdma.getLevel();
Log.d("CDMA Signal",String.valueOf(mSignalStrength));
break;
} else if (info instanceof CellInfoLte) {
final CellSignalStrengthLte lte = ((CellInfoLte) info).getCellSignalStrength();
mSignalStrength = lte.getLevel();
Log.d("LTE Signal",String.valueOf(mSignalStrength));
break;
} else {
throw new Exception("Unknown type of cell signal!");
}
}
} catch (Exception e) {
Log.e("Telephony", "Unable to obtain cell signal information", e);
mSignalStrength = 0;
}
Log.d("Signal Strength",String.valueOf(mSignalStrength));
return mSignalStrength;
这工作正常但我意识到此信号可能随时变化,因此在检查后立即发送电子邮件时,信号在发送过程中仍有可能丢失,从而导致电子邮件丢失。我想我可以在几秒钟之后添加第二次检查以查看信号是否稳定,但这些都只是确保成功的解决方法。
我已经查看了Javamail FAQ https://stackoverflow.com/a/30634257/9175763,但这不是传递失败而是连接问题。
我想知道是否有人有更好的方法来解决这个问题?