Я могу подключиться к 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);
Все, кажется, работает хорошо, но я не получаю никакого ответа, когда я отправить свое имя пользователя. Любые идеи о том, почему это может быть?
Я попытался использовать порт 587. Я получаю ту же проблему. Я не уверен, какова должна быть настоящая команда авторизации. Прямо сейчас я пытаюсь «AUTH LOGIN \ r \ n», и я получаю тот же ответ. Вы знаете, что должно быть командой auth? – FoxDonut
587, и вам необходимо переключиться на TSL до аутентификации, поскольку они не позволяют передавать учетные данные по незашифрованному соединению. –
Я использовал STARTTLS и получил сообщение с сервера, в котором говорилось, что TLS запущен, но я ничего не могу сделать оттуда. Любая команда, которую я отправляю после этого, не дает ответа (хорошего или плохого). Не могли бы вы показать мне пример того, какие команды использовать? Я занимаюсь этим несколько дней и искал решение. – FoxDonut