此代码段发送邮件:
if (m.send()) {
Log.i("MAIL SENDER: ", "Succesfully");
Toast.makeText(getApplicationContext(),
"The log file has been sent",
Toast.LENGTH_LONG).show();
} else {
throw new MailException();
}
如果收件人邮件不正确,例如example@gmail.co
而不是example@gmail.com
,则代码将运行到第一个if-block。当接收器不正确时,为什么会发生这种情况。谁能帮到我这里?
从SharedPreferences中检索邮件设置,并使用以下方法检查:
public static boolean isValidEmailAddress(String email) {
boolean result = true;
try {
InternetAddress emailAddr = new InternetAddress(email);
emailAddr.validate();
} catch (AddressException ex) {
result = false;
}
return result;
}
当用户在文本字段中键入电子邮件地址并点击确定时,这是发生的事情:
if (isValidEmailAddress(mail))
editor.putString("Tomail", mail);
else
Toast.makeText(getApplicationContext(), "Invalid", Toast.LENGHT_LONG).show();
这只会检查邮件是否包含@
,因此其有效。
在我的发送方式中:
public SendMail(Context c) {
this();
sharedPrefs = PreferenceManager.getDefaultSharedPreferences(c);
_host = sharedPrefs.getString("host", null);
_port = sharedPrefs.getString("port", null);
_sport = sharedPrefs.getString("port", null);
_user = sharedPrefs.getString("mail", null);
_pass = sharedPrefs.getString("pw", null);
}
public boolean send() throws Exception {
Properties props = _setProperties();
if (!_user.equals("") && !_pass.equals("") && _to.length > 0
&& !_from.equals("") && !_subject.equals("")
&& !_body.equals("")) {
Session session = Session.getInstance(props,
new GMailAuthenticator(_user, _pass));
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(_from));
InternetAddress[] addressTo = new InternetAddress[_to.length];
for (int i = 0; i < _to.length; i++) {
addressTo[i] = new InternetAddress(_to[i]);
}
msg.setRecipients(MimeMessage.RecipientType.TO, addressTo);
msg.setSubject(_subject);
msg.setSentDate(new Date());
// setup message body
BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setText(_body);
_multipart.addBodyPart(messageBodyPart);
// Put parts in message
msg.setContent(_multipart);
// send email
Transport.send(msg);
return true;
} else {
return false;
}
}
答案 0 :(得分:1)
这是因为邮件是异步协议。基本上,邮件不会传递到目的地,它只是传送到您的本地邮件服务器,它使用它做一些聪明的事情。最终。几个小时后。
如果出现问题,邮件的发件人将收到包含错误消息的邮件,因此您最好确保地址正确。
这意味着接收器地址仅在以后检查。没有办法验证它们。您可以执行一些简单的模式匹配验证来检查损坏的域名,但是当新的顶级域名可用并且我获得digulla@home
电子邮件地址时,这将在几个月内停止工作。
答案 1 :(得分:0)
validate()
方法中使用的 isValidEmailAddress()
遵循RFC822的语法规则。不幸的是,“example@gmail.co”被认为是有效的邮件,因此它返回true。您可以使用RFC822在here上检查邮件的有效性。
文档:validate()
of InternetAddress class
更新:您必须进行其他验证,请查看http://www.mkyong.com/regular-expressions/how-to-validate-email-address-with-regular-expression/