2010-08-06 2 views
3

Я использую Gmail SMTP для отправки электронной почты из веб-приложения, которое я написал с помощью CodeIgniter с PHP 5.3 без проблем до недавнего времени. Это фрагмент моего кода:Тайм-аут SMTP-протокола CodeIgniter и Gmail

$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, тот же код работал нормально. Если это проблема межсетевого экрана или интернет-соединения, я все равно могу отправить электронное письмо с помощью gmail smtp в Thunderbird.

После того как я, глядя на различных форумах, я получил советы, чтобы сделать этот тест:

$ 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. Во-вторых, можно использовать tls в PHP 5.3? Если да, может вы покажете мне код, поэтому я могу поместить в 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 внутри, вы можете увидеть его из сообщения об ошибке журнала. –

1

Если вы зашли на эту страницу с сайта Google.com, ища более подробную информацию о защищенной электронной почте SMTP, ознакомьтесь с этим патчем на форумах CI.

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

Мой провайдер SMTP (система Exchange) не принимает SSL соединений и требует использования SMTP через TLS вместо (STARTTLS, RFC 3207). Вот небольшой патч к классу электронной почты, который добавляет поддержку для него. Это написано против 1.7.2. Если это полезно для других, вы можете включить его в будущую версию.

Использование: Укажите настройки сервера как обычный SMTP-сервер (tcp: // имя_сервера, обычно порт 25 или 587). Включить новую настройку в config ($ config ['starttls'] = TRUE;)

Зависит от TLS, доступного (т. Е. В списке в разделе «Зарегистрированный поток Socket Transports» в phpinfo()).

+0

Спасибо за информацию. Я попробую, когда у меня найдется время для эксперимента. –

+2

Если бы такая же проблема и «smtp_timeout» => 30, это отлично работает – user481610

Смежные вопросы