使用Amazon SES发送Codeigniter SMTP电子邮件

22

我想Amazon昨天宣布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

当我echo print_debugger()时,我得到:

220 email-smtp.amazonaws.com ESMTP SimpleEmailService-194655181
hello: 421 Timeout waiting for data from client.

这些测试运行在一个 Mediatemple (gs) 服务器上。


这对于 CodeIgniter 的其他“姊妹框架”也是如此——例如 FuelPHP。 - antitoxic
5个回答

30

在加入以下这行代码之前,我一直收到超时消息:

$this->email->set_newline("\r\n");

我的主机设置为 ssl://email-smtp.us-east-1.amazonaws.com


@Stephen,你是从哪里得到这个信息的?这也帮助我在FuelPHP框架中解决了问题。 - antitoxic
3
不幸的是,需要使用明确的命令:在 config/email.php 中通过 $config['newline'] = '\r\n'; 进行设置并不能起作用。 - pr1001
使用这些设置,我收到了以下错误信息 sockopen(): SSL操作失败,错误代码为1。OpenSSL错误消息: error:140770FC:SSL例程:SSL23_GET_SERVER_HELLO:未知协议 - Tommy McGlynn
1
$config ['newline'] = "\ r \ n"; 对我有用(请注意双引号) - sventechie
我使用了set_newline方法,并从正文字符串中剥离了所有的\r\n字符,以使其正常工作。 - Mei Gwilym
显示剩余2条评论

9
要让CI与Amazon Simple Email Service (SES)一起工作,需要做3件事情:
  1. 需要设置 newline = \r\n,否则会超时。
  2. 需要将 smtp_crypto 设置为其他内容。(新要求)
  3. 需要确保在Amazon SES中批准“from”电子邮件地址。我将我的“from”电子邮件地址设置为“no-reply@mydomain.com”
此外,您应该为您的“from”电子邮件地址设置DKIM以防止电子邮件被放入垃圾邮件文件夹。这涉及进入Amazon SES->身份管理->电子邮件地址->DKIM,点击启用按钮,并向您的网站DNS添加3个DNS条目。
无需特别设置SPF。信封域amazonses.com通过SPF。
最后,请确保使用“reply-to”,如果您希望用户能够回复与您批准的“from”电子邮件地址不同的电子邮件地址。
以下是示例工作代码:
$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邮件。 - Neo Pham

6
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;

    } 

2
你能否在回答中添加一些上下文信息呢?解释一下原帖提供的代码出了什么问题,以及为什么这个解决方案是可行的。 - ChiefTwoPencils

4
我还需要添加这行代码。
$config['smtp_crypto']  = 'tls';

添加到我的配置数组中

CI 2.1.0及以上版本支持此功能


这个对我有用。我认为亚马逊SES现在需要这个。谢谢。 - RedDragonWebDesign

2
我为自己工作的设置如下:

看起来像这样:

$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'。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接