
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") # , imap.search('ALL').each do |message_id| # message = imap.fetch(message_id, 'BODY[TEXT]')[0].attr['BODY[TEXT]'] match = message.match(/^Original-Recipient: rfc822;(.*)$/) email = match[1].strip if match # rails- if email user = User.where(email: email).first user.unsubscribe if user end # imap.copy(message_id, 'Processed') imap.store(message_id, '+FLAGS', [:Deleted]) end imap.expunge imap.logout imap.disconnect
清潔さのために、ステータスコードを確認することもできます。 5.XXコードは致命的な配信エラーを示します。たとえば、電子メールアドレスが存在しない、4.XXコードは一時的なエラーを示します。たとえば、受信サーバーが応答しません。
このコードは、 Resque 、 Delayed :: Job 、cron、またはアプリケーションで使用される他のツールを使用して、バックグラウンドで定期的に実行されます。 問題は解決しました。ニュースレターは既存の有効なメールアドレスにのみ送信されます。
タスクが準備され、 olemskoiと一緒に解決されました
PS:アプリケーションでは、そのような通知はそれほど冗長ではないかもしれませんが、とにかく動作していないメールを抽出しようとすることができます。 たとえば、Gmailを使用してレターを送信する場合、Gmailからの配信失敗の通知には特定のヘッダーが含まれます。
X-Failed-Recipients: nonexistent@example.com
使用できます。