2013-06-19 93 views
3

這是我的問題,PHP mail()函數返回true,但沒有消息

我有一個簡單的PHP腳本發送電子郵件與汞郵件服務器爲localhost,並與Mozilla Thunderbird中閱讀。這是工作。

然後,我將XAMPP版本升級到1.8.1,我的函數返回true,但沒有發送電子郵件。

<?php 
$to = "[email protected]"; 
$subject = "Hi!"; 
$body="test"; 

$headers = "From: [email protected]"; 

if (mail($to, $subject, $body, $headers)) { 
    echo "Message successfully sent!"; 
} else { 
    echo "Message delivery failed..."; 
} 
?> 

我試圖用雷鳥發送電子郵件至[email protected]和它的工作。

所以II嘗試在php.ini更改郵件功能,這可是不行

[mail function] 
    ; XAMPP: Comment out this if you want to work with an SMTP Server like Mercury 
    SMTP = localhost 
    smtp_port = 25 

    ; For Win32 only. 
    ; http://php.net/sendmail-from 
    sendmail_from = [email protected] 

    ; XAMPP IMPORTANT NOTE (1): If XAMPP is installed in a base directory with spaces (e.g. c:\program filesC:\xampp) fakemail and mailtodisk do not work correctly. 
    ; XAMPP IMPORTANT NOTE (2): In this case please copy the sendmail or mailtodisk folder in your root folder (e.g. C:\sendmail) and use this for sendmail_path. 

    ; XAMPP: Comment out this if you want to work with fakemail for forwarding to your mailbox (sendmail.exe in the sendmail folder) 
    sendmail_path = "\"C:\xampp\sendmail\sendmail.exe\" -t" 

    ; XAMPP: Comment out this if you want to work with mailToDisk, It writes all mails in the C:\xampp\mailoutput folder 
    sendmail_path = "C:\xampp\mailtodisk\mailtodisk.exe" 

    ; Force the addition of the specified parameters to be passed as extra parameters 
    ; to the sendmail binary. These parameters will always replace the value of 
    ; the 5th parameter to mail(), even in safe mode. 
    ;mail.force_extra_parameters = 

    ; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename 
    mail.add_x_header = Off 

    ; Log all mail() calls including the full path of the script, line #, to address and headers 
    ;mail.log = "C:\xampp\php\logs\php_mail.log" 

I try to change sendmail.ini to this but not work 

; configuration for fake sendmail 

; if this file doesn't exist, sendmail.exe will look for the settings in 
; the registry, under HKLM\Software\Sendmail 

[sendmail] 

; you must change mail.mydomain.com to your smtp server, 
; or to IIS's "pickup" directory. (generally C:\Inetpub\mailroot\Pickup) 
; emails delivered via IIS's pickup directory cause sendmail to 
; run quicker, but you won't get error messages back to the calling 
; application. 

smtp_server=localhost 

; smtp port (normally 25) 

smtp_port=25 

; SMTPS (SSL) support 
; auto = use SSL for port 465, otherwise try to use TLS 
; ssl = alway use SSL 
; tls = always use TLS 
; none = never try to use SSL 

smtp_ssl=auto 

; the default domain for this server will be read from the registry 
; this will be appended to email addresses when one isn't provided 
; if you want to override the value in the registry, uncomment and modify 

;default_domain=mydomain.com 

; log smtp errors to error.log (defaults to same directory as sendmail.exe) 
; uncomment to enable logging 

error_logfile=error.log 

; create debug log as debug.log (defaults to same directory as sendmail.exe) 
; uncomment to enable debugging 

;debug_logfile=debug.log 

; if your smtp server requires authentication, modify the following two lines 

auth_username= 
auth_password= 

; if your smtp server uses pop3 before smtp authentication, modify the 
; following three lines. do not enable unless it is required. 

pop3_server= 
pop3_username= 
pop3_password= 

; force the sender to always be the following email address 
; this will only affect the "MAIL FROM" command, it won't modify 
; the "From: " header of the message content 

force_sender= 

; force the sender to always be the following email address 
; this will only affect the "RCTP TO" command, it won't modify 
; the "To: " header of the message content 

force_recipient= 

; sendmail will use your hostname and your default_domain in the ehlo/helo 
; smtp greeting. you can manually set the ehlo/helo name if required 

hostname= 

任何想法?

+0

檢查你的郵件日誌。如果你的本地郵件傳輸接受了這個消息,那麼'mail()'返回true,不管它實際上是否被傳遞,與之後的PHP沒有任何關係。 – Sammitch

回答

15

如果郵件返回true,那麼php的工作就完成了。它將電子郵件傳遞給您的傳出郵件服務器。您需要檢查該服務器的日誌以瞭解從該點開始發生的情況。

例如PHP在發送電子郵件中的作用基本上相當於拿一個信封交給他,然後走到街角,然後放到郵箱中。之後,PHP完成並可以報告成功。

如果該郵箱被一個醉酒驅動程序釘住並且郵件被破壞,那不是PHP的錯。如果郵件被接收併發送到郵政分揀設施然後丟失,那也不是PHP的問題。

所以去檢查您的郵件服務器的日誌。如果它無法發送郵件,它會報告原因。如果DID投遞郵件到目標服務器,它會報告這樣了,那麼你需要找出原因,接收服務器沒有做的工作 - 也許你的電子郵件得到標記爲垃圾郵件,並在垃圾場。

+2

*加*號,如果郵遞員喝在工作中和在酒吧留下了他的包,當去到另一個酒吧,那麼這是不是郵局的過錯,這是郵遞員的。 *添加到Marc的「精美的說法」類比*中。 –

+1

我試着用PHP發送郵件,但郵件服務器的日誌是空的。我試圖用thunderbird發送它,它的工作,並且郵件服務器日誌不再是空的。所以也許這不是因爲郵件服務器,因爲我也嘗試將郵件服務器更改爲argosoft郵件服務器,並且沒有運氣。因爲這個代碼在以前的xampp版本中是完美的。降級可能?或我的PHP配置是錯誤的? –

0

案件告破

我降級XAMPP版本1.7和它的作品:)

1

檢查該目錄:C:\ XAMPP的\ apache的\ mailoutput

1

我最近遇到這個問題經過許多令人沮喪的時間後發現是什麼原因造成的,以及如何解決這個問題。希望我能拯救別人所有的麻煩。

我的PHP郵件()函數返回true,但我沒有收到消息。就我而言,事實證明它畢竟與PHP無關。

我使用Plesk管理我的服務器上的網站。這個特定版本的Plesk不允許我爲給定的網站/域打開或關閉郵件服務。我在別處託管我的電子郵件

因此,這裏是發生了什麼事:PHP郵件()被髮送消息,它的方式是應該。但是我的服務器的印象是,它應該接收這些消息所針對的特定域的消息。但是該域沒有這樣的郵箱,因爲我再次在其他地方託管我的電子郵件。

因此,郵件永遠不會離開我的服務器。

的解決辦法是讓我進入無功/ qmail的/控制並從「virtualdomains」文件中刪除的域名,然後重新啓動qmail的。

同樣,我希望這樣可以節省別人所有的時間和挫折。 格雷格

0

我也有類似的問題。在我的情況是,我修改了標題中的「From」字段。在你的例子中,你有

$headers = "From: [email protected]"; 

也許這是問題。見this答案更多信息