我正在研究SMTP套接字进行实验和编码的this示例。

代码正在与服务器建立连接(我正在连接gmail的smtp)。

在连接期间,我正在从服务器接收以下消息。 (在行注释中是导致服务器发出消息的已发送流。)

220 mx.google.com ESMTP qw8sm31710864pbb.27 - gsmtp   // EHLO MY-HOSTNAME
250-mx.google.com at your service, [184.6.159.254]  // STARTTLS
250-8BITMIME   // MAIL From: myName <xyz@gmail.com>
250-SIZE 35882577    //  RCPT To: destName <pqr@hotmail.com>
250-STARTTLS // DATA
250-ENHANCEDSTATUSCODES // Subject: subjectline here
250 CHUNKING // .
220 2.0.0 Ready to start TLS // QUIT


来自服务器的消息告诉连接和发送的数据没有问题(?),但是服务器正在丢弃请求-我在pqr@hotmail.com上没有看到该消息。

1.)在本示例以及其他示例中,我没有看到任何身份验证的痕迹-密码不会出现在任何地方,甚至不会出现任何单词。未经身份验证应该如何工作?我看到的每个样例听起来都像身份验证不是问题。这样,任何人都可以从任何人的帐户发送电子邮件。

2.)建议sample code使用SSLSocket。 findJar中的每个都与
一些浏览器插件和一些其他软件包。没有办法解决这个问题-我只是在寻找sslSocket本身。

我是这里的新手。

最佳答案

服务器通常需要某种形式的身份验证,但通常至少要至少确保您从要发送的域中进行发送(通过对照域检查IP地址并验证是否允许该域)。为了防止垃圾邮件发送者在打开的电子邮件主机上发送电子邮件,已经做了很多工作。

问题的一部分是,当邮件服务器(MTA-邮件传输代理)期望您正在协商SSL会话时,您正在发送SMTP命令。您可以尝试使用tcpdump或Wireshark之​​类的东西来检查实际会话。

如果C是客户端,S是服务器,那么通常您将:

C - connect to server
S - shows SMTP prompt with a 2xx series prefix
C - send ELHO (or HELO for less capable servers)
S - should respond with a 2xx series of messages with capabilities one per line if your domain is ok
C - send STARTTLS
S - response with 2xx series message


此时,您必须协商TLS连接
经过协商之后,您就可以开始发送命令了
通过该连接。必须编写您的代码来处理协商
并切换到TLS,因为它不会自动处理。如果您不以后
命令基本上将被视为乱码,并被服务器忽略。在本质上,
发送后续的SMTP命令看起来像是对
TLS协商会话。

http://en.wikipedia.org/wiki/STARTTLS中有一些指针的更多信息。
SMTP可能非常复杂,因此除非您连接到特定系统,否则它可能是
最好使用JavaMail之类的东西与MTA进行通信。

10-06 13:40
查看更多