我可以通过端口465连接到smtp.gmail.com。使用AUTH LOGIN命令后,接收334 VXNlcm5hbWU6,解码时为"用户名:"
我似乎无法弄清楚如何通过服务器发送我的用户名。我正在编码用户名和发送,但没有得到答复。下一个回复应该是要求我的密码。
见下文:
public class MailComponent{
Socket socket = null;
final static String MAIL_SERVER = "smtp.gmail.com";
final static int SMTP_PORT = 465;
String uName = "example@gmail.com";
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 :(得分:0)
连接到outlook.com或Office 365 SMTP服务器时,必须在端口587上使用TLS - 否则它们将不接受连接。
答案 1 :(得分:0)
一旦被要求提供用户名,您必须将其编码以及发送CR / LF作为Dmitry Streblechenko在其上一条评论中添加。但是,如果您发送用户名和CL / LF,服务器将认为它是用户名或密码的一部分,并继续等待客户端响应。我通过简单地在两个单独的消息中发送它来实现它。
注意:我没有必要使用STARTTLS命令,因为我正在使用SSL。