JavaMail,如果接收者邮件错误,则抛出异常

时间:2012-08-17 13:33:32

标签: java

此代码段发送邮件:

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;
    }
}

2 个答案:

答案 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/