2010-08-06 100 views
3

我使用Gmail SMTP从Web应用程序发送电子邮件,直到最近,我用PHP 5.3使用CodeIgniter编写了这些电子邮件。这是我的代码片段:带有SSL scoket的CodeIgniter和Gmail SMTP超时

$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(); 

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

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 

我不知道这是否有关,但在我将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 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 

测试ssl连接给我超时:

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

我尝试使用"tls://smtp.gmail.com"作为主机和587作为我的代码上面的端口,但现在我收到此错误消息:

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. 你能帮我找出什么是 事业的连接超时时 我尝试连接到 ssl://smtp.gmail.com:465
  2. 其次, 我可以用在PHP 5.3tls?如果是的话,你可以给我看代码,所以我可以把 它放到CodeIgniter中进行测试。

感谢。

回答

0

根据PHP文档SSL和TLS都在版本4.3中添加。

http://de2.php.net/manual/de/function.fsockopen.php

因此,他们应该在一般的工作。

我发现这是和它的工作对我来说:

http://tareq.wedevs.com/2010/01/sending-mail-with-gmails-smtp-server-with-fsockopen/

也许你可以试试这个脚本了。

+0

我在上面说的剧本在我的本地主机之前,我升级到PHP 5.3工作得很好,我的问题写。同样不变的脚本也在我的Dreamhost托管中起作用。 CodeIgniter在内部使用fsockopen,你可以从日志错误消息中看到它。 – 2010-08-07 10:33:42

1

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

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

我的SMTP提供商(交易系统)不接受SSL连接,并需要通过TLS使用SMTP,而不是(STARTTLS,RFC 3207)。这是电子邮件类的一个小补丁,它增加了对它的支持。它是针对1.7.2写的。如果这对其他人有用,则欢迎您将其加入未来版本。

用法: 指定服务器设置作为普通SMTP服务器(TCP://服务器,典型端口25或587)。 在配置中启用新的设置($ config ['starttls'] = TRUE;)

取决于TLS可用(即在phpinfo()的'Registered Stream Socket Transports'部分列出)。

+0

感谢您的信息。当我有时间做一些实验时,我会尝试一下。 – 2011-10-12 09:52:15

+2

有同样的问题和'smtp_timeout'=> 30,这完美的作品 – user481610 2013-05-03 07:48:12