我正在寻找用于实验的SMTP套接字和编码this示例。
代码正在与服务器建立连接(我正在连接到gt的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本身。
我是这里的新手。
答案 0 :(得分: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协议。
答案 1 :(得分: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进行通信。