【发布时间】:2021-10-06 02:32:15
【问题描述】:
我在问这个问题,我感到非常尴尬。我在不使用 Java MAIL API 或任何其他第三方加密库的情况下实现 SMTP 客户端,无论是否开源,因为我不喜欢第三方 API 并希望按照我的方式做事。我知道这很傲慢,但我就是这样。所以,到目前为止我有这个:-
import java.net.Socket;
import java.util.Scanner;
import java.util.Base64;
public class SocketSample
{
public static void main(String[] args) throws Exception
{
Socket socket = null;
InputStream in = null;
OutputStream out = null;
String uid = Base64.getEncoder().encodeToString("xyz@gmail.com".getBytes());
String pwd = Base64.getEncoder().encodeToString("abc123".getBytes());
System.out.println(uid);
System.out.println(pwd);
//char ans = '\0';
Scanner scanner = new Scanner(System.in);
System.out.print("Enter host: ");
String host = scanner.nextLine();
System.out.print("Enter port: ");
int port = Integer.parseInt(scanner.nextLine());
socket = new Socket();
socket.connect(new InetSocketAddress(host, port));
if (socket.isConnected())
{
System.out.println("Socket connected.");
out = socket.getOutputStream();
String command = "HELO " + host + "\r\n";
byte[] data = command.getBytes();
out.write(data);
out.flush();
//
in = socket.getInputStream();
int c = '\0';
while (c != -1)
{
c = in.read();
System.out.print((char) c);
}
//
command = "STARTTLS\r\n";
data = command.getBytes();
out.write(data);
out.flush();
c = '\0';
while(c != -1)
{
c = in.read();
System.out.print((char) c);
}
/*
command = "HELO " + host + "\r\n";
data = Base64.getEncoder().encodeToString(command.getBytes()).getBytes();
out.write(data);
out.flush();
c = '\0';
while(c != -1)
{
c = in.read();
System.out.print((char) c);
}
*/
System.out.println(uid);
System.out.println(pwd);
command = "AUTH PLAIN " + uid + "\r\n";
data = command.getBytes();
out.write(data);
out.flush();
c = '\0';
while(c != -1)
{
c = in.read();
System.out.print((char) c);
}
//
command = pwd + "\r\n";
data = command.getBytes();
out.write(data);
out.flush();
c = '\0';
while (c != -1)
{
c = in.read();
System.out.print((char) c);
}
}
out.close();
in.close();
socket.close();
System.exit(0);
}
}
这卡在 STARTTLS 上,虽然我使用 base64 编码用户名和密码,但它仍然卡在那里。我在做什么错?请帮帮我。 谢谢! P.S.: - 我是 Java 新手。
【问题讨论】:
-
我不确定我是否应该鼓励你,但
in.read()在对方关闭之前不会返回 -1。如果您要做到这一点,甚至取得初步的成功,我建议您对原始协议有 100% 的把握。迹象表明你不是…… -
非常感谢先生。是的,我对协议的了解至少可以说是初级的。我正在阅读它的规格和其他阅读我确信这个过程是正确的,但是在一些地方的错误是在选择正确的阅读器和编写器,使用正确格式的命令等。你能给我更多的提示吗,先生?谢谢。
-
我的建议是在代码中标注服务器要发送的内容以及作为客户端要发送的内容
-
非常感谢您,先生。我已经达到了我愿意的程度。先生,祝您未来好运。再次非常感谢您!
标签: java authentication smtp gmail