CodeIgniter:来自PHPMailer Code的SSL / TLS SMTP Auth电子邮件

时间:2011-10-10 13:44:18

标签: php codeigniter email smtp

我正在尝试使用CodeIgniter电子邮件类编写安全的SMTP电子邮件; SSL或TLS(首选)。在过去,我已经成功地将PHPMailer与Secure Auth和TLS一起使用。我相信这是一个安全的连接。 TLS显示在电子邮件标题中。

CodeIngiters的电子邮件类是否支持使用TLS进行安全的SMTP身份验证?

注意,这不是Gmail问题。我正在尝试将它与MS Exchange Server一起使用。我已经确认下面的PHPMailer代码正常运行。

include_once('includes/class.phpmailer.php');
$mail = new PHPMailer(true);
$mail->IsSMTP();
$mail->Host = 'www.domain.com';

$mail->SMTPAuth = true;
$mail->SMTPSecure = "tls";
$mail->Port     = '25';
$mail->Timeout  = '60';

$mail->Username = 'user@domain.com';
$mail->Password = 'password';

$mail->From     = 'alerts@domain.com';
$mail->FromName = 'Alerts';

$mail->Subject  = 'Test from test email file.';
$mail->IsHTML(true);
$mail->MsgHTML('This is just a test.');

// To
$mail->AddAddress('alerts@domain.com', 'Research');
$result = $mail->Send();

使用CodeIgniter,我已经扩展了电子邮件类(MY_Email.php)。这个课程在这里发布有点大。但是,这是我一直在犯的错误。

设定:

array(7) { 
["smtp_host"]=> string(26) "tls://www.domain.com" 
["smtp_port"]=> string(2) "25" 
["smtp_user"]=> string(17) "alerts@domain.com" 
["smtp_pass"]=> string(9) "password" 
["smtp_to_email"]=> string(26) "user@domain.com" 
["smtp_from_email"]=> string(26) "user@domain.com" 
["smtp_from_name"]=> string(24) "Test from Application" 
}

错误讯息:

  

fsockopen():SSL操作失败,代码为1. OpenSSL错误消息:错误:1408F10B:SSL例程:func(143):reason(267)

知道267是什么原因?

2 个答案:

答案 0 :(得分:2)

如何诊断OpenSSL错误:

查看错误消息:

error:1408F10B:SSL routines:func(143):reason(267)

获取原因代码(267)并确定错误:

grep 267 /usr/include/openssl/ssl.h
/usr/include/openssl/ssl.h:#define SSL_R_WRONG_VERSION_NUMBER                    267

现在google for SSL_R_WRONG_VERSION_NUMBER

阅读第一首内容:     http://www.mail-archive.com/openssl-dev@openssl.org/msg02770.html

"
    Many of SSL clients sends the first CLIENT HELLO with
    ssl2 format (0x80.....) because they don't know what
    version the server supports.
    In this first message, the client sends the version
    he wants to use (3 for SSL3), then the other exchanged
    messages are in the appropriate format SSL3 for V3,
    SSL2 for V2 etc....

    So in your server method configuration you must put:
      SSL_CTX *ctx = SSL_CTX_new (SSLv23_server_method())
    to correctely analyse the first client_hello message
    instead of 
      SSL_CTX *ctx = SSL_CTX_new (SSLv3_server_method())
    which i suppose you did.
"

结论:smtp-server使用SSLv3_server_method,因此需要修复以使用SSLv23。

答案 1 :(得分:2)

在CI论坛上找到解决方案。

Exchange电子邮件类补丁 http://codeigniter.com/forums/viewthread/158882/

在连接 SMTP服务器后启动TLS

为我工作。杰夫