使用 Amazon SES 的 Codeigniter SMTP 电子邮件
Posted
技术标签:
【中文标题】使用 Amazon SES 的 Codeigniter SMTP 电子邮件【英文标题】:Codeigniter SMTP Email with Amazon SES 【发布时间】:2012-01-21 12:00:27 【问题描述】:我想昨天亚马逊宣布了对 SES(简单电子邮件服务)的 SMTP 支持。
我尝试使用 Codeigniter 发送 SMTP 电子邮件,但没有成功。
我有一个经过验证的发件人,一切看起来都不错:
$this->load->library('email');
$config = array(
'protocol' => 'smtp',
'smtp_host' => 'email-smtp.us-east-1.amazonaws.com',
'smtp_user' => 'SMTP USERNAME',
'smtp_pass' => 'SMTP PASSWORD',
'smtp_port' => 465,
'mailtype' => 'html'
);
$this->email->initialize($config);
$this->email->print_debugger();
$this->email->from('verified_email_address@something.com', 'Test From');
$this->email->to('email@example.com', 'Test To');
$this->email->subject('Test');
$this->email->message('test');
$this->email->send();
我尝试了以下 smtp_host:
email-smtp.us-east-1.amazonaws.com tls://email-smtp.us-east-1.amazonaws.com ssl://email-smtp.us-east-1.amazonaws.com当我回显 print_debugger() 时,我得到:
220 email-smtp.amazonaws.com ESMTP SimpleEmailService-194655181
hello: 421 Timeout waiting for data from client.
这些测试在 mediatemple (gs) 服务器上运行。
【问题讨论】:
CodeIgniter 的其他“姐妹框架”也是如此 - 例如 Fuelphp。 【参考方案1】:在添加该行之前,我收到了该超时消息:-
$this->email->set_newline("\r\n");
我的主机设置为ssl://email-smtp.us-east-1.amazonaws.com
【讨论】:
嗨@Stephen,我将这些行添加到我的代码中,但是当我发送到我的gmailerror:Email address is not verified.
时仍然出现错误。它仅在我发送到我发送消息的同一个域时才有效。您能告诉我您的from
和to
电子邮件地址分别是什么吗?谢谢!
@Stephen,你在哪里找到的?这也让我在 FuelPHP 框架中得到了拯救。
不幸的是,这个明确的命令是必需的:在config/email.php
中通过$config['newline'] = '\r\n';
设置它不起作用。
使用这些设置,我收到以下错误 sockopen(): SSL operation failed with code 1. OpenSSL 错误消息:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
$config['newline'] = "\r\n";为我工作(注意双引号)【参考方案2】:
您需要做 3 件事才能让 CI 与 Amazon Simple Email Service (SES) 配合使用
-
需要设置
newline = \r\n
,否则会超时。
需要将smtp_crypto
设置为某个值。 (新要求)
需要确保“发件人”电子邮件地址在 Amazon SES 中获得批准。我将“发件人”电子邮件地址设为“no-reply@mydomain.com”
此外,您应该为您的“发件人”电子邮件地址设置 DKIM,以防止电子邮件被放入垃圾邮件文件夹。这涉及进入 Amazon SES -> 身份管理 -> 电子邮件地址 -> DKIM,点击启用按钮,并将 3 个 DNS 条目添加到您网站的 DNS。
无需执行任何特殊操作即可设置 SPF。信封域 amazonses.com 通过 SPF。
最后,如果您希望用户能够回复与您批准的“发件人”电子邮件地址不同的电子邮件地址,请务必使用“回复”。
示例工作代码:
$obj = &get_instance();
$config['protocol'] = 'smtp';
$config['smtp_host'] = 'email-smtp.us-west-2.amazonaws.com';
$config['smtp_user'] = 'USER';
$config['smtp_pass'] = 'PASS';
$config['smtp_port'] = '587';
$config['newline'] = "\r\n";
$config['smtp_crypto'] = 'tls';
$obj->email->initialize($config);
$obj->email->set_mailtype('html');
// don't html_escape email header variables
$obj->email->from(MV_FROM_EMAIL, $from_name);
$obj->email->reply_to($from_email, $from_name);
$obj->email->to($to);
$obj->email->subject($subject);
$obj->email->message($obj->load->view($path, html_escape($data), true));
$obj->email->send();
【讨论】:
也适用于 java 邮件【参考方案3】:public function enviar_email($para, $assunto, $mensagem, $formato='html')
$this->CI->load->library('email');
$config['mailtype'] = $formato;
$config['useragent'] = 'Post Title';
$config['protocol'] = 'smtp';
$config['smtp_host'] = 'tls://email-smtp.us-east-1.amazonaws.com';
$config['smtp_user'] = 'smtpuser';
$config['smtp_pass'] = 'smtppass';
$config['smtp_port'] = '465';
$config['wordwrap'] = TRUE;
$config['newline'] = "\r\n";
$this->CI->email->initialize($config);
$this->CI->email->from('Your Verified Sender Email', 'Post Title');
$this->CI->email->to($para);
$this->CI->email->subject($assunto);
$this->CI->email->message($mensagem);
if($this->CI->email->send()):
return TRUE;
else:
$this->CI->email->print_debugger();
endif;
【讨论】:
您能否为您的答案添加一些上下文。解释 OP 提供的代码在哪里出错以及为什么会这样。【参考方案4】:我还需要添加一行
$config['smtp_crypto'] = 'tls';
到我的配置数组
这是supported by CI 2.1.0 and greater
【讨论】:
这为我解决了问题。我认为 Amazon SES 现在需要这个。谢谢。【参考方案5】:对我有用的设置如下所示:
$test_config['protocol'] = 'smtp';
$test_config['smtp_host'] = 'ssl://email-smtp.us-east-1.amazonaws.com';
$test_config['smtp_port'] = '465';
$test_config['smtp_user'] = 'XXXXXXXXXXXXXXXXXXX';
$test_config['smtp_pass'] = 'YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY';
$test_config['newline'] = "\r\n";
$this->email->initialize($test_config);
$this->email->from('from@test.com', 'From at Test.com');
$this->email->to('To@Test.com');
$this->email->subject('Email Test');
$this->email->message('Testing the email class.');
$this->email->send();
换行符必须设置为“\r\n”,并且可以在配置文件中设置,如果正确设置为“\r\n”,而不是如上所述的“\r\n”。
【讨论】:
以上是关于使用 Amazon SES 的 Codeigniter SMTP 电子邮件的主要内容,如果未能解决你的问题,请参考以下文章
Postfix 处理 Amazon SES 最大发送速率错误
python 使用Amazon SES的Python SMTP Mailer(smtplib)
使用 Amazon SES 的 Codeigniter SMTP 电子邮件