PHPで記述できなかった理由はありませんが、 それをwebrequest/HTTPプロセスの一部にします。私は、郵送ごとに500,000のサブスクライバーを提供または取得するための実装に成功しました(これは場所固有のプロジェクトであったため、利用可能なローカルデータによって異なります)。これは社内プロジェクトだったので、残念ながらコードやパッケージはありませんでしたが、私が見つけたいくつかの指針:
配信の設定
- phpmailer自体から始めて、フォーマット、コンテンツとヘッダーのエンコード、添付ファイルの追加などを処理しました。その部分はうまく機能し、最初から書きたくありません。
- 電子メール自体の「送信」は、サブスクライバー(の一部)に送信するかどうか、どのように、何を送信するかをデータベースに設定するだけです。
- このフラグが設定されると、cronジョブによって自動的に取得され、Webサーバーは不要になります。
- 私は何百万ものメールアドレスを含むひどく汚染されたデータベースから始めました。そのうちのたくさん 明らかに有効ではなかったので、最初にすべての電子メールアドレスをフォーマットについて検証し、次にホストについて検証しました。
-
filter_var($email, FILTER_VALIDATE_EMAIL);
サブスクライバーを超えて(そして明らかに結果を保存して)、最初の数十万の無効な電子メールを取り除きました。 - ホストを分割する(および保存する 電子メールからのホスト名)、およびそれを検証します(DNSにMXまたは少なくともAレコードがありますが、覚えておいてください:IPアドレス
[email protected][255.255.255.255]
、だからそれらを有効にしておいてください))かなりの部分をもっと取り除きました。ここのメールアドレスはではありません 永続的に無効になっていますが、ドメイン名/ipが原因で無効になっていることを示すステータスフラグが付いています。 - スクリプトがrequireに変更されました サブスクリプションの有効な電子メールアドレス/挿入前、このナンセンスな'は
example @ sqldat.com ' サブスクリプション-データベースの汚染はばかげていました。
-
- これで、有効になる可能性のあるメールアドレスのリストができあがりました。無効なアドレスを検出するには、基本的に3つの方法があります(すべて 一時的である可能性があります):
- サーバーによってすぐに拒否されます。
- 以前に決定されたサーバーはトラフィックをリッスンしません。
- 配信したと思ってからかなり経ってからバウンスします。
- 奇妙なことに、すべての電子メールサーバーが別の形式を持っているようで、最初は解析するのが大変だったバウンスは、実際には VERP
。次に、メール全体を解析するのではなく、専用のメールアドレス( [email protected] )は、メールボックスに配信するのではなく、コマンドを介してパイプするように構成されており、メールを [email protected]
、
Return-Path
[email protected]
。受信時に簡単に解析でき、何回バウンスした後(メールボックスが存在しなかった、メールボックスがいっぱいになる可能性がある(はい、まだ!)など)、使用できないメールアドレスを宣言するのはあなた次第です。 - これで、サーバーによる直接拒否。おそらく、いくつかのMTAを適切に構成したり、それらのプラグインを作成したりすることもできましたが、電子メールは時間に敏感であり、最後の使用可能な配信時間にわたってメールごとに完全に構成可能な制御を行う必要がありました(その後、電子メールは長くなりませんでした)ユーザーにとって興味深い)、受信サーバーごとのスロットル、そして一般的にすべて、受信サーバーのソケット25に直接SMTPプロトコルを使用するPHPでメーラーを作成するのとほぼ同じ時間がかかります。最小限の労力で、別のトランスポートの可能性があり、PHPMailerのデフォルトの選択肢が組み込まれています。 SMTPプロトコルは実際には非常に単純ですが、いくつかの注意点があります。
- 多くの受信サーバーがグレーリストを適用します。ほとんどのスパムボットは、特定のメールが到着しても実際には気にせず、単にそれらを解き放ちます。そのため、不明な/まだ信頼されていない送信者がメールを送信した場合、一時的に拒否されます。それをキャッチし(通常はコード451)、後で再試行できるようにメールをキューに入れます。
- メールサーバー、特に大規模なISPや無料サービス(gmail、hotmail / msn / liveなど)は、反撃せずに大量のメールを支持することはありません。最初の数百/千を超えると、拒否し始めます。君。これについては後で詳しく説明します。
スピードを上げる
- これで、機能する配信システムができましたが、高速である必要がありました。 。送信するアドレスが10,000しかない場合は、1時間に10,000の電子メールを送信することはすべて問題ありませんが、必要な最小値は1時間あたり約200,000でした。当初は専用サーバーでした(実際には、何をしていても、かなり低電力である可能性があります。電子メールの配信にかかる時間のほとんどは、サーバーではなくネットワークにあります)。
- IPのキャッシュ:電子メールアドレスのホスト名から要求したすべてのIPを覚えていますか?それらを明らかに保存しましたが、それらのIPを何度も検索すると、かなりの遅延が発生します。ただし、IPは変更される可能性があります。DNSレコードがそこにあり、別のMXが別の場所にあります...データはすぐに古くなります。ほとんどの場合、サーバーは実際には何も送信していません(サブスクリプションニュースレターは明らかにバーストで送信されます)。優先度の低いcronジョブが実行され、古いIP(1日より古いものを古いものとして選択)を持つすべてのホスト名のIPアドレスがチェックされます。 、以前に何もなかったものを含む (新しいドメインは常に登録されているので、誰かがすでに新しいメールアドレスで熱心にサブスクライブした翌日にドメインが利用可能にならないのはなぜですか?または一部のドメインのサーバーの問題が解決されたなど)。実際にメールを送信するために、これ以上ドメインを検索する必要はありません。
- SMTP接続の再利用:ポート25と直接通信している場合、サーバーへの接続を設定すると、電子メールの配信に比較的長い時間がかかります。毎回新しい接続を設定する必要はありません。電子メール、あなたは同じ接続を介して次を送信することができます。少しの追跡エラーにより、ここでのデフォルトは接続ごとに約50の電子メールに設定されています(ドメインにそれ以上の数があると仮定します)。ただし、電子メールアドレスが失敗した場合は、再試行のために接続を閉じて再度開くと役立つ場合がありました。全体として、これは本当に 物事をスピードアップするのに役立ちました。
- いくつかの明白なもの、とても明白な私はそれについて言及するのをほとんど忘れていました:その場で電子メールの本文を作成しなければならないのは無駄です:それが一般的なメールの場合、本文を準備してください(私はPHPMailerをいくらか変更しましたキャッシュされたメールを使用できるようにする)、おそらく数日前(知っている場合 金曜日にメールを送信し、サーバーがアイドリングしている場合は、水曜日にメールを準備してみませんか?パーソナライズされている場合でも、十分な時間があれば事前に準備することができます。そうでない場合は、少なくともパーソナライズされていない部分を待つ必要があります。
- 複数のプロセス。電子メールの配信にかかる時間の多くがネットワークに費やされていることを述べましたか? 1つのメール送信プロセスは、電子メールサーバーをほとんど活用しておらず、ほとんど目立たない負荷であり、メールは少しずつ出ています。キューのさまざまな部分をメールで送信するいくつかのプロセスを試して、サーバー/接続に何が適切かを確認しますが、2つの非常に重要なことを覚えておいてください。
- プロセスが異なると、競合状態に対して非常に脆弱になります。絶対に気を付けてください 決してない完全なシステムがあります 同じメールを2回(3回、さらにそれ以上)送信します。それはユーザーをひどく苛立たせるだけでなく、あなたのスパムは一段と上がります。
- 可能な場合はドメインをまとめてください。キューからランダムに選択すると、ドメインのメールを受信するサーバーへの接続を開いたままにしておくという利点が失われます。
拒否の回避
- あなたはたくさんのメールを送るつもりです。それはまさにスパマーが行うことです。しかし、あなたはスパマーとして見られたくないのですか(結局のところ、あなたはそうではありません)?受信サーバーに対する信頼性を完全に高めるメカニズムがいくつかあります。
- 適切な逆引きDNSを使用する:メールを送信しているIPに属するDNSをチェックするプロセス非常に セカンドレベルドメインが一致する場合: example.comに代わってメールを送信していますか ?サーバーの逆引きDNSがsomename.example.comのようなものであることを確認してください 。
- ドメインのSPFレコードを公開する:バルクメールの送信に使用されるマシンが、そのFrom/Return-Pathヘッダーを使用してメールを送信することを許可および期待されていることを明示的に示します。
- 拒否を忘れないでください :サーバーは、異なる電子メールアドレスが存在しないことを何度も通知することを好みません。自動化されたメカニズム、さらには人間の管理者でさえ、存在していなかった(もはや存在しない)すべての検証されていない電子メールアドレスを処理している間、サーバーをブロックしました。私たちは後でまでダブルオプトインを採用していなかったため、データベースはタイプミス、IPの切り替え、それによる電子メールアドレス、いたずら電子メールアドレスなどで汚染されていました。必ずこれらの無効なものをキャプチャし、十分な数の障害または重大な障害が発生した場合は、登録を解除してください。 。彼らはあなたに何の役にも立たず、リソースを浪費しています。彼らが本当にあなたにメールを送りたいと思っていて、メールボックスが後で利用可能になった場合、彼らはただ再購読する必要があります。
- DKIMは、信頼性を高める可能性のあるもう1つのメカニズムですが、まだ実装していないため、それについてはあまり説明できません。
- MXレコード:送信サーバーがドメインの受信サーバーでもある場合でも、一部のサーバーはそれを気に入っています。当時はMXが1つしかなく、メーリングサーバーはまだそれほどビジーではなかったため、ドメインのフォールバックMXサーバーと名付けました。通常のMXサーバーはではありませんでした 重要度の低いメールをすでに大量に送信しているため、重要なメールを送信しようとしているサーバー(クライアントなど)によって一時的にブロックされるのは非常に苛立たしいため、サブスクリプションを送信するサーバー。 MXの受信として最も優先されますが、失敗した場合でも、サブスクリプション送信サーバーが引き続き配信のためにフォールバックされるという素晴らしいボーナスがありました。そのため、危機的状況では、それを取得でき、私たちに連絡するために。
- あなたのことを彼らに話してください。真剣に。 live.comのような無料の電子メールアドレスの多くの主要なプレーヤーは、何らかの方法でサインアップする機会を提供します。または、電子メールが拒否された場合にヘルプとサポートにアクセスするための連絡先を用意します。非常に多くのメールを送信する正当な理由があります。多くのサブスクライバーがいると考えられます。サーバーに送信できる1時間あたりのメール数が大幅に増加している可能性があります。説得力があり正直であれば、わずか1,000人が1万人以上になる可能性があります。契約、満たす必要のある要件、およびこれを許可するために作成(および保持)する必要のある約束がある場合があります。 ISPはブランドが異なり、他のすべてのプレーヤーは異なります。普段はわざわざ電話をかけないでください。99%の確率で、インターネット接続のトラブルシューティングを喜んで行う人しかいないので、他のことはほとんど理解していません(または許可されていません)。
[email protected]
電子メールアドレスは開始するのに適した場所ですが、どこかからより的確な電子メールアドレスを掘り下げることができるかどうかを確認してください。正確、正直、完全である:そのISPの電子メールアドレスを持っているサブスクライバーの大まかな数、それらをメールで送信しようとしている頻度、受信したエラーまたは拒否、サブスクライブとサブスクライブ解除のプロセスはどのようなものか、あなたが実際に彼らの顧客に提供するサービス。また、これらのメールを送信することがあなたのビジネスにとってどれほど重要であるか、それについてパニックに陥り、ひどい損失を主張することは彼らには関係ありません。事実と希望の丁寧な声明、および質問 彼らが解決策を要求するのではなく助けることができるかどうかは非常に長い道のりです。 - スロットル:あなたが試した限り、一部のサーバーは、あなたからの1時間または1日あたりの特定の量のメールのみを受け入れます。それらの数値を学習し(とにかく成功と失敗を記録しています)、通常のドメインでは適切なデフォルトに設定し、より大きなプレーヤーでは合意された制限に設定します。
スパムとしてタグ付けされないようにする
- 最初のルール:スパムを送信しないでください!
- 2番目のルール:これまで! 「一度限り」ではなく、「彼らは購読していませんが、これは彼らにとって一生の取引かもしれません」、最善の意図ではなく、人々はあなたの電子メールを求めなければなりませんでした。
- 明らかに、正しいダブルオプトインサブスクリプションメカニズムを設定します。
- PHPMailerは独自に適切なヘッダーを設定します
- ウェブで簡単に登録解除メカニズムを設定します(すべてにリンクを含めます) メール)、場合によってはメールやカスタマーサービスもあります。カスタマーサービスができることを確認してください 直接登録を解除します。
- 前述のとおり、登録解除(過剰)は失敗してバウンスします。
- スパムのような「生涯にわたる取引」の文言は避けてください。
- メールではURLを慎重に使用してください。
- ドメインを信頼できることが絶対に確実でない限り、管理外のドメインへのリンクを追加することは避けてください。 それでもスパムしないでください...
- ユーザーに価値を提供する:google / yahoo / liveウェブメールクライアントでのユーザーインタラクションによってスパムとしてタグ付けされると、将来の成功に深刻な打撃を与えます(サイトノート:サインアップすると、live / msn/hotmailはすべてを転送しますユーザーによってスパムとしてタグ付けされたドメインによって送信されるメール。それを愛することを学び、いつものように:購読を解除すると、彼らは明らかにあなたのモールを望んでおらず、スパムの評価を傷つけています。
- IPのブラックリストを監視します。そのうちの1つに表示された場合は、さようならです。名前をクリアすることと、名前をクリアすることの両方で、すぐに行動してください。 ケースを特定する必要があります。
成功率の測定
- プロセス全体を管理することで、メールがどこかに届いたことを合理的に確信できます。 (MXのビットバケットまたはスパムフォルダである可能性がありますが)、または障害とその理由をログに記録しました。これにより、「実際に配信された」番号が処理されます。
- 一部の人々は、オンライン画像へのリンクを電子メール(実際のまたは有名な1x1の透明なgif)に追加して、実際に電子メールを読んだ人の数を測定するように説得しようとします。高い割合でこれらの画像がブロックされるため、これらの数値はせいぜい不安定であり、私たちはそれらを気にするべきではないと信じています。それらの数値はまったく信頼できません。
- ユーザーに何かをしてもらいたい場合、実際の成功率を測定するための最善の策ははるかに簡単です。メール内のリンクにパラメータを追加して、リンクしたサイトにアクセスしたユーザーの数、目的のアクション(ビデオの視聴、コメントの残し、商品の購入)を実行したかどうかを測定できるようにします。
全体として、すべてのロギング、ユーザーインターフェース、ドメイン/電子メール/ユーザーごとの構成可能な設定などが含まれます。癖を構築して解決するのに約1.5人月かかりました。これは、メールのアウトソーシングと比較してかなりの投資になる可能性がありますが、そうではない可能性があります。すべては、量とビジネス自体に依存します。
さて、私がPHPでMTAを書くのはばかだったという炎上を始めましょう。私はそれを完全に楽しんだ(これが私がこの膨大な量のテキストを書いた理由の1つです)、そしてホストごとの非常に用途の広いロギングと設定機能失敗の割合などに基づくアラートにより、ライブが非常に簡単になります;)