稼働していないメールアドレスからの自動除外

画像
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コードは一時的なエラーを示します。たとえば、受信サーバーが応答しません。
このコードは、 ResqueDelayed :: Job 、cron、またはアプリケーションで使用される他のツールを使用して、バックグラウンドで定期的に実行されます。 問題は解決しました。ニュースレターは既存の有効なメールアドレスにのみ送信されます。

タスクが準備され、 olemskoiと一緒に解決されました

PS:アプリケーションでは、そのような通知はそれほど冗長ではないかもしれませんが、とにかく動作していないメールを抽出しようとすることができます。 たとえば、Gmailを使用してレターを送信する場合、Gmailからの配信失敗の通知には特定のヘッダーが含まれます。

 X-Failed-Recipients: nonexistent@example.com 

使用できます。

Source: https://habr.com/ru/post/J200534/


All Articles