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

画像

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
      
      





使用できます。



All Articles