
Webアプリケーションがあり、その機能の1つがユーザーへのニュースの大量メール送信であることを想像してください。
何らかの理由で、ユーザーの電子メールアドレスの一部が非アクティブであるか、誤って入力されています。 ユーザーをニュースレターから自動的に購読解除するのは良いことでしょうか?
送信されたメールメッセージに特別なヘッダーを追加できます。
Return-Path: <noreply@my-application.com>
配信の失敗に関するメールサーバーからの通知は、このアドレスに送信されます。
その結果、タスク全体がこれらの通知を読み取り、電子メールアドレスを抽出し、このアドレスを持つユーザーを配布不可としてマークすることになります。
そして今、実際の例。
アプリケーションの1つで、メールサーバーはこのような通知の本文にいくつかの便利な行を直接追加します。
Final-Recipient: rfc822; nonexistent@example.com Original-Recipient: rfc822;nonexistent@example.com Action: failed Status: 5.1.1
ルビーの場合、標準ライブラリに
IMAPクライアントがあります。 「noreply@my-application.com」メールボックスに接続し、通知を読み取ります。
imap = Net::IMAP.new('mail.my-application.com', port: 993, ssl: true) imap.login("noreply@my-application.com", "mysecretpassword") imap.select("INBOX")
清潔さのために、ステータスコードを確認することもできます。 5.XXコードは致命的な配信エラーを示します。たとえば、電子メールアドレスが存在しない、4.XXコードは一時的なエラーを示します。たとえば、受信サーバーが応答しません。
このコードは、
Resque 、
Delayed :: Job 、cron、またはアプリケーションで使用される他のツールを使用して、バックグラウンドで定期的に実行されます。 問題は解決しました。ニュースレターは既存の有効なメールアドレスにのみ送信されます。
タスクが準備され、
olemskoiと一緒に解決され
ましたPS:アプリケーションでは、そのような通知はそれほど冗長ではないかもしれませんが、とにかく動作していないメールを抽出しようとすることができます。 たとえば、Gmailを使用してレターを送信する場合、Gmailからの配信失敗の通知には特定のヘッダーが含まれます。
X-Failed-Recipients: nonexistent@example.com
使用できます。