自分の一時メール:電報ボット

多くの場合、新しいツールと機能を使用して、これまでに経験したことのない、まったく普通ではないものを実験して実装したいという要望があります。 一時的なメールサービスを電報ボットの形で作成するというアイデアは、私にとって非常に興味深いものでした。



少しの背景
少し前まで、私は通常のホスティングからVPSに移行しました。そのため、1か月以上経った後、再び別のVPSに移行する必要がありました。 どちらの場合も、最も安い料金プランとUbuntu 16.04がありました。 前回、私は大学の端末に遭遇しましたが、これは完全に経験不足に等しいため、DigitalOceanからの優れたステップバイステップの手順を使用してVPSを設定しました英語を知っている)。 そして、はい、最初のVPSはDOでしたが、主にそのIPアドレスの一部がILVの配布に該当したため、私は再び移動する必要がありました。 LAMPのセットアップ手順を数回繰り返した後、VPSターミナルに少し慣れ、そのさらなる開発の一環として、たとえば、独自の一時的なメールサービスを作成するなど、通常とは異なる実験に切り替えることにしました。



私はバックエンドで、特にPHP MySQLで電報ボットを作成した経験がありますが、「自分」の電子メールを受信するためには、あまり理解できませんでした。 トピックに関するさまざまな記事でいくつかのタブを開いた後、私は何も理解していないことに気付きました。 あらゆる場所でさまざまなツールを使用することが提案されましたが、VPSで受信メールメッセージを受信するタスクよりも本格的なメールサービスに適していると思います。



受信トレイを受信



最初のステップとして、サンドボックスからの記事が非常に役立ちました: habr.com/en/post/260429 。 私は彼女の否定的な評価に注意を引きましたが、それは私が興味を持っているものを正確に説明しています。 私はできるだけ早く「感じる」ことができる結果を得たいと思っていたので、「将来的には正しくやる」という考えでsendmailを設定しました。



次に、ドメインをセットアップします。 DNSレコード:



example.com IN MX 5 mail.example.com





mail.example.com IN A XXX.XX.XXX.XXX



(IPアドレスVPS)



サーバーで、行@example.com vasya



/etc/mail/virtusertable



ファイルに追加しました。これにより、 @example.com vasya



すべてのアドレス宛てのすべてのメールがVasya宛てであると判断されます。



phpスクリプトで受信メールを処理するには、ファイル/etc/aliases



vasya: "|php -q /home/vasya/mail.php"



行を追加し/etc/aliases



vasya: "|php -q /home/vasya/mail.php"







いくつかのテストを行い、受信メールがphpスクリプトに渡されることを確認した後、その処理に対処できました。



上記の方法でphpに送信された未加工の受信メールを取得することは、非常に簡単にコードに実装されています。



 $msg = file_get_contents("php://stdin");
      
      





まったく異なる問題は、メール形式の分析と、理解可能でアクセス可能な方法でのデータの表示です。 Googleは、PHPを使用してメール形式を解析する方法に関するいくつかのオプションを提供してくれました。 私が見つけたすべてのライブラリは、追加コンポーネントのインストールに引きずり込まれましたが、そのうちの1つはあまり面倒ではないようでした: github.com/zbateson/mail-mime-parser 追加でインストールする必要があるのは、人気のPHP用パッケージマネージャーであるComposerだけでした。 もちろん、通常のホスティングでは発生しませんでしたが、インストールしてメールを解析するためにライブラリをさらに接続することはまったく難しくありませんでした。



zbateson / mail-mime-parserライブラリを使用して受信メールを処理するphpスクリプトの始まりは次のようになります。



 <?php require("vendor/autoload.php"); use ZBateson\MailMimeParser\MailMimeParser; use ZBateson\MailMimeParser\Message; $msg = file_get_contents("php://stdin"); $parser = new MailMimeParser(); $message = Message::from($msg);
      
      





私の意見では、一時メールには複数の受信者が関与していないため、可能な受信者のうち最初の受信者のみを取得すれば十分です。



 $to = $message->getHeader('To'); $email = $to->getAddresses()[0]->getEmail();
      
      





変数$ emailには、vasyaorpetya @ example.comという形式の受信者アドレスがあります。



ライブラリ内の受信レターのコンテンツを受信するには、適切な方法があります。



 $from = $message->getHeader('From')->getEmail(); $subject = $message->getHeaderValue('Subject'); $msg_text = $message->getTextContent(); $msg_html = $message->getHtmlContent();
      
      





電報ボット



電報一時メールボットは最初に何ができるはずですか?



  1. リクエストに応じて新しい一時メールアドレスを発行する
  2. メールアドレスが有効なときにこのメールのチャットメッセージを送信します
  3. メールアドレスを更新


この場合やテレグラムから更新を受信する他の多くの場合に非常に適した方法は、Webhookを使用することです。 httpsを含むスクリプトアドレスのみが必要です。 Certbotを使用してSSLドメイン証明書を構成する方法については、DOの手順で詳しく説明されています。



Telegram Bot APIと対話するには、独自のベストプラクティスを使用します。 人気のあるライブラリの使用を好む人がいます。 多くの記事が書かれているように、ボタン付きのメッセージを電報に送信することは長い間おなじみのものになっています。



一時的な電子メールアドレスの生成は、本質的に次のアドレスの出力です。 データベース内に電子メールアドレス用のテーブルを作成しました。自動インクリメントを含むint型のIDは、受信者を一意に識別します。 数値IDの文字列アドレスへの変換は、数値が別の数値システムに変換されるときに実行されます。ラテンアルファベット全体が「数値」として使用できます。 数字と比較して26文字を使用すると、識別子の長さを大幅に短縮できます。 おそらく、発行された住所の長さをさらに短縮するために、大文字、数字、および一部の文字を問題なく使用することもできましたが、小さなラテン文字のみを残しました。



数値IDを文字列に、またはその逆に変換する関数:



 // $alphabet = explode(",", "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z"); //   @grayfolk: $alphabet = range('a', 'z'); function num2str($n, $a) { // $a -  $b = count($a); $r = 0; $x = ""; while ($n) { $r = $n%$b; $n = ($n-$r)/$b; $x .= $a[$r]; } return strrev($x); } function str2num($s, $a) { $n = 0; $b = count($a); $s = strrev($s); for ($i = 0; $i < strlen($s); $i++) { $n += array_search($s[$i], $a) * pow($b, $i); } return $n; }
      
      





一時メールサービスを使用する主な利点の1つは、スパムがないことです。 ただし、住所が正しい場合は、発行される最も近い住所のリストを作成し、郵送を正常に行うことができます。 この問題を解決するために、受信者IDにランダムな文字列を追加しました。 idとアドレス内のランダムなコンポーネントを区別するために、ランダムなコンポーネントを常に数字で開始することにしました。



発行された電子メールアドレスのランダムな行は、受信者ID、電報のユーザーID、およびメールボックスが発行された時刻とともにデータベースに書き込まれます。



受信したメールを保存する必要さえないようです。彼らはそれを電報に送信しました。それだけです。 しかし、htmlレターはどうでしょうか? チャットメッセージに表示することはできません。 受信したhtmlメッセージをデータベースに記録してサイトに表示し、メッセージIDと次に生成されたパスワードを含むリンクをユーザーに送信します。 スケジュールに従ってクラウンを使用してデータベースをクリーンアップするために、1時間以上前に受信したhtmlメッセージを削除するphpスクリプトが起動されます。



後で、ボットの電報に、メールボックスの有効期間を10分または60分延長するボタンと、着信メッセージの受信が停止するまでにどれだけの時間を必要とするかを確認できるボタンを追加しました。



登録ユーザーを電報で処理しているため、古いメールボックスをアクティブ化する機会を提供できます。たとえば、Webサイトでパスワードを忘れた場合や、電子メールによる確認が必要なその他の操作のために使用できます。 発行されたメールボックスは、ユーザーが必要とする場合にのみ着信メッセージを「受け入れます」;残りの時間、スパムの可能性は無視されます。







将来のウィッシュリスト:





参照資料



電報ボット:@tmpmailbot



sendmailの構成を説明する記事



メールを解析するためのPHPライブラリ



All Articles