2012-04-26 58 views
4

我讀了很多文章,誰解釋如何發送電子郵件與smtp,就像這樣Send email using GMail SMTP server from PHP page 我有一個雲服務器和本地主機設置,都是相同的(Centos 6,通過yum只安裝httpd,php和mysql)。 iptables是一樣的:輸出端口打開,輸入只有22和80.發送電子郵件與PHP腳本錯誤smtp.gmail梨Centos

我安裝了pear Mail和pear Net_SMTP以便與smtp.gmail.com一起使用。 phpinfo();顯示openssl已啓用。

我使用這個代碼:

<?php require_once "Mail.php"; 

    $from = "<from.gmail.com>"; 
    $to = "<to.yahoo.com>"; 
    $subject = "Hi!"; 
    $body = "Hi,\n\nHow are you?"; 

    $host = "ssl://smtp.gmail.com"; 
    $port = "465"; 
    $username = "<myaccount.gmail.com>"; 
    $password = "password"; 

    $headers = array ('From' => $from, 
     'To' => $to, 
     'Subject' => $subject); 
    $smtp = Mail::factory('smtp', 
     array ('host' => $host, 
     'port' => $port, 
     'auth' => true, 
     'username' => $username, 
     'password' => $password)); 

    $mail = $smtp->send($to, $headers, $body); 

    if (PEAR::isError($mail)) { 
     echo("<p>" . $mail->getMessage() . "</p>"); 
    } else { 
     echo("<p>Message successfully sent!</p>"); 
    } 

?> <!-- end of php tag--> 

在我的本地服務器腳本工作,我收到的電子郵件在我的Gmail帳戶。但在我的雲服務器上,使用相同的腳本,我得到這個錯誤:(與調試)

ErrorFailed to connect to ssl://smtp.gmail.com:465 [SMTP:無法連接套接字:權限被拒絕(代碼:-1,迴應:)]調試:發送:退出

我搜查了很多,我看到有人說465端口被阻塞時發生錯誤。

因此,我檢查我的iptables,我的連接等,輸出端口465打開。

我沒有使用測試: 的OpenSSL的s_client.First -verify 0 -connect smtp.gmail.com:465 ,我得到了這樣的結果:

verify depth is 0 
CONNECTED(00000003) 
depth=2 C = US, O = Equifax, OU = Equifax Secure Certificate Authority 
verify return:1 
depth=1 C = US, O = Google Inc, CN = Google Internet Authority 
verify return:1 
depth=0 C = US, ST = California, L = Mountain View, O = Google Inc, CN = smtp.gmail.com 
verify return:1 
--- 
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----- 
MIIDWzCCAsSgAwIBAgIKFeQVggADAAA7NjANBgkqhkiG9w0BAQUFADBGMQswCQYD 
VQQGEwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzEiMCAGA1UEAxMZR29vZ2xlIElu 
dGVybmV0IEF1dGhvcml0eTAeFw0xMTExMTgwMTU3MTdaFw0xMjExMTgwMjA3MTda 
MGgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1N 
b3VudGFpbiBWaWV3MRMwEQYDVQQKEwpHb29nbGUgSW5jMRcwFQYDVQQDEw5zbXRw 
LmdtYWlsLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuK+t5ZRq6c3K 
kWPwLuIcPa6DgiBURaQK9akP4OBoXKJ6bqYIQWsS4C3RgnOaGaDENadxHSNZ5Qpl 
Vqg2S54N54SM5OXwOq0NtrqdlbhgigB53TZouiJvnLDxxIexSOn2Gx1qyZF2z8Ii 
MoUhHuStWgW5YoOHje8z6K9xQdYkQp0CAwEAAaOCASwwggEoMB0GA1UdDgQWBBTs 
OL4jbtJ5l8B6/eoEvv30KEiTrjAfBgNVHSMEGDAWgBS/wDDr9UMRPme6npH7/Gra 
42sSJDBbBgNVHR8EVDBSMFCgTqBMhkpodHRwOi8vd3d3LmdzdGF0aWMuY29tL0dv 
b2dsZUludGVybmV0QXV0aG9yaXR5L0dvb2dsZUludGVybmV0QXV0aG9yaXR5LmNy 
bDBmBggrBgEFBQcBAQRaMFgwVgYIKwYBBQUHMAKGSmh0dHA6Ly93d3cuZ3N0YXRp 
Yy5jb20vR29vZ2xlSW50ZXJuZXRBdXRob3JpdHkvR29vZ2xlSW50ZXJuZXRBdXRo 
b3JpdHkuY3J0MCEGCSsGAQQBgjcUAgQUHhIAVwBlAGIAUwBlAHIAdgBlAHIwDQYJ 
KoZIhvcNAQEFBQADgYEAQiMlHuQLRFqR10UsSg5WTNe3vagbdnBLAkdhvAf90B5a 
9beBxJH2/ylTSIGfD2uceAqzcsQe6Ouy4C9r3rz86qA1dhdtIcPg6uoZb+E2qhE5 
UaOJOPO4rHInX9kscBxh+baHbpBMh+ch6v5L8plss8hd0id8C4g10YKzwcgPYlQ= 
-----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 1850 bytes and written 299 bytes 
--- 
New, TLSv1/SSLv3, Cipher is RC4-SHA 
Server public key is 1024 bit 
Secure Renegotiation IS supported 
Compression: NONE 
Expansion: NONE 
SSL-Session: 
    Protocol : TLSv1 
    Cipher : RC4-SHA 
    Session-ID: 55E90A8854BB04C962AB8AD7D231C89291E62B28EC93F4189CFD512B2EFD43B6 
    Session-ID-ctx: 
    Master-Key: C454B3ED7E5C522B745F0E2EBF45BDEADFAD2CE29ECE945C1CA6EBA1629921577FEECFF968D896E39CF4E0057731CD26 
    Key-Arg : None 
    Krb5 Principal: None 
    PSK identity: None 
    PSK identity hint: None 
    TLS session ticket lifetime hint: 100800 (seconds) 
    TLS session ticket: 
    0000 - 75 be ab 14 ff bf e3 74-61 4f 98 e6 ec 58 ae ab u......taO...X.. 
    0010 - 50 2f 20 f5 12 14 ae b5-11 dd 2c c1 9e 99 36 b1 P/ .......,...6. 
    0020 - 9a 66 5b 76 15 c8 0e 7f-07 ce ce e1 4c b3 f4 12 .f[v........L... 
    0030 - 38 c8 43 2d a2 c7 f9 62-17 4f da 82 4f 4b 12 93 8.C-...b.O..OK.. 
    0040 - af 31 9e d5 90 8d 3e 4c-06 d6 73 30 fb b6 95 80 .1....>L..s0.... 
    0050 - 59 1c 65 e3 d3 51 2e a7-48 15 11 ba 9f 72 89 12 Y.e..Q..H....r.. 
    0060 - 9a 68 63 df 65 22 0f cb-60 b7 cf 3c b4 c6 f9 92 .hc.e"..`..<.... 
    0070 - a0 c1 34 d7 06 31 97 ef-e6 8a bf b8 14 d9 72 b0 ..4..1........r. 
    0080 - 13 d9 dd df ce 48 a1 83-74 53 d6 fe b0 5a 53 a1 .....H..tS...ZS. 
    0090 - ee d0 9e b3          .... 

    Start Time: 1335462088 
    Timeout : 300 (sec) 
    Verify return code: 0 (ok) 
--- 

所以,我認爲問題不與「封鎖的港口」有關係。 我也試過端口587 ...

我發送一條消息給我的主機詢問ISP是否可以阻止這些端口,他們告訴我他們不阻止任何端口,客戶端(我)完全控制服務器。

我不知道什麼更多可以導致這個錯誤,我現在可以做什麼。 也許一些配置文件我沒有看到。

任何人有一些建議,以幫助我或建議更多的測試我可以做得到更多的信息,爲什麼我得到這個錯誤,並解決這個問題?

感謝

回答

3

您可以檢查應用程序的盔甲或SELinux的活躍在您的系統。要禁用應用程序的盔甲:

AppArmor can be disabled, and the kernel module unloaded by entering the following:

sudo /etc/init.d/apparmor stop

sudo update-rc.d -f apparmor remove

reboot

禁用SELinux:

edit /etc/selinux/config and change the SELINUX line to SELINUX=disabled

reboot

以上的更簡潔的方法(SELINUX):

/usr/sbin/setsebool httpd_can_network_connect=1

reboot

+0

謝謝Superbiji,這正是我需要的。我忘了SELINUX,它阻止了我的apache用戶。我禁用它,一切正常。非常感謝,我試圖投票,但說我不能,因爲我沒有聲譽 – xbrpiatto 2012-04-26 21:28:04

2

請確保您有沒有註釋;延長= php_openssl.dll手段在php.ini文件中刪除分號。如果你沒有找到這行比複製「擴展= p​​hp_openssl.dll」並將其粘貼到您的PHP。ini文件

+0

不要像這樣包含到您的網站的鏈接;它不直接與問題的主題相關,並且你沒有表明它是你自己的博客。 – 2012-11-26 14:44:24

0

航站樓(不重新啓動)輸入這個命令需要將設置的SELinux再到允許(它只會提醒它不會停止的過程,也無需重新啓動)

setenforce 0 

,並很驗證您可以選擇

getenforce 

,如果要禁用,你可以做到這一點

edit /etc/selinux/config 
or 
gedit /etc/selinux/config 
or 
vi /etc/selinux/config 

,改變你的文件到這個

# This file controls the state of SELinux on the system. 
# SELINUX= can take one of these three values: 
#  enforcing - SELinux security policy is enforced. 
#  permissive - SELinux prints warnings instead of enforcing. 
#  disabled - No SELinux policy is loaded. 
SELINUX=disabled 
# SELINUXTYPE= can take one of these two values: 
#  targeted - Targeted processes are protected, 
#  minimum - Modification of targeted policy. Only selected processes are protected. 
#  mls - Multi Level Security protection. 
SELINUXTYPE=targeted 

謝謝:)