1

このコードニペットは、メールを送信します:

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 ブロックに実行されます。受信者が正しくないのに、なぜこれが起こったのですか。誰か助けてくれませんか?

メール設定は 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;
}

ユーザーがテキスト フィールドに電子メール アドレスを入力して [OK] をクリックすると、次のことが起こります。

if (isValidEmailAddress(mail)) 
            editor.putString("Tomail", mail);
else
    Toast.makeText(getApplicationContext(), "Invalid", Toast.LENGHT_LONG).show(); 

これは、メールに a が含まれているかどうかのみをチェックし@、そのため有効です。

私の送信方法では:

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

2 に答える 2

2

これは、メールが非同期プロトコルであるために発生します。基本的に、メールは宛先に配信されるのではなく、ローカルのメールサーバーに配信されるだけです。最終的。ほんの数時間で。

何か問題がある場合、メールの送信者はエラーメッセージを含むメールを受け取るので、アドレスが正しいことを確認することをお勧めします。

これは、受信者アドレスが後でのみチェックされることを意味します。それらを検証する方法はありません。壊れたドメイン名をチェックするためにいくつかの簡単なパターンマッチング検証を行うことができますが、新しいトップレベルドメインが利用可能になり、私のdigulla@home電子メールアドレスを取得すると、数か月で機能しなくなります。

于 2012-08-17T13:59:39.727 に答える
0

validate()methodで使用される はisValidEmailAddress()、RFC822 の構文規則に従います。残念ながら、「example@gmail.co」は有効なメールと見なされるため、true が返されました。こちら でRFC822 を使用してメールの有効性を確認できます。

ドキュメンテーション: validate()InternetAddress クラスの


更新:追加の検証を行う必要があります。http: //www.mkyong.com/regular-expressions/how-to-validate-email-address-with-regular-expression/ をご覧ください。

于 2012-08-17T13:47:13.563 に答える