【发布时间】:2015-12-03 09:49:49
【问题描述】:
这是我第一次用 SMTP 做任何事情,所以如果我在这里做错了什么,请耐心等待 :) 通常,我只使用 PHPMailer,但在这种情况下这不是一个选项。强>
我正在尝试向邮件列表中的人发送电子邮件。我正在使用 fsockopen,我需要使用 TLS 连接来执行此操作。
我就是这样做的:
- $conn = fsockopen() // 我的详细信息在那里,它连接。
- HELO myhost.com (fwrite)
- STARTTLS (fwrite)
- stream_socket_enable_crypto($conn, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);
- HELO myhost.com (fwrite)
- 授权登录(fwrite)
- base64_encoded USERNAME (fwrite)
- base64_encoded PASSWORD (fwrite)
- 发件人:(fwrite)
- RCPT 到:; (fwrite)
- 数据(写入)
- 包含我所有标题的字符串 (fwrite)
- fclose($conn);
这就是问题所在
使用加密连接后,我似乎无法成功读取服务器响应。例如,在我的身份验证后尝试使用fgets($conn,1024) 读取响应时,它需要很长时间,最后我会得到一个高度加密的代码,无法查找响应“235”(以确保我的身份验证成功)。
然后当我写 MAIL FROM 时,我的回复将如下所示:
.0.0 SMTP server ready
虽然我想我会想要这样的东西:
250 2.0.0
出了点问题,但我不知道为什么。我希望你们所有的专家都可以帮助我解决这个问题:)
提前致谢!
解决了
万一其他人遇到这个问题。
此命令有效
- $conn = fsockopen() // 我的详细信息在那里,它连接。
- EHLO myhost.com (fwrite)
- STARTTLS (fwrite)
- stream_socket_enable_crypto($conn, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);
- EHLO myhost.com (fwrite)
- 授权登录(fwrite)
- base64_encoded USERNAME (fwrite)
- base64_encoded PASSWORD (fwrite)
- 发件人:(fwrite)
- RCPT 到:; (fwrite)
- 数据(写入)
- 包含我所有标题的字符串 (fwrite)
- fclose($conn);
在每次通话之间我添加了以下内容:
stream_set_timeout($conn, 300);
set_time_limit(310);
突然收到来自服务器的预期回复,邮件发送成功。
【问题讨论】:
-
为什么不能使用PHPMailer?
-
好吧,我们正在对迄今为止运行良好的自定义引擎进行更改。我认为将其全部更改为使用 PHPMailer 运行比仅启动 TLS 需要更长的时间我们已经得到的联系。现在我很喜欢它,所以我不想放弃它。我也想知道哪里出了问题;)
-
我会减少你的损失并使用 PHPMailer;权衡更改代码以使用 PHPMailer 所花费的时间与您自己重新编写相同功能所需的时间。除此之外,我祝你好运;我浪费了几天的时间来尝试这样做,最后放弃并改用 PHPMailer。
-
@SteJ,当我开始工作时,我正要弃船并在 PHPMailer 下寻求庇护。如果您(或其他任何人)有兴趣,请编辑我上面的帖子。
-
太棒了 - 很高兴听到你已经整理好了!这当然是有用的信息;如果这篇文章是几个月前的话,我会避免在我的代码中出现额外的依赖。
标签: php sockets smtp tls1.2 starttls