Node.jsでメールを受け入れる

wwwのような電子メールはインターネットの夜明けに登場し、その古風な性質にもかかわらず、主要なネットワークテクノロジーの1つを保持し続けています。 一方、開発者はそれを本当に感謝せず、一方的に使用し、送信者としての返信がないことを示します。 そしてまず第一に、これは受信メールを処理するプロセスの複雑さによるものです。







それまでの間、Node.jsコミュニティを称賛し、苦痛や苦痛を伴わずにメールを受信できるパッケージが登場しました 。これらはsmtp-servermailparserです。 数十行のコードで、SSL暗号化サポート、spamassassinを使用したスパムフィルタリング、その他の喜びを備えたメールサーバーの作成方法を紹介します。







メールを受け取る



smtp-serverモジュールは、メールの受信を担当します。 彼の仕事には複雑なものは何もありません。数時間を費やすことができるのはTLSのセットアップだけです。これはあまり明白ではありません(これについては後で説明します)。







const fs = require('fs'); const {SMTPServer} = require('smtp-server'); const smtp = new SMTPServer({ secure: false, key: fs.readFileSync('./key.pem'), cert: fs.readFileSync('./cert.pem'), onRcptTo, onData, authOptional: true, }); //  .      . function onRcptTo({address}, session, callback) { if (address.starts('noreply@')) { callback(new Error(`Address ${address} is not allowed receiver`)); } else { callback(); } } //    function onData(stream, session, callback) { // Stream –    . Callback    . //       . callback(); }
      
      





設定



一般に、さらにいくつかの設定がありますが、小さなサーバーを実装するために必要な主な設定について説明します。







安全な



実際、暗号化は2つの方法で使用できます。接続を確立するとき( secure: true



)、またはSTARTTLSを使用して暗号化されたストリームに切り替えるとき( secure: false



)。 ポート25をリッスンしている場合は、 false



、587(465)-trueを指定します。 ポートを決定するには、メールプロトコルに割り当てられたポートの履歴に関する記事mailgunを読むことをお勧めします。







キー証明書



SSLキーと証明書。 デフォルトでは、smtp-serverは独自の自己署名証明書を使用しますが、Let's Encryptがある場合は使用しないことをお勧めします。







onRcptTo



onRcptToメソッドでアドレスが承認されなかった場合、onDataは呼び出されません。 各レターについて、送信者側でレポートが生成されます。 Yandexはこれを生成します。







 This is the mail system at host yandex.ru. I'm sorry to have to inform you that your message could not be delivered to one or more recipients. It's attached below. Please, do not reply to this message. <noreply@hm.rumk.in>: host hm.rumk.in[159.203.137.17] said: 550 Mailbox noreply@hm.rumk.in could not receive messages (in reply to RCPT TO command)
      
      





onMailFrom



この設定により、ハンドラーを送信者アドレスに割り当てて、送信者ごとにフィルタリングできます。







onData



ここではすべてが簡単です。主なことは、コールバックを呼び出してメモリリークを回避することです。







authOptional



YandexやGmailなどの不正な送信者からメールを受信できます。







ロガー



true



またはbunyanインターフェイスをサポートするロガーのインスタンスです。







解析



解析が簡単です。 mailparser



レターのパーサーを接続する必要があります。







 const {MailParser} = require('mailparser');
      
      





onData



関数を改良します。







 function onData(stream, session, callback) { const parser = new MailParser(); stream.pipe(parser); parser.on('error', callback); parser.on('end', (mail) => { // Process mail body... callback(); }); }
      
      





解析の結果、次のようなオブジェクトを取得します。







 { "html": "<div>Hi this is a test message. Notify me if you get it</div>\n", "headers": { "received": [ "from mxback5g.mail.yandex.net (mxback5g.mail.yandex.net [77.88.29.166]) by forward17p.cmail.yandex.net (Yandex) with ESMTP id 372CD212FE for <c28ec25d@hm.rumk.in>; Sat, 5 Nov 2016 06:22:23 +0300 (MSK)", "from web20g.yandex.ru (web20g.yandex.ru [95.108.253.229]) by mxback5g.mail.yandex.net (nwsmtp/Yandex) with ESMTP id j2CjR0Q3Ek-MN2SfLo3; Sat, 05 Nov 2016 06:22:23 +0300", "by web20g.yandex.ru with HTTP; Sat, 05 Nov 2016 06:22:23 +0300" ], "from": "Some User <user@host>", "to": "c28ec25d@hm.rumk.in", "subject": "asdasd a", "mime-version": "1.0", "message-id": "<7119991478316143@web20g.yandex.ru>", "x-mailer": "Yamail [ http://yandex.ru ] 5.0", "date": "Sat, 05 Nov 2016 06:22:23 +0300", "content-transfer-encoding": "7bit", "content-type": "text/html" }, "subject": "Test message", "messageId": "7119991478316143@web20g.yandex.ru", "priority": "normal", "from": [ { "address": "user@host", "name": "Some User" } ], "to": [ { "address": "c28ec25d@hm.rumk.in", "name": "" } ], "date": "2016-11-05T03:22:23.000Z", "receivedDate": "2016-11-05T03:22:23.000Z" }
      
      





spamassassinモジュールを接続してspamScore spamScore



を計算することもできspamScore



。 これを行うには、spamassassinとspamc-streamモジュールをインストールする必要があります。 mailparserと同じくらい簡単に使用できます。







これを行うには、spamassassinをインストールして実行します。







 # Debian/Ubuntu $ sudo apt-get install spamassassin # Fedora/CentOS $ sudo yum install spamassassin
      
      





Spamassassinには一連のルールが含まれており、それぞれがレターに適用されます。ルールが機能する場合、インデックスが増加します。 インデックスが許容値(通常5)を超えると、メッセージはスパムとして認識されます。 たとえば、文字にテキストなしのhtmlバージョンのみが含まれる場合、インデックスは増加します。 Spamassassinは、分析のために電子メールがリダイレクトされるサーバーです。 Smapcはsmapassassinのクライアントです。 最初に手紙をspamassassinにリダイレクトし、次にパーサーにリダイレクトします。







 const SpamcStream = require('spamc-stream'); const spamc = new SpamcStream(); //   onData(stream, session, callback) { const reporter = spamc.report(); let report; const parser = new MailParser(); stream.pipe(reporter).pipe(mailparser); reporter.on('report', (result) => { report = result; }); parser.on('end', (mail) => { if (report.isSpam) { // Save mail into spam directory } else { // Process mail body... } callback(); }); reporter.on('error', callback); parser.on('error', callback); }
      
      





また、メッセージパーサーは添付ファイルからストリームを作成できるため、便利かつ効率的にBLOBストアにリダイレクトしたり、単にディスクに書き込むことができます。







ご注意



無制限の数の送信者からのメールを受け入れる場合は、SPFおよびできればDKIMのチェックのサポートを実装する必要があります。 しかし、これは別の記事の資料です。









どのように動作するはテストページで確認できます 。 一時的な電子メールにレターを送信すると、JSON構造がさらに処理できるようになります。 メッセージはWebSocketを介してリアルタイムで配信されます。 この例のソースコードは、 rumkin / hypemailリポジトリに投稿されています







サーバーとパーサーの作成者はAndris Reinmanで、コミットでプロジェクトをサポートします。








All Articles