带有SSL scoket的CodeIgniter和Gmail SMTP超时 [英] CodeIgniter and Gmail SMTP Timeout with SSL scoket

查看:202
本文介绍了带有SSL scoket的CodeIgniter和Gmail SMTP超时的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用Gmail SMTP从Web应用程序发送电子邮件,而这些电子邮件是直到最近才使用CodeIgniter与PHP 5.3编写的。这是我的代码片段:

  $ config ['protocol'] ='smtp'; 
$ config ['smtp_host'] = $ this-> smtp_host;
$ config ['smtp_port'] = $ this-> smtp_port;
$ config ['smtp_user'] = $ this-> smtp_username;
$ config ['smtp_pass'] = $ this-> smtp_password;
$ config ['mailtype'] = $ this-> email_type;
$ config ['newline'] =\r\\\
;
$ this-> load->库('email',$ config);

$ this-> email-> from($ email_sender,$ email_sender_name);
$ this->电子邮件 - >到($ email_to);
$ this-> email->主题($ message_subject);
$ this-> email->消息($ message_content);
$ result = $ this-> email-> send();

当我使用ssl://smtp.gmail.com作为主机, 465 作为端口,我在日志中得到这个错误:

  DEBUG  -  2010-08-06 17:19:24  - >电子邮件类初始化
错误 - 2010-08-06 17:19:45 - >严重性:警告 - > fsockopen():无法连接到ssl://smtp.googlemail.com:465(连接超时)/data/donny/Projects/workspace/codeigniter/libraries/Email.php 1652
DEBUG - 2010-08 -06 17:19:45 - >加载语言文件:language / english / email_lang.php
ERROR - 2010-08-06 17:19:45 - >严重性:警告 - > fwrite()期望参数1是资源,布尔给定/data/donny/Projects/workspace/codeigniter/libraries/Email.php 1795
ERROR - 2010-08-06 17:19:45 - >严重性:警告 - > fgets()期望参数1是资源,布尔给定/data/donny/Projects/workspace/codeigniter/libraries/Email.php 1818
ERROR - 2010-08-06 17:19:45 - >严重性:警告 - > fwrite()期望参数1是资源,布尔给定/data/donny/Projects/workspace/codeigniter/libraries/Email.php 1795
ERROR - 2010-08-06 17:19:45 - >严重性:警告 - > fgets()期望参数1是资源,布尔给定/data/donny/Projects/workspace/codeigniter/libraries/Email.php 1818
ERROR - 2010-08-06 17:19:45 - >严重性:警告 - > fwrite()期望参数1是资源,布尔给定/data/donny/Projects/workspace/codeigniter/libraries/Email.php 1795
ERROR - 2010-08-06 17:19:45 - >严重性:警告 - > fgets()期望参数1是资源,布尔给定/data/donny/Projects/workspace/codeigniter/libraries/Email.php 1818
ERROR - 2010-08-06 17:19:45 - >严重性:警告 - > fwrite()期望参数1是资源,布尔给定/data/donny/Projects/workspace/codeigniter/libraries/Email.php 1795
ERROR - 2010-08-06 17:19:45 - >严重性:警告 - > fgets()期望参数1是资源,布尔给定/data/donny/Projects/workspace/codeigniter/libraries/Email.php 1818
ERROR - 2010-08-06 17:19:45 - >严重性:警告 - > fwrite()期望参数1是资源,布尔给定/data/donny/Projects/workspace/codeigniter/libraries/Email.php 1795
ERROR - 2010-08-06 17:19:45 - >严重性:警告 - > fwrite()期望参数1是资源,布尔给定/data/donny/Projects/workspace/codeigniter/libraries/Email.php 1795
ERROR - 2010-08-06 17:19:45 - >严重性:警告 - > fgets()期望参数1是资源,布尔给定/data/donny/Projects/workspace/codeigniter/libraries/Email.php 1818

我不知道这是否相关,但在将我的PHP升级到 PHP 5.3 之前,相同的代码工作得很好。如果这是防火墙或互联网连接问题,我仍然可以使用Thunderbird中的gmail smtp发送电子邮件。



在我查看各种论坛后,我得到了一个提示测试:

  $ openssl s_client -starttls smtp -crlf -connect smtp.gmail.com:587 
CONNECTED(00000003 )
depth = 1 / C = US / O = Google Inc / CN = Google互联网管理局
验证错误:num = 20:无法获得本地发行者证书
验证回报:0
---
证书链
0 s:/ C = US / ST = California / L = Mountain View / O = Google Inc / CN = smtp.gmail.com
i:/ C = US / O = Google Inc / CN = Google互联网管理局
1 s:/ C = US / O = Google Inc / CN = Google互联网管理局
i:/ C = US / O = Equifax / OU = Equifax安全认证中心
---
服务器证书
----- BEGIN CERTIFICATE -----
...剪切...
----- END CERTIFICATE -----
subject = / C = US / ST = California / L = Mountain View / O = Google Inc / CN = smtp.gmail.com
issuer = / C = US / O = Google Inc / CN = Google Internet Autho rity
---
未发送客户端证书CA名称
---
SSL握手已读取1901个字节并写入335个字节
---
新的TLSv1 / SSLv3,Cipher是RC4-MD5
服务器公钥是1024位
压缩:NONE
扩展:NONE
SSL-Session:
协议:TLSv1
密码:RC4,MD5
会话ID:2CA08CABBE21653238292DEDF30D119428970FAA284263C92480DA5283AFE013
会话ID-CTX:
主密钥:B3F6D4423DC14E24E894D7AD7107B4A640839F2BF90233714EC5BF0D139611E65655902B50AEA3BD67373A21338526B0
键精氨酸:无
开始时间:1281086948
超时:300(秒)
验证返回码:20(无法获得本地发行者证书)
---
250 ENHANCEDSTATUSCODES

同时使用相同的工具来测试 ssl 连接给我超时:

  $ openssl s_client -ssl2 -crlf -connect smtp.gmail.com:465 
connect:连接超时
连接:errno = 110

我尝试使用tls:// smtp。 gmail.com作为主机,并且 587 作为上面代码中的端口,但现在我收到以下错误消息:

  DEBUG  -  2010-08-06 17:26:10  - >电子邮件类初始化
错误 - 2010-08-06 17:26:10 - >严重性:警告 - > fsockopen():SSL操作失败,代码为1. OpenSSL错误消息:
错误:1408F10B:SSL例程:SSL3_GET_RECORD:错误的版本号/data/donny/Projects/workspace/codeigniter/libraries/Email.php 1652
ERROR - 2010-08-06 17:26:10 - >严重性:警告 - > fsockopen():无法启用加密/data/donny/Projects/workspace/codeigniter/libraries/Email.php 1652
ERROR - 2010-08-06 17:26:10 - >严重性:警告 - > fsockopen():无法连接到tls://smtp.googlemail.com:587(未知错误)/data/donny/Projects/workspace/codeigniter/libraries/Email.php 1652
DEBUG - 2010-08- 06 17:26:10 - >加载的语言文件:language / english / email_lang.php
ERROR - 2010-08-06 17:26:10 - >严重性:警告 - > fwrite()期望参数1是资源,布尔给定/data/donny/Projects/workspace/codeigniter/libraries/Email.php 1795
ERROR - 2010-08-06 17:26:10 - >严重性:警告 - > fgets()期望参数1是资源,布尔给定/data/donny/Projects/workspace/codeigniter/libraries/Email.php 1818
ERROR - 2010-08-06 17:26:10 - >严重性:警告 - > fwrite()期望参数1是资源,布尔给定/data/donny/Projects/workspace/codeigniter/libraries/Email.php 1795
ERROR - 2010-08-06 17:26:10 - >严重性:警告 - > fgets()期望参数1是资源,布尔给定/data/donny/Projects/workspace/codeigniter/libraries/Email.php 1818
ERROR - 2010-08-06 17:26:10 - >严重性:警告 - > fwrite()期望参数1是资源,布尔给定/data/donny/Projects/workspace/codeigniter/libraries/Email.php 1795
ERROR - 2010-08-06 17:26:10 - >严重性:警告 - > fgets()期望参数1是资源,布尔给定/data/donny/Projects/workspace/codeigniter/libraries/Email.php 1818
ERROR - 2010-08-06 17:26:10 - >严重性:警告 - > fwrite()期望参数1是资源,布尔给定/data/donny/Projects/workspace/codeigniter/libraries/Email.php 1795
ERROR - 2010-08-06 17:26:10 - >严重性:警告 - > fgets()期望参数1是资源,布尔给定/data/donny/Projects/workspace/codeigniter/libraries/Email.php 1818
ERROR - 2010-08-06 17:26:10 - >严重性:警告 - > fwrite()期望参数1是资源,布尔给定/data/donny/Projects/workspace/codeigniter/libraries/Email.php 1795
ERROR - 2010-08-06 17:26:10 - >严重性:警告 - > fwrite()期望参数1是资源,布尔给定/data/donny/Projects/workspace/codeigniter/libraries/Email.php 1795
ERROR - 2010-08-06 17:26:10 - >严重性:警告 - > fgets()期望参数1是资源,布尔给定/data/donny/Projects/workspace/codeigniter/libraries/Email.php 1818





  1. 尝试连接到
    <$时,您能帮助我找出
    导致连接超时的原因吗? c $ c> ssl://smtp.gmail.com:465

  2. 其次,
    可以使用 tls PHP 5.3中?如果是的话,可以
    给我看代码,所以我可以把
    放入CodeIgniter并测试它。

感谢。

解决方案

如果您从Google.com访问此页面以查找有关Secure SMTP电子邮件的更多详细信息,请在CI论坛中查看此修补程序。



http://codeigniter.com/forums/viewthread/158882/



我的SMTP提供程序(Exchange系统)不接受SSL连接并需要使用而不是TLS上的SMTP(STARTTLS,RFC 3207)。这是电子邮件类的一个小补丁,它增加了对它的支持。它是针对1.7.2写的。如果这对其他用户有帮助,则欢迎您将其发布到未来版本中。



用法:
将服务器设置指定为常规SMTP服务器tcp:// servername,通常是端口25或587)。
在配置中启用新设置($ config ['starttls'] = TRUE;)

取决于TLS的可用性(即列在'注册码流SocketTransport'部分的phpinfo())。


I use Gmail SMTP to send email from the web application that I wrote using CodeIgniter with PHP 5.3 without a problems until recently. This is the snippet of my code:

  $config['protocol']   = 'smtp';
  $config['smtp_host']  = $this->smtp_host;
  $config['smtp_port']  = $this->smtp_port;
  $config['smtp_user']  = $this->smtp_username;
  $config['smtp_pass']  = $this->smtp_password;
  $config['mailtype']   = $this->email_type;
  $config['newline'] = "\r\n";
  $this->load->library('email', $config);

  $this->email->from($email_sender, $email_sender_name);
  $this->email->to($email_to);
  $this->email->subject($message_subject);
  $this->email->message($message_content);
  $result = $this->email->send();

When I use "ssl://smtp.gmail.com" as host and 465 as port, I got this error in log:

DEBUG - 2010-08-06 17:19:24 --> Email Class Initialized
ERROR - 2010-08-06 17:19:45 --> Severity: Warning  --> fsockopen(): unable to connect to ssl://smtp.googlemail.com:465 (Connection timed out) /data/donny/Projects/workspace/codeigniter/libraries/Email.php 1652
DEBUG - 2010-08-06 17:19:45 --> Language file loaded: language/english/email_lang.php
ERROR - 2010-08-06 17:19:45 --> Severity: Warning  --> fwrite() expects parameter 1 to be resource, boolean given /data/donny/Projects/workspace/codeigniter/libraries/Email.php 1795
ERROR - 2010-08-06 17:19:45 --> Severity: Warning  --> fgets() expects parameter 1 to be resource, boolean given /data/donny/Projects/workspace/codeigniter/libraries/Email.php 1818
ERROR - 2010-08-06 17:19:45 --> Severity: Warning  --> fwrite() expects parameter 1 to be resource, boolean given /data/donny/Projects/workspace/codeigniter/libraries/Email.php 1795
ERROR - 2010-08-06 17:19:45 --> Severity: Warning  --> fgets() expects parameter 1 to be resource, boolean given /data/donny/Projects/workspace/codeigniter/libraries/Email.php 1818
ERROR - 2010-08-06 17:19:45 --> Severity: Warning  --> fwrite() expects parameter 1 to be resource, boolean given /data/donny/Projects/workspace/codeigniter/libraries/Email.php 1795
ERROR - 2010-08-06 17:19:45 --> Severity: Warning  --> fgets() expects parameter 1 to be resource, boolean given /data/donny/Projects/workspace/codeigniter/libraries/Email.php 1818
ERROR - 2010-08-06 17:19:45 --> Severity: Warning  --> fwrite() expects parameter 1 to be resource, boolean given /data/donny/Projects/workspace/codeigniter/libraries/Email.php 1795
ERROR - 2010-08-06 17:19:45 --> Severity: Warning  --> fgets() expects parameter 1 to be resource, boolean given /data/donny/Projects/workspace/codeigniter/libraries/Email.php 1818
ERROR - 2010-08-06 17:19:45 --> Severity: Warning  --> fwrite() expects parameter 1 to be resource, boolean given /data/donny/Projects/workspace/codeigniter/libraries/Email.php 1795
ERROR - 2010-08-06 17:19:45 --> Severity: Warning  --> fwrite() expects parameter 1 to be resource, boolean given /data/donny/Projects/workspace/codeigniter/libraries/Email.php 1795
ERROR - 2010-08-06 17:19:45 --> Severity: Warning  --> fgets() expects parameter 1 to be resource, boolean given /data/donny/Projects/workspace/codeigniter/libraries/Email.php 1818

I don't know if this related, but before I upgrade my PHP into PHP 5.3, the same code worked just fine. If this is the firewall or internet connection problems, I can still send email using gmail smtp in Thunderbird.

After I looking in various forums, I got a tips to do this test:

$ openssl s_client -starttls smtp -crlf -connect smtp.gmail.com:587
CONNECTED(00000003)
depth=1 /C=US/O=Google Inc/CN=Google Internet Authority
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=smtp.gmail.com
   i:/C=US/O=Google Inc/CN=Google Internet Authority
 1 s:/C=US/O=Google Inc/CN=Google Internet Authority
   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
---
Server certificate
-----BEGIN CERTIFICATE-----
...cut...
-----END CERTIFICATE-----
subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=smtp.gmail.com
issuer=/C=US/O=Google Inc/CN=Google Internet Authority
---
No client certificate CA names sent
---
SSL handshake has read 1901 bytes and written 335 bytes
---
New, TLSv1/SSLv3, Cipher is RC4-MD5
Server public key is 1024 bit
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : RC4-MD5
    Session-ID: 2CA08CABBE21653238292DEDF30D119428970FAA284263C92480DA5283AFE013
    Session-ID-ctx: 
    Master-Key: B3F6D4423DC14E24E894D7AD7107B4A640839F2BF90233714EC5BF0D139611E65655902B50AEA3BD67373A21338526B0
    Key-Arg   : None
    Start Time: 1281086948
    Timeout   : 300 (sec)
    Verify return code: 20 (unable to get local issuer certificate)
---
250 ENHANCEDSTATUSCODES

while using same tool to test ssl connection give me timeout:

$ openssl s_client -ssl2 -crlf -connect smtp.gmail.com:465
connect: Connection timed out
connect:errno=110

I try to use "tls://smtp.gmail.com" as host and 587 as port in my code above, but now I get this error message:

DEBUG - 2010-08-06 17:26:10 --> Email Class Initialized
ERROR - 2010-08-06 17:26:10 --> Severity: Warning  --> fsockopen(): SSL operation failed with code 1. OpenSSL Error messages:
error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number /data/donny/Projects/workspace/codeigniter/libraries/Email.php 1652
ERROR - 2010-08-06 17:26:10 --> Severity: Warning  --> fsockopen(): Failed to enable crypto /data/donny/Projects/workspace/codeigniter/libraries/Email.php 1652
ERROR - 2010-08-06 17:26:10 --> Severity: Warning  --> fsockopen(): unable to connect to tls://smtp.googlemail.com:587 (Unknown error) /data/donny/Projects/workspace/codeigniter/libraries/Email.php 1652
DEBUG - 2010-08-06 17:26:10 --> Language file loaded: language/english/email_lang.php
ERROR - 2010-08-06 17:26:10 --> Severity: Warning  --> fwrite() expects parameter 1 to be resource, boolean given /data/donny/Projects/workspace/codeigniter/libraries/Email.php 1795
ERROR - 2010-08-06 17:26:10 --> Severity: Warning  --> fgets() expects parameter 1 to be resource, boolean given /data/donny/Projects/workspace/codeigniter/libraries/Email.php 1818
ERROR - 2010-08-06 17:26:10 --> Severity: Warning  --> fwrite() expects parameter 1 to be resource, boolean given /data/donny/Projects/workspace/codeigniter/libraries/Email.php 1795
ERROR - 2010-08-06 17:26:10 --> Severity: Warning  --> fgets() expects parameter 1 to be resource, boolean given /data/donny/Projects/workspace/codeigniter/libraries/Email.php 1818
ERROR - 2010-08-06 17:26:10 --> Severity: Warning  --> fwrite() expects parameter 1 to be resource, boolean given /data/donny/Projects/workspace/codeigniter/libraries/Email.php 1795
ERROR - 2010-08-06 17:26:10 --> Severity: Warning  --> fgets() expects parameter 1 to be resource, boolean given /data/donny/Projects/workspace/codeigniter/libraries/Email.php 1818
ERROR - 2010-08-06 17:26:10 --> Severity: Warning  --> fwrite() expects parameter 1 to be resource, boolean given /data/donny/Projects/workspace/codeigniter/libraries/Email.php 1795
ERROR - 2010-08-06 17:26:10 --> Severity: Warning  --> fgets() expects parameter 1 to be resource, boolean given /data/donny/Projects/workspace/codeigniter/libraries/Email.php 1818
ERROR - 2010-08-06 17:26:10 --> Severity: Warning  --> fwrite() expects parameter 1 to be resource, boolean given /data/donny/Projects/workspace/codeigniter/libraries/Email.php 1795
ERROR - 2010-08-06 17:26:10 --> Severity: Warning  --> fwrite() expects parameter 1 to be resource, boolean given /data/donny/Projects/workspace/codeigniter/libraries/Email.php 1795
ERROR - 2010-08-06 17:26:10 --> Severity: Warning  --> fgets() expects parameter 1 to be resource, boolean given /data/donny/Projects/workspace/codeigniter/libraries/Email.php 1818

  1. Can you help me find out what the cause of connection time out when I'm try to connect to ssl://smtp.gmail.com:465
  2. Second, can I use tls in PHP 5.3? If yes, can you show me the code, so I can put it into CodeIgniter and test it.

Thanks.

解决方案

If you've come to this page from Google.com looking for more details on Secure SMTP email, check out this patch at the CI Forums.

http://codeigniter.com/forums/viewthread/158882/

My SMTP provider (Exchange system) doesn’t accept SSL connections and requires the use of SMTP over TLS instead (STARTTLS, RFC 3207). Here is a small patch to the Email class which adds support for it. It is written against 1.7.2. If this is useful to others, you’re most welcome to incorporate it in a future release.

Usage: Specify server settings as a regular SMTP server (tcp://servername, typically port 25 or 587). Enable new setting in config ($config[‘starttls’] = TRUE;)

Depends on TLS being available (i.e., listed in the ‘Registered Stream Socket Transports’ section of phpinfo()).

这篇关于带有SSL scoket的CodeIgniter和Gmail SMTP超时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆