【问题标题】:CodeIgniter and Gmail SMTP Timeout with SSL scoketCodeIgniter 和 Gmail SMTP 超时与 SSL 套接字
【发布时间】:2011-03-26 06:36:16
【问题描述】:

我使用 Gmail SMTP 从我使用 CodeIgniter 和 PHP 5.3 编写的 Web 应用程序发送电子邮件,直到最近都没有问题。这是我的代码的 sn-p:

  $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.3 中使用tls 吗?如果是,可以 你给我看代码,我可以把 将其放入 CodeIgniter 并进行测试。

谢谢。

【问题讨论】:

    标签: php smtp gmail ssl


    【解决方案1】:

    根据 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/

    也许你也可以试试那个脚本。

    【讨论】:

    • 我在上面的问题中写道,在我升级到 PHP 5.3 之前,该脚本在我的本地主机中运行良好。同样未更改的脚本也适用于我的 Dreamhost 托管。 CodeIgniter 内部使用的是 fsockopen,可以从日志错误信息中看到。
    【解决方案2】:

    如果您是从 Google.com 访问此页面以查找有关安全 SMTP 电子邮件的更多详细信息,请在 CI 论坛上查看此补丁。

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

    我的 SMTP 提供程序(Exchange 系统)不接受 SSL 连接,而是需要使用 SMTP over TLS(STARTTLS,RFC 3207)。这是 Email 类的一个小补丁,增加了对它的支持。它是针对 1.7.2 编写的。如果这对其他人有用,欢迎您将其合并到未来的版本中。

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

    取决于 TLS 是否可用(即,列在 phpinfo() 的“Registered Stream Socket Transports”部分)。

    【讨论】:

    • 感谢您的信息。当我有时间做一些实验时,我会尝试它。
    • 有同样的问题和 'smtp_timeout' => 30,这很好用
    猜你喜欢
    • 2016-10-26
    • 2012-06-01
    • 2012-06-01
    • 1970-01-01
    • 2013-11-24
    • 2013-03-03
    • 2010-12-04
    • 2013-05-14
    • 1970-01-01
    相关资源
    最近更新 更多