3

私のウェブサイトには、注文に関する確認を顧客に自動的にメールで送信する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");

この問題を回避するために私が試みることができる何かがありますか?PHPのmail()関数を使用して、電子メールの配信に使用されるサーバーのIPアドレスをどこで確認できるかを誰かが知っていますか?

返信ありがとうございます!!!


やあ、

それでも今日でも、Comcastなどの一部の電子メールプロバイダーサービスは、私のメールサーバーがスパムを送信すると言って私の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");

提案?

再度、感謝します!

4

6 に答える 6

4

あなたが直面している戦いについて説明させてください。技術的な詳細については少し忘れてください。そこには何百もの電子メールプロバイダーがあります。大きなものはYahoo、Gmail、AOL、Hotmailなどです。これらのサービスのいずれかでブロックされている場合、あなたのビジネスは深刻な影響を受ける可能性があります。

これらの電子メールプロバイダーはスパムを非常に懸念しており、スパムと戦うために、スパムである可能性のあるメッセージをブロックするという極端なことを行っています。あなたはスパムの苦情を受けることは決してないかもしれませんが、あなたの共有ホスティングプランで別のビジネスがスパムの苦情を受け取った場合、あなたは影響を受けます。スパムの疑いのあるIPアドレスを使用している場合は、アプリケーションをどのように構成するかは関係ありません。メッセージはスパムフォルダーに送信されます。

独自のサーバーを使用している場合でも、問題が発生します。時間の経過とともにメールを送信すると、一部の受信者がスパムボタンを押すようになります。これは人生の事実であり、それを防ぐためにあなたができることは何もありません。

唯一の解決策は、メール配信を外部委託することです。AweberやiContactのような会社は、あなたに代わってメール配信の問題に対処します。彼らはすべての主要な電子メールプロバイダーと関係があり、あなたのメッセージが受信者の受信箱に確実に届くように一生懸命働いています。誰かがスパムボタンを押したので、YahooやGmailに連絡することを心配する必要はもうありません。もっと重要なことに集中できます。

于 2009-10-25T19:12:59.237 に答える
3

RFC2822インターネットメッセージフォーマットに従って、メッセージヘッダーが無効です。

2.1から概要:

メッセージは文字の行に分割されます。行は、キャリッジリターンとラインフィードの2文字で区切られた一連の文字です。つまり、キャリッジリターン(CR)文字(ASCII値13)の直後に改行(LF)文字(ASCII値10)が続きます。(このドキュメントでは、キャリッジリターン/ラインフィードのペアは通常「CRLF」と表記​​されています。)

私のコメントで指摘したように、あなたの電子メールがとにかくほとんどのメールサーバーで機能するかもしれない理由は、彼らが受け入れるものに寛大であるかもしれないからです。ただし、RFC2822に準拠していないため、メッセージを破棄するメールサーバーが存在する場合があります。

編集:「\ r \ n」の使用はmail()関数のPHPドキュメントで推奨されていますが、それが本当に正しいことであるかどうかについてはいくつかの議論があります

mail()関数はローカルのsendmail(8)コマンド(またはsendmail_pathで構成されているもの)と通信し、使用されるメール転送エージェントの実装に応じて行末の処理が異なる場合があります。私の理解では、sendmail(8)は「\ r \ n」で問題ないはずですが、たとえばqmail(7)は「\ r\n」を「\r\ r \ n」に置き換えます。これにより、おそらくメッセージ。

これはすべて、電子メールが最終的な宛先に配信される前に発生するため、「\ r \ n」で構成された電子メールメッセージを自分自身に送信し、すべてのヘッダーが存在することを確認することで、行末が適切に処理されるかどうかを簡単にテストできます。

参照:RFC2822PHP mail()関数sendmail(8)qmail(7)

于 2009-08-30T15:24:33.043 に答える
3

あなたは自分自身に電子メールを送って、ヘッダーをチェックすることができます。これにより、電子メールがたどる経路がわかりますが、他のドメインへの電子メールが別の経路を通過するのを妨げるものは何もありません。

一般に、これらの大規模なISPには非常に強力なスパムフィルターがあるため、共有ホストからISPにメールを送信するのは困難です。自分のIPアドレスを取得してそこからメールを送信できれば、おそらく役立つでしょう。次に、 SPFレコードを設定できます。保証はありませんが、それは間違いなくあなたを商用スパマーの穴から少し引き上げます。

また、リンクテキストやその他のスパム対策サービスを調べて、他に何か問題がないかどうかを確認することもできます。

送信元アドレスをスパムホワイトリストに追加するように顧客に依頼しても、おそらく害はありません。

于 2009-08-30T15:06:35.353 に答える
2

Return-Path、、、SenderおよびErrors-Toヘッダーの設定が役立つ場合があることがわかりました。

于 2009-08-30T15:42:41.447 に答える
0

Linuxホスティングサーバーでは、追加のヘッダーと混合/代替ヘッダーの両方で、CRLFのすべての出現箇所をLFに置き換える必要があることに気づきました。PHPのドキュメントには次のように書かれています。

「メッセージが受信されない場合は、LF(\ n)のみを使用してみてください。一部の低品質のUnixメール転送エージェントは、LFをCRLFに自動的に置き換えます(CRLFを使用するとCRが2倍になります)。 »RFC2822に準拠していません。」

個人アカウントに(「\ n」のみを含む)メールを送信しようとしましたが、生のメッセージで「\r」と「\n」を探しました...各行はCRで終了し、 「\n」で始まりました!

質問: PHPのmail()のドキュメントにあるように、私は関数wordwrap()を使用して行の長さを70文字にカットします。メールクライアントがメッセージを元の形式で表示し、各行が70文字以下の列として表示しないようにする回避策はありますか?

回答[解決策]: quoted-printableをContent-Transfer-Encodingとして設定することを解決しました:

$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でのみ使用可能であり、実装はドキュメントページに適しています。

于 2009-10-22T09:35:43.250 に答える
0

電子メールメッセージの作成には、PHPMailer(http://phpmailer.worxware.com/ )を使用します。たぶんそれはIPではなく、何か他のものです。スパムフィルターがアレルギー反応を起こすものはたくさんあります(メッセージIDの欠落など)。さらに、PHPMailerを使用すると、mail()を介してメールを送信するか、他のホスト(Gmailなど)を介したSMTPを介した共有ホスティングの問題が原因でメールが機能しない場合があります。

于 2009-10-22T10:11:51.950 に答える