0

我正在研究 SMTP 套接字进行实验并对此示例进行编码。

该代码正在与服务器建立连接(我正在连接到 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.)示例代码建议使用 SSLSocket。findJar的每个都带有一些浏览器插件和其他一些包。有没有办法解决这个问题 - 我只是想获得 sslSocket 本身。

我是这里的新手。

4

2 回答 2

1

您对服务器消息的解释完全错误:

220 mx.google.com ESMTP qw8sm31710864pbb.27 - gsmtp 

这是您在连接后收到的欢迎消息,例如没有发送任何数据。

250-8BITMIME
250-SIZE 35882577 
250-STARTTLS
250-ENHANCEDSTATUSCODES
250 CHUNKING

这是您在 EHLO 命令中得到的多行响应。

220 2.0.0 Ready to start TLS

这是您在响应 STARTTLS 命令时收到的消息。

如您所见,服务器甚至没有开始处理您的 MAIL FROM、RCPT TO 和 DATA,因此邮件没有发送也就不足为奇了。我认为您应该在尝试使用 SMTP 协议之前让自己更加熟悉它。

于 2014-03-16T07:56:24.050 回答
0

服务器通常需要某种形式的身份验证,但通常至少会确保您从您所说的发送地址的域发送(通过根据域检查您的 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 通信。

于 2014-03-16T07:52:11.083 回答