2009-08-30 25 views
1

在我的網站上我有一個PHP腳本,可以自動郵寄給我的客戶關於訂單的確認。 我的網站的域名也註冊到了我的網站。 我有很多問題使用mail()函數發送電子郵件到某些電子郵件帳戶......很多我的用戶與我聯繫,說他們從未收到我的自動電子郵件!所以這是一個非常大的問題!共享主機發送的電子郵件被阻止。有沒有辦法避免這種情況?

給我更多問題的帳戶是comcast.net,uol.com,mchsi.com和其他人!我已經聯繫了這些電子郵件服務提供商的支持中心,要求將我的IP從阻止列表中刪除。

電子郵件的標題是這樣的:

$header = "Sender: $from_mail\n"; 
$header .= "From: Account <$from_mail>\n"; 
$header .= "Reply-To: Account <$from_mail >\n"; 
$header .= "Content-Type: multipart/mixed; boundary=$mixed_boundary\n"; 
$header .= "Mime-Version: 1.0\n"; 
$header .= "X-Mailer: PHP/".phpversion()."\n"; 

$body = "\n--$mixed_boundary\n"; 
. 
. 
. 
. 
$body .= "\n\n--$mixed_boundary--"; 

mail($to, $subject, $body, utf8_encode($header), "-f$from_mail"); 

有東西,我可以儘量避免這個問題? 有人知道我在哪裏可以知道用於發送電子郵件的服務器的IP地址是什麼,這些電子郵件被認爲是PHP mail()函數?

在此先感謝您的回覆!


嗨,

今天仍然有些電子郵件提供商的服務,如康卡斯特,繼續擋住了我的IP地址,說,我的郵件服務器發送垃圾郵件...我要求從黑名單移除,但他們的系統繼續阻止他們!我不知道還有什麼能做些什麼......我已經按照你的建議和代碼如下所示:

$md5 = md5(date('r', time())); 
$mixed_boundary = "PHP-Mixed-$md5"; 
$alt_boundary = "PHP-Alt-$md5"; 

$header = "Sender: $from_mail\r\n"; 
$header .= "Errors-To: $from_mail\r\n"; 
$header .= "From: account <$from_mail>\r\n"; 
$header .= "Reply-To: $from_mail\r\n"; 
$header .= "Content-Type: multipart/mixed; boundary=$mixed_boundary\r\n"; 
$header .= "Mime-Version: 1.0\r\n"; 
$header .= "X-Mailer: PHP/".phpversion()."\r\n"; 

$body = "\n--$mixed_boundary\n"; 
$body .= "Content-Type: multipart/alternative; boundary=$alt_boundary\n"; 
. 
. 
. 
. 
$body .= "--$mixed_boundary\n"; 
$body .= "Content-Disposition: attachment filename=\"...\"\n"; 
$body .= "Content-Type: application/octet-stream; x-unix-mode=0644; name=\"...\"\n"; 
$body .= "Content-Transfer-Encoding: base64\n"; 
. 
. 
. 
. 
$body .= "\n\n--$mixed_boundary--"; 


mail($to, $subject, $body, utf8_encode($header), "-f$from_mail"); 

建議?

再次感謝!

+0

看看mail()函數的PHP文檔,它們的標頭用「\ r \ n」分隔,而不是像你的例子中的「\ n」。可能是規範要求「\ r \ n」,但是您的方法仍然有效,因爲某些郵件服務器在接受方面是自由的。 – Inshallah 2009-08-30 15:09:33

+0

果然,PHP文檔說只是「\ n」不符合RFC 2822(Internet郵件格式) – Inshallah 2009-08-30 15:12:04

+0

,但「\ r \ n」分隔符是用於asp服務器嗎?或不?我認爲PHP服務器使用「\ n」作爲新行字符! – BitDrink 2009-08-30 15:13:16

回答

3

根據RFC2822 Internet Message Format,您的郵件標題無效。

從2.1概述:

信息分爲行字符。一行是一系列 字符,用兩個字符carriage-return 和換行符分隔;即緊跟換行符(LF)字符(ASCII 值10)的回車(CR)字符(ASCII 值13)。(該回車/換行符對通常寫在 本文爲「CRLF」)。

正如我在評論中指出,爲什麼你的電子郵件可能與大多數郵件服務器反正工作的原因是他們可以接受他們的自由。可能有一些郵件服務器會丟棄你的郵件,因爲它們不符合RFC2822。

編輯:雖然使用「\ r \ n」在PHP文檔中提倡使用mail()函數,但有一些debate about whether that's really the right thing to do

mail()函數將與本地sendmail(8)命令(或任何在sendmail_path中配置的任何項)進行通信,並且根據使用的郵件傳輸代理實現的不同,行結束可能會有所不同。據我所知,sendmail(8)應該與「\ r \ n」一致,但例如qmail(7)會將「\ r \ n」替換爲「\ r \ r \ n」,這可能會破壞該信息。

這一切都發生在電子郵件發送到其最終目的地之前,因此可以通過發送自己用「\ r \ n」構造的電子郵件並通過驗證所有電子郵件標題存在。

參見:RFC2822PHP mail() functionsendmail(8)qmail(7)

+0

我有很多成功的發送電子郵件的正確的SPF記錄,並使用PHP梅勒 – meme 2009-10-25 16:07:46

3

你可以給自己發一封電子郵件並檢查標題。這將給你一個電子郵件可能採取的路徑的想法,但真的沒有什麼阻止電子郵件到其他域通過不同的路徑。

一般來說,那些大型的ISP具有真正的重型垃圾郵件過濾器,所以從共享主機向他們發送郵件將非常困難。如果你能得到你自己的IP地址並從那裏發送郵件,它可能會有幫助。那麼你可以設置SPF records。沒有保證,但這肯定會讓你擺脫商業垃圾郵件發送者的坑。

您也可以使用link text和其他一些反垃圾郵件服務進行一些挖掘,看看您是否做了其他任何錯誤。

要求客戶將你的發件人地址添加到他們的垃圾郵件白名單可能也不會傷害。

+0

謝謝! 是的,我試圖給自己發送很多電子郵件,我無法找到如何改進我的標題......對於我來說一切正常! 關於與共享主機的垃圾郵件過濾器,你是對的! 您關於要求客戶將我的域名添加到他們的「安全發件人」列表的建議是我在我的網站上撰寫的內容......但是沒有任何用戶接受此建議! :-( – BitDrink 2009-08-30 15:19:48

2

我發現,設置Return-PathSenderErrors-To頭在某些情況下幫助。

+0

返回路徑和發件人設置!但我沒有想過設置錯誤,以標題太多,所以謝謝! ) – BitDrink 2009-08-30 16:33:34

0

我注意到,在我的Linux主機服務器上,我必須用額外的頭文件和混合/替代頭文件中的LF替換所有出現的CRLF。關於PHP documentation說:

「如果沒有收到消息,請嘗試使用LF(\ n)。一些質量差的Unix郵件傳輸代理會自動用CRLF代替LF(如果使用CRLF,會導致CR翻倍)這應該是最後的手段,因爲它不符合»RFC 2822。「

我試着給我的個人帳戶發送郵件(只有「\ n」),我在原始郵件中查找「\ r」和「\ n」...每行都是以CR結尾,並以「\ n」開頭!

問題:正如PHP mail()文檔所述,我使用函數wordwrap()將行長度剪切爲70個字符。 解決方法是讓郵件客戶端以原始格式顯示郵件,而不是每行不超過70個字符的列?

ANSWER [溶液]:我已經解決了設置引用可打印作爲內容傳送編碼:

$body .= "Content-Transfer-Encoding: quoted-printable\n"; 
$body .= "Content-Type: text/plain;\n\tcharset=utf-8;\n\tformat=flowed;\n\tdelsp=yes\n"; 

$body .= "\n" . quoted_printable_encode($message); 

的quoted_printable_encode()函數是僅與PHP 5.3可用時,執行適合於documentation page

0

使用PHPMailer(http://phpmailer.worxware.com/)構建電子郵件消息。也許這不是知識產權,而是別的。有很多東西,垃圾郵件過濾器會發生過敏反應(比如缺少消息ID等)。再加上PHPMailer,你有機會通過郵件()發送郵件,或者由於通過SMTP通過其他主機(如Gmail)的共享託管問題而無法工作。

+0

謝謝您的回覆!我嘗試過使用PHPMailer,但原始信息看起來像我手寫的那個...沒有任何改進!然而,礦是一個濫用問題,所以我認爲,如果我移動我的網站在虛擬服務器上,或者我購買了靜態IP,我可以解決這個問題。 – BitDrink 2009-10-22 11:53:51

3

讓我解釋一下你面對的戰鬥。暫時忘記技術細節。 那裏有數百個電子郵件提供商。最大的是雅虎,Gmail,美國在線,Hotmail等。如果您被這些服務中的任何一個攔截,您的業務可能會受到嚴重影響。

這些電子郵件提供商非常關注垃圾郵件,並且爲了防止垃圾郵件已經發揮了阻止任何可能是垃圾郵件的極端的作用。您可能永遠不會收到垃圾郵件投訴,但如果您的共享託管計劃中的其他業務受到垃圾郵件投訴,您將受到影響。如果您使用的是可疑垃圾郵件IP地址,則將郵件發送到垃圾郵件文件夾的方式與配置應用程序無關。

即使你有自己的服務器,你仍然會遇到問題。隨着時間的推移,如果您發送電子郵件,一些收件人將點擊垃圾郵件按鈕。這是生活中的一個事實,沒有什麼可以阻止它。

唯一的解決辦法是外包給你電子郵件傳送。像Aweber或iContact這樣的公司爲您處理電子郵件傳送問題。他們與所有主要電子郵件供應商有關係,並努力確保您的郵件進入收件人收件箱。 您再也不用擔心聯繫雅虎或Gmail,因爲有人點擊垃圾郵件按鈕。你可以專注於更重要的事情。

+0

非常感謝您的回答! – BitDrink 2009-10-25 19:18:40

相關問題