提问者:小点点

亚马逊SES STARTTLS SMTP


我试图发送邮件使用亚马逊SES SMTP与启动在ExpressionEngine.我遇到下面的错误。

我不确定为什么它抱怨它不能在STARTTLS命令之前发送AUTH LOGIN命令-STARTTLS显然已经发送了。我已经尝试了我能想到的一切,如果有人能给我指明正确的方向,我将不胜感激。

220email-smtp.amazonaws.comESMTP SimpleEmail Service-376766033

你好:250电子邮件smtp。亚马逊。通用域名格式

250-8比特

250号10485760

250-STARTTLS

250-AUTH普通登录

250行

无法发送AUTH LOGIN命令。错误:530必须首先发出STARTTLS命令

发件人:530需要身份验证

遇到以下SMTP错误:需要530身份验证

收件人:503错误:需要邮件命令

遇到以下SMTP错误:503错误:需要邮件命令

数据:503错误:需要邮件命令

遇到以下SMTP错误:503错误:需要邮件命令

500错误:命令未实现

遇到以下SMTP错误:500错误:未执行命令

无法使用PHP SMTP发送电子邮件。您的服务器可能未配置为使用此方法发送邮件。


共2个答案

匿名用户

这里有一个合适的解决方案。

这是两个步骤(如果您愿意,您可以安全地忽略这些解释),并且不涉及编辑任何非配置表达式引擎文件,因此您不会中断升级路径。

它已经在两个Expression Engine安装(每个版本都是v2.5.3-构建日期:20120911)上进行了测试,并且运行良好。

步骤1(共2步):手动编辑{INSTALLDIR}/表达式引擎/配置/config.php文件,并在末尾添加以下三行:

/* These email configuration variables are required for Amazon SES */
$config['email_smtp_crypto'] = 'tls'; // TLS protocol
$config['email_newline'] = "\r\n"; // SES hangs with just \n

说明:第一行将默认电子邮件加密设置为TLS(SES需要)。第二行将电子邮件换行符从表达式引擎默认值“\n”更改为符合RFC 822的“\r\n”(SES也需要)。

第2步,共2步:通过EE管理员转到“管理员”-

  • 电子邮件协议:SMTP

说明:一旦您有一个SES验证的发件人电子邮件地址,并且您已被授予对亚马逊SES的生产访问权限(这两者都需要通过亚马逊的SES管理控制台完成),您可以通过SES管理控制台创建一个具有SMTP凭据的AWS帐户。这样做,亚马逊SES将给你自己的凭据。

例如,它应该是这样的(带有古怪的用户名和密码):

  • SMTP服务器地址示例:tls://email-smtp.us-east-1.amazonaws.com:465
  • SMTP用户名示例:qskhftqmsqakaij6gfy
  • SMTP密码示例:PENQC2BE3IABNYHDDTBUJWEKIKOQE2DAHWR3FVZOBJH

要通过您的EE管理员进行测试,请访问“工具-

匿名用户

这是我的解决办法。我还没来得及想一想我们为什么这么做,但如果你有时间,一定要和我分享。

在您的EE配置文件中添加以下设置(两个tls设置,因为存在多个工作示例??):

/* SMTP mail settings
-------------------------------------------------------------------*/
$config['mail_protocol'] = "smtp";
$config['email_smtp_crypto'] = "tls";
$config['smtp_crypto'] = "tls";
$config['smtp_server'] = "AWS-SMTP-ADDRESS";
$config['smtp_username'] = "AWS-SMTP-USERNAME";
$config['smtp_password'] = "AWS-SMTP-PASSWORD";
$config['smtp_port'] = "465";
$config['smtp_timeout'] = 30;
$config['email_crlf'] = "\r\n"; 
$config['email_newline'] = "\r\n";

然后修改Codeigniter电子邮件。php类,按照本文的思路:http://ellislab.com/forums/viewthread/158882/

我做的唯一变化是默认设置$starttls=TRUE。

var $starttls       = TRUE;