使用套接字通过电子邮件发送电子邮件

时间:2012-02-19 02:46:58

标签: php sockets smtp

我正在编写一个SMTP类来使用PHP的套接字发送邮件,几乎取得了成功。问题是随机工作,有时发送电子邮件需要很多。

我注意到曾经的“。”发送,我应该得到电子邮件发送的响应,而不是我得到服务器正在关闭传输(当我发送“退出”命令时相同的消息),然后发送电子邮件的消息。 / p>

所以消息由于某种原因而混合到来......但只有最后两个命令:“。”和“退出”。

任何人都可以帮我一把?

上传到此处:http://pastebin.com/9vweVpe7

PD:我知道我可以使用phpmailer或swift,但我想亲自去学习。

1 个答案:

答案 0 :(得分:3)

您的实施中存在一些错误和逻辑漏洞,但与我的问题直接相关的最重要的漏洞是:

1)compile_message()中的一个洞。

2)发送电子邮件数据时误用command()

一旦您发送了初始DATA命令并收到了回复,您之后发送的每一行电子邮件数据都不是自己的命令,但您将它们视为一样。通过为每行电子邮件数据调用command(),您期望从不会到来的响应,因为它们不存在。对于每行电子邮件数据,请致电fwrite()而不是command()。在您准备好发送终止command()命令(BTW,需要移出.块之外)之前,请不要致电if not html

此外,在发送单独的电子邮件数据行时,如果以句点开头,则必须以额外句点作为前缀。这在RFC 2821 Section 4.5.2中有所描述。您的代码根本没有处理。如果您没有正确地转义电子邮件数据,您可能会不小心过早地终止电子邮件,并且服务器会将后续电子邮件行解释为未知命令,它将发送相应的错误响应。如果服务器收到大量未知命令,则终止连接是不合理的。