2012-02-19 61 views
1

我正在写一个使用套接字发送邮件的SMTP类,几乎都有成功。问题在于随机工作,有时需要很多时间才能发送电子邮件。使用套接字使用电子邮件发送电子邮件

我注意到一旦“。”被发送,我应该得到的电子邮件被发送的响应,而不是我得到的服务器正在关闭传输(当我发送“QUIT”命令相同的消息),然后电子邮件发送的消息。

因此,邮件到达混合出于某种原因...但只有最后两个命令:“。”和“退出”。

任何人都可以帮我一把吗?

上传这里:http://pastebin.com/9vweVpe7

PD:我知道,我可以用PHPMailer的或快速的,但我想自己做学习。

+0

我想在PHP中,“准系统”的方式是使用使用sendmail的mail()函数。我想你可以编写自己的套接字的东西,但这似乎是重新创造了更多的轮子比合理 – Mala 2012-02-19 03:48:00

+0

张贴包跟踪。 – Brad 2012-02-19 04:10:41

+0

@sein Hello Sein,我也想在此学习。你可以请发布已解决的SMTP类吗? – 2012-11-03 22:39:56

回答

3

有几个错误,并在您实现逻辑漏洞,但站出来把我当作直接关系到你的问题最重要的是:

1)compile_message()洞。

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

一旦您发送了初始的DATA命令并收到回复,之后发送的每一行电子邮件数据都不是它自己的命令,而是您将它们视为它们。通过为每一行电子邮件数据呼叫command(),您都期待着由于它们不存在而永远不会到达的响应。对于每行电子邮件数据,请致电fwrite()而不是command()。不要致电command(),直到您准备好发送终止.命令(该命令(顺便提一句,需要将其移出if not html块之外)。

此外,发送电子邮件数据的个别行时,如果以句点开头,则必须在前面加上一个额外的句点。这在RFC 2821 Section 4.5.2中描述。你的代码根本没有处理。如果您没有正确地转义您的电子邮件数据,您可能会不时地终止电子邮件,并且随后的电子邮件行将被服务器解释为未知命令,并且会发送相应的错误响应。如果服务器接收到一堆未知命令,则会终止连接并非不合理。

+0

你是对的,至于新行中的点,我只是发送一行测试,首先我想在继续处理更多数据之前先让它工作。关于拒绝邮件的问题是,即使您还没有发送任何命令,并且您将获得服务器信息,然后您就可以开始通信,您需要在套接字连接完成后立即获得答复。 – 2012-02-19 17:31:42

+0

是的,服务器在发送第一条命令之前确实发送了初始问候语响应。该响应不仅告诉ypu您正在与SMTP服务器进行通信,还会提示它是否支持ESMTP(当认为出错时提供更全面的错误代码 - 使用EHLO进行验证)以及服务器是否准备好接受你的命令与否。 – 2012-02-19 18:57:11