2016-10-28 4 views
0

Я могу подключиться к smtp.gmail.com через порт 465. После того, как с помощью команды AUTH LOGIN получать 334 VXNlcm5hbWU6, который при декодированию «Имя пользователя:»Java - SSL - Аутентификация SMTP сервера в Gmail

I не может понять, как отправить мое имя пользователя по серверу. Я кодирую имя пользователя и отправляю, но не получаю ответа. Следующий ответ должен состоять в том, чтобы спросить мой пароль.

Смотрите ниже:

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

Когда-то попросили имя пользователя, вы должны отправить его в кодировке, а также отправить CR/LF, как добавил Дмитрий Стреблеченко в своем последнем комментарии. Однако, если вы отправляете имя пользователя вместе с CL/LF, сервер будет считать, что он является частью имени пользователя или пароля и продолжает ждать ответа клиента. Я получил его для работы, просто отправив оба в отдельных сообщениях.

В качестве примечания: Команда STARTTLS не нужна, поскольку я использую SSL.

1

Вы должны использовать TLS на порту 587 при подключении к серверам outlook.com или Office 365 SMTP - они не будут принимать соединение в противном случае.

+0

Я попытался использовать порт 587. Я получаю ту же проблему. Я не уверен, какова должна быть настоящая команда авторизации. Прямо сейчас я пытаюсь «AUTH LOGIN \ r \ n», и я получаю тот же ответ. Вы знаете, что должно быть командой auth? – FoxDonut

+0

587, и вам необходимо переключиться на TSL до аутентификации, поскольку они не позволяют передавать учетные данные по незашифрованному соединению. –

+0

Я использовал STARTTLS и получил сообщение с сервера, в котором говорилось, что TLS запущен, но я ничего не могу сделать оттуда. Любая команда, которую я отправляю после этого, не дает ответа (хорошего или плохого). Не могли бы вы показать мне пример того, какие команды использовать? Я занимаюсь этим несколько дней и искал решение. – FoxDonut

Смежные вопросы