2013-03-21 74 views
3

我對PHP相當陌生,最近我嘗試使用郵件功能,但它不起作用。這裏是我的代碼:使用php發送郵件不起作用

<?php 

// Pick up the form data and assign it to variables 
$name = $_POST['name']; 
$email = $_POST['email']; 
$topic = $_POST['topic']; 
$comments = $_POST['comments']; 

// Build the email (replace the address in the $to section with your own) 

$to = '[email protected]'; 
$subject = "New message: $topic"; 
$message = "$name said: $comments"; 
$headers = "From: $email"; 

// Send the mail using PHPs mail() function 
if(mail($to, $subject, $message, $headers)) header("Location:../forms/success.html"); 
else header("Location:../forms/failure.html"); 
?> 

我將sendmail的路徑添加到php.ini文件,但它仍然不起作用。郵件功能總是返回true,但我沒有收到任何郵件。 mail.log顯示了一堆超時。這裏有一些輸出:

postfix/qmgr[3523]: BB800B124A: from=<[email protected]>, size=382, nrcpt=1 (queue active) 
postfix/qmgr[3523]: CB34EB0E9F: from=<[email protected]>, size=405, nrcpt=1 (queue active) 
postfix/qmgr[3523]: D6C18B0D7B: from=<[email protected]>, size=394, nrcpt=1 (queue active) 
postfix/smtp[3527]: connect to gmail-smtp-in.l.google.com[2607:f8b0:400e:c01::1b]:25: No route to host 
postfix/smtp[3533]: connect to gmail-smtp-in.l.google.com[2607:f8b0:400e:c01::1b]:25: No route to host 
postfix/pickup[3522]: 8A9EEB1823: uid=70 from=<_www> 
postfix/cleanup[3524]: 8A9EEB1823: message-id=<[email protected]> 
postfix/qmgr[3523]: 8A9EEB1823: from=<[email protected]>, size=392, nrcpt=1 (queue active) 
postfix/smtp[3526]: connect to mx3.hotmail.com[65.55.37.72]:25: Operation timed out 
postfix/smtp[3531]: connect to gmail-smtp-in.l.google.com[74.125.141.27]:25: Operation timed out 
postfix/smtp[3531]: connect to gmail-smtp-in.l.google.com[2607:f8b0:400e:c01::1b]:25: No route to host 
postfix/smtp[3531]: connect to alt1.gmail-smtp-in.l.google.com[2607:f8b0:400e:c02::1b]:25: No route to host 
+1

驗證出站郵件端口(端口25)是否在防火牆中未被阻止。 – 2013-03-21 19:39:12

+2

檢查您正在嘗試使用本地Web服務器的php.ini – Fiarr 2013-03-21 19:39:32

+0

中的smtp設置? – Nikitas 2013-03-21 19:46:18

回答

0

你可以發佈你的php.ini smtp部分?

如果您使用的是GMail(它看起來像您......),您將需要使用SSL/TLS,我不知道PHP是否本機支持SMTP。您可以使用Sendmail的轉發器並在未加密的情況下在本地發送它,然後讓Sendmail通過TLS在Gmail上轉發它。

您可能要考慮使用PHPMailer等第三方解決方案。它支持Gmail的SSL/TLS,看看這個例子:

http://phpmailer.worxware.com/index.php?pg=examplebgmail

您可以從下載的PHPMailer:

http://sourceforge.net/projects/phpmailer/

這裏是爲PHPMailer的另一個教程:

http://phpmailer.worxware.com/index.php?pg=tutorial#2

編輯:正如馬克說,你的ISP可能會阻止outboun d端口25. Gmail還支持端口465上的SMTP(但同樣需要TLS)。

+0

感謝您的幫助亞當... – Tishpr 2013-05-24 10:44:58

0

看起來您的ISP和/或您的網絡/主機的防火牆可能不允許出站SMTP連接。沒有理由你應該看到有關操作超時的錯誤沒有路由到主機

+0

好吧 - 我會檢查出來 – Tishpr 2013-03-21 22:44:49

0

這裏有幾個可能的原因:

  1. 你的ISP(Verizon公司,AT & T,Comcast公司,或學校等)阻止出站端口(防止垃圾郵件和網絡攻擊)。

這是最可能的情況。基本上,你不能將電子郵件作爲家庭網絡上的電子郵件「主機」發送。你可以通過gmail或其他SMTP服務器設置中繼服務器,但最近ISP變得更聰明,同時也阻止了中繼請求(是的,他們確實讀取了你發送或接收的每個數據)。

所以,我的建議是:如果這是你想做的事情,那就付出一個安全的VPN。

  1. 您不在家庭網絡中,但您中繼服務器/路由器會阻止您的出站請求。您必須找到一種方法在防火牆中轉發您的端口。根據路由器或中繼服務器的操作系統/固件,可能有數百萬種不同的方式來轉發您的端口。或者你可以完全關閉防火牆。

  2. 它完全沒有你的手。您的IP被標記爲垃圾郵件(很可能是某人偷走了您的IP並將其用於網絡攻擊)。你將不得不改變你的IP(或支付一個安全的VPN)。