2012-09-06 18 views
6

私は、多数の引数を受け取る単純なメール送信者クラスを作成しようとしています。これらのクラスを使用すると、Exchange 2010サーバーを使用して電子メールが送信されます。認証などがうまくいくように見えますが、実際にコードが電子メールを送信しようとしているときは、次の例外が発生しています(私は思っています)。私は、認証が機能していることを確認して、セッションから戻ってくるトランスポートを取得しますが、それでも失敗します。誰かが私が間違っているか行方不明にしているかのようなものを流すことはできますか?ありがとう。JavaMail - javax.mail.MessagingException

例外:

javax.mail.MessagingException: [EOF] 
     at com.sun.mail.smtp.SMTPTransport.issueCommand(SMTPTransport.java:1481) 
     at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1512) 
     at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:1054) 
     at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:634) 
     at javax.mail.Transport.send0(Transport.java:189) 
     at javax.mail.Transport.send(Transport.java:140) 
     at com.ri.common.mail.util.MailSender.sendHTMLEmail(MailSender.java:75) 
     at com.ri.common.mail.util.MailSender.main(MailSender.java:106) 

関連するコード:

import java.util.Properties; 

import javax.mail.Authenticator; 
import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.PasswordAuthentication; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage; 


public class MailSender 
{ 
    public static void sendHTMLEmail(String fromEmailId, String toEmailId, String host, String hostUserName, 
      String hostPassword, String mailSubject, String mailBody) 
    { 
     // Get system properties. 
     Properties props = System.getProperties(); 
     // Setup mail server 
     props.put("mail.transport.protocol", "smtp"); 
     props.put("mail.smtp.host", host); 
     props.put("mail.smtp.auth", "true"); 

     final String hostUName = hostUserName; 
     final String hPassword = hostPassword; 

     Authenticator authenticator = new Authenticator() 
     { 
      protected PasswordAuthentication getPasswordAuthentication() 
      { 
       return new PasswordAuthentication(hostUName, hPassword); 
      } 
     }; 

     // Get the default Session object. 
     Session session = Session.getDefaultInstance(props, authenticator); 

     try 
     { 
      // Create a default MimeMessage object. 
      MimeMessage message = new MimeMessage(session); 

      // Set From: header field of the header. 
      message.setFrom(new InternetAddress(fromEmailId)); 

      // Set To: header field of the header. 
      message.addRecipient(Message.RecipientType.TO, new InternetAddress(toEmailId)); 

      // Set Subject: header field 
      message.setSubject(mailSubject); 

      // Send the actual HTML message, as big as you like 
      message.setContent(mailBody, "text/html"); 

      // Send message 
      Transport.send(message, message.getAllRecipients()); 
      System.out.println("Sent message successfully...."); 
     } 
     catch(Exception mex) 
     { 
      mex.printStackTrace(); 
     } 

    } 

    public static void main(String[] args) 
    { 

     String to = "[email protected]"; 
     String from = "[email protected]"; 
     String host = "correctHostForExch2010"; 
     String user = "correctUser"; 
     String password = "CorrectPassword"; 
     String subject = "Test Email"; 
     String body = "Hi there. This is a test email!"; 

     MailSender.sendHTMLEmail(from, to, host, user, password, subject, body); 
    } 
} 

編集:私は、デバッグをオンにし、それはときに、セッション

MAIL FROM:<[email protected]> 530 5.7.1 Client was not authenticated 
DEBUG SMTP: got response code 530, with response: 530 5.7.1 Client was not authenticated. 

は、なぜそれが可能だろうと言います認証succeded?

+2

正しいことを確認しますが、デバッグモードを有効にすることができあなたのアプリがSMPTサーバに何を伝えているかを見ることができるように、話の最後にエラーを示す何かが表示されるはずです。 – Alex

+0

こんにちはアレックス、ありがとう!私はデバッグを有効にし、MAIL FROM:<[email protected]> 530 5.7.1クライアントが認証されていません DEBUG SMTP:応答コード530、応答:530 5.7.1クライアントが認証されていません。なぜセッション認証が成功したのでしょうか? – legendofawesomeness

+0

私はちょうどExchangeのユーザーのいくつかのバージョンでは、その中に任意の助けができる場合は、次の形式の 'user @ domain'または' domain \\ user'のいずれかを持つべきであることを見ました。 – Alex

答えて

7

ありがとうアレックスとビル。私はそれを次のプロパティを有効にすることによって動作させました。

props.put("mail.smtp.starttls.enable", "true"); 
1

2つの可能性:

  1. 実際のでSession.getDefaultInstanceの使用を認証しようとしていません。
  2. クライアントとサーバーの両方がサポートしている認証メカニズムが見つからないため、認証情報を送信する前にSSLを使用する必要があるためです。 "mail.smtp.starttls.enable"を "true"に設定してみてください。

さらにデバッグ出力を見ることができれば、どちらが当てはまるかを知ることができます。

0

私はまた、このエラーは私の訂正をしたトレース持っていた:

OSのcentos7の場合: のvi/etc/hostsファイル に移動し、IPアドレスが