2016-10-28 12 views
0
私はAUTH LOGINコマンドを使用した後は、ポート465を経由してsmtp.gmail.comに接続することができる午前

は、デコードされた334 VXNlcm5hbWU6は、「ユーザー名」で受け取りますサーバー上でユーザー名を送信する方法を理解できないようです。私はユーザー名をエンコードして送信していますが、返信はありません。次の返信は私のパスワードを尋ねることです。のJava - - SSLは、GmailのSMTPサーバーで認証

は、以下を参照してください。

public class MailComponent{ 
Socket socket = null; 
final static String MAIL_SERVER = "smtp.gmail.com"; 
final static int SMTP_PORT = 465; 
String uName = "[email protected]"; 
String encodedName = Base64.getEncoder().encodeToString(uName.getBytes(StandardCharsets.UTF_8)); 

public MailComponent(){ /*Create constructor later*/} 

public void sendMail() throws Exception{ 

    try{ 
     // Establish TCP Connection With Mail Server 
     socket = ((SSLSocketFactory) SSLSocketFactory.getDefault()).createSocket(MAIL_SERVER, SMTP_PORT); 

     // Create a Buffered Reader to read one line at a time 
     InputStream inStream = socket.getInputStream(); 
     InputStreamReader inReader = new InputStreamReader(inStream); 
     BufferedReader bReader = new BufferedReader(inReader); 

     // Read Server's Greeting 
     String serverResponse = bReader.readLine(); 
     System.out.println("Server Greeting: " + serverResponse);   
     if (!serverResponse.startsWith("220")){ 
      throw new Exception("220 Reply Not Received From Server!"); 
     } 

     // Reference socket's output stream 
     OutputStream oStream = socket.getOutputStream(); 

     // Send HELO command 
     String heloCommand = "HELO smtp.gmail.com\r\n"; 
     oStream.write(heloCommand.getBytes("US-ASCII")); 
     serverResponse = bReader.readLine(); 
     System.out.println("HELO Response: " + serverResponse); 
     if (!serverResponse.startsWith("250")) 
      throw new Exception("250 Reply Not Received From Server!"); 

     // Obtain Authorization 
     String authCommand = "AUTH LOGIN\r\n"; 
     oStream.write(authCommand.getBytes("US-ASCII")); 
     serverResponse = bReader.readLine(); 
     System.out.println("Auth Response: " + serverResponse); 

     // Give Username 
     oStream.write(encodedName.getBytes(StandardCharsets.UTF_8));  
     serverResponse = bReader.readLine(); 
     System.out.println("Username Response: " + serverResponse); 

すべてが正常に動作するようですが、私は自分のユーザー名を送ったら、私は任意の応答を受信しません。これがなぜ起こったのかについてのアイデアはありますか?

答えて

0

ユーザ名を尋ねられたら、それをエンコードして送信し、最後のコメントでDmitry Streblechenkoが追加したCR/LFを送信する必要があります。ただし、CL/LFとともにユーザー名を送信すると、サーバーはユーザー名またはパスワードの一部であると考えて、クライアントの応答を待っています。私は単に両方のメッセージを別々のメッセージで送信するだけで動作するようにしました。

注:私はSSLを使用しているため、STARTTLSコマンドは必要ありませんでした。

1

outlook.comサーバーまたはOffice 365 SMTPサーバーに接続するときは、ポート587でTLSを使用する必要があります。そうしないと接続は受け入れられません。

+0

私はポート587も使ってみました。私は同じ問題を得る。実際のAuthorizationコマンドの内容はわかりません。今、私は "AUTH LOGIN \ r \ n"を試みています。私は同じ返信を受け取ります。 authコマンドは何をすべきか知っていますか? – FoxDonut

+0

587暗号化されていない接続を介して資格情報を送信できないため、認証する前にTSLに切り替える必要があります。 –

+0

私はSTARTTLSを使用して、TLSが開始されたというメッセージをサーバーから取得しましたが、そこからは何もできません。それ以降に送信するコマンドは、何の応答もしません(良いか悪いか)。 使用するコマンドの例を教えてください。私はこの間何日もやっていて、解決策を探していました。 – FoxDonut

関連する問題