3

here から取得したいくつかの既知の方法を使用して、Androidアプリからプログラムで送信および電子メールを送信しようとしています。

メソッドは gmail アカウントでは正常に動作していますが、hotmail、yahoo、outlook などの別のプロバイダー アカウントで試してみると、次のエラーがスローされます。

07-04 13:18:34.736: I/System.out(32140): ERROR SENDING MESSAGE: javax.mail.MessagingException: Could not connect to SMTP host: smtp-mail.outlook.com, port: 587;
07-04 13:18:34.736: I/System.out(32140):   nested exception is:
07-04 13:18:34.736: I/System.out(32140):    javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x7912c980: Failure in SSL library, usually a protocol error
07-04 13:18:34.736: I/System.out(32140): error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol (external/openssl/ssl/s23_clnt.c:766 0x7387f7d0:0x00000000)

次の資格情報を使用してメールを送信しています。

ユーザー: @hotmail.com ホスト: smtp-mail.outlook.com ポート: 587

さまざまなアカウント(すべてGmail以外)で試してみましたが、毎回同じエラーが発生します。

MailSenderのクラスは:

public class MailSender{

public synchronized static void sendMail(String[] dest, String org, String pass, String body, String port, String host){ 

    String[] to = dest;
    final String user = org;
    final String password = pass;
    MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
    mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
    mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
    mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
    mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
    mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
    CommandMap.setDefaultCommandMap(mc);  

    Properties props = new Properties();
    props.put("mail.smtp.user", user);
    props.put("mail.smtp.host", host);
    props.put("mail.smtp.port", port);
    props.put("mail.smtp.starttls.enable","true");
    props.put("mail.smtp.debug", "true");
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.socketFactory.port", port);
    props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    props.put("mail.smtp.socketFactory.fallback", "false");

    Session session = Session.getInstance(props, new javax.mail.Authenticator() {
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(user,password);
        }
    });

    try{ 
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress(user));     
        InternetAddress[] addressTo = new InternetAddress[to.length]; 
        for (int i = 0; i < to.length; i++) { 
            addressTo[i] = new InternetAddress(to[i]); 
        } 
        message.setRecipients(MimeMessage.RecipientType.TO, addressTo);
        message.setSubject("Arcas Ollé Alarm Message");   
        BodyPart messageBody = new MimeBodyPart();
        messageBody.setText(body);  
        Multipart multipart = new MimeMultipart();
        multipart.addBodyPart(messageBody);
        message.setContent(multipart ); 
        Transport.send(message); 
        System.out.println("MESSAGE SENT...");
    }catch (MessagingException ex) {
        System.out.println("ERROR SENDING MESSAGE: "+ ex);
    }
  }
}

そして、私は次のようにメソッドを呼び出します:

MailSender.sendMail(dest, org, pass, body, port, host);

前に述べたように、この方法は gmail アカウントで正常に機能するため、データ解析の問題ではないと思います。試した資格情報はすべて正しいと確信しています。

それは所有権の問題かもしれません。

誰かがこれを解決するのを手伝ってくれたら、本当に感謝しています。

前もって感謝します、

マーガブロ。

4

3 に答える 3

2

参考のため:

Gmail -ホスト: smtp.gmail.com、ポート: 465

Hotmail - ホスト: smtp.live.com、ポート: 587

Yahoo - ホスト: smtp.mail.yahoo.com、ポート: 465

于 2014-07-04T11:41:11.390 に答える
0

私は最終的に解決策を見つけました(多くの調査とテストの後)。他の誰かが同じ問題を抱えている場合に備えて、回答として投稿します。

メール送信者クラスでは、プロパティ コードに次の変更を加えました。

Properties props = new Properties();
props.put("mail.smtp.user", user);
props.put("mail.smtp.host", host);
props.put("mail.smtp.port", port);
props.put("mail.smtp.starttls.enable","true");
props.put("mail.smtp.debug", "true");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.socketFactory.port", "587");
//props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");

すべてのホストのソケット ファクトリ ポートとしてポート 587 を追加し、次の行にコメントを付けました。

props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

私がテストして使用したホストの構成は次のとおりです。

-- ホットメール / アウトルック --

ホスト: smtp.live.com
ポート: 25

-- Gメール --

ホスト: smtp.gmail.com
ポート: 587

-- YAHOO! --

ホスト: smtp.mail.yahoo.com
ポート: 587

それが役に立てば幸い :)

于 2014-09-08T10:08:41.447 に答える