このチュートリアルでは、PHP と IMAP を使用して、大手電子メール プロバイダーがまだ構築していない電子メールを管理するための新しい機能を構築する方法の実例をいくつか示します。
私がこれに興味を持ち始めたのは、2010 年に「電子メールに革命を起こすための 12 の Gmail アイデア (再び)」を書いたときでした。しかし、私が望んでいたアイデアのほとんどはまだ手の届かないところにありました。その重要性にもかかわらず、アプリケーションとしての電子メールは革新がかなり遅れています。
私たちには電子メールが殺到しており、受信トレイの管理は依然として大きな負担となる可能性があります。この点に関しては、メール サービスと顧客はほとんど協力してくれませんでした。私たちが受け取る電子メールのほとんどは人間ではなく機械によって送信されていますが、私たちはそれらすべてに個別に対処しなければなりません。
私自身のメールを分析したところ、230 を超える自動送信者からメールを受信していることがわかりましたが、実際の送信者の数ははるかに少ないです。 Gmail でフィルターを作成したり、無数の配信停止フォームに記入したりするのにはうんざりしています。メール管理をもっとコントロールして、生活を簡素化したいと考えています。
最後に、私はこの 1 年間で、必要な機能を構築することにしました。その結果、Simplify Email (SE) が誕生しました。これは、さまざまなクールな新しい電子メール機能を提供する、自分でホストできる小さな Web アプリです。そのすべては、プロジェクト Web サイトで確認できます。
SE の優れた点は、電子メールの読み取り、分析、ルーティング、管理のためのプラットフォームであることです。可能性はたくさんあります。 Simplified Email は基本的に、自分のメールを「ハッキング」するためのプログラム可能な遊び場です。
PHP、IMAP、MySQL を使用した SE での電子メール処理の 3 つの例のコードを説明します。
このチュートリアルは、PHP で IMAP コードを記述する上で確実に有利なスタートを切ることができます。ただし、Simplify Email コードベースを直接使用することもできます。コードはわずか 10 ドルで購入でき、古いオープン ソース バージョンもあります (これには、以下で説明する機能の一部がありません)。一般的な Linux 構成のインストール手順が提供されます。また、Digital Ocean でプリインストールされたイメージを 25 ドルで提供し、ハンドヘルドの係員によるインストールも提供しています。 SE は Yii フレームワーク内の PHP で書かれています。
PHP 用に安全な IMAP ライブラリをコンパイルしない限り、ローカル開発マシンからほとんどの電子メール サーバーにアクセスできないことに注意してください。これが、私が Digital Ocean のドロップレットとして Simplify Email を実行することをお勧めする理由の 1 つです。 IMAP 経由でアクセスするときに Google アカウントを安全に保つためのヒントもいくつかあります。
SE を使用すると、Web およびモバイル デバイス上で選択した電子メール クライアントを引き続き使用できます。アプリケーションや個人的な習慣を変更する必要はありません。 SE は IMAP 経由でバックグラウンドでユーザーの電子メール アカウントにアクセスし、インテリジェントなパーソナル アシスタントとして電子メールを前処理し、ユーザーの指示に基づいてメッセージを適切な場所に移動します。
おなじみの送信者からメッセージが到着すると、SE はそのメッセージを指定したフォルダーに移動します。不明な送信者が初めてメッセージを受信すると、そのメッセージはレビュー フォルダーに移動されます。
SE は数時間ごとに (または選択した頻度で)、メッセージの移動先とレビュー中のメッセージの概要を送信します。監査フォルダーにはトレーニング送信者へのリンクが含まれているため、長期にわたって SE を非常に簡単にトレーニングできることに注意してください。
レビュー フォルダーはいつでも参照できます。概要が届くまで待つ必要はありません。ただし、SE の利点は、フォルダーを参照する必要がなくなり、概要を読むだけで受信メールを表示し、新しい送信者をトレーニングできることです。
###1。受信箱を確認してメッセージをフィルタリングするDaemonController.php から呼び出されます。
processInbox は頻繁に呼び出されるため、迅速に実行する必要があります。その仕事は、電子メールを選別し、受信トレイからできるだけ早く分類されたフォルダーに移動することです (フィルタリングと呼ばれます)。フォルダ。
processFiltering は、より処理集約的で、電子メールに対してより詳細な操作を実行し、最終的にメッセージを最終宛先に移動します。
processInbox を定期的に呼び出します:
リーリー
アカウントごとに、メール認証情報を復号化し、imap_open を使用して受信トレイ フォルダーへの IMAP ストリームを作成します。 リーリー
processInbox では、PHP ライブラリ関数 imap_search および imap_fetch_overview を使用してメッセージ配列を取得します。
リーリー
リーリー
これは、SE がさまざまなタスクを完了するために必要な追加情報を収集する、公開されている IMAP ヘッダー解析コードの適応バージョンです。基本的に、imap_rfc822_parse_adrlist を使用して受信者情報、メッセージ ID、件名、タイムスタンプ (または送信フォルダーをスキャンする場合は送信者情報) を決定します。 リーリー送信者とメール封筒のレコードをデータベースに作成します:
リーリー送信者が初めて (不明) の場合、ホワイトリスト チャレンジ メールを送信します (ホワイトリスト チャレンジについては、次のセクションで詳しく説明します):
リーリー次に、ユーザーがドラッグ アンド ドロップのトレーニングを目的として、メッセージを別のフォルダーから受信トレイにドラッグした可能性があるかどうかを判断します。その場合、この送信者のトレーニングを受信トレイに設定します。言い換えれば、次回はこの送信者からのメールを受信トレイにのみルーティングしたいと考えます:
リーリーそうでない場合は、さらに処理するためにメッセージをフィルター フォルダーに移動する準備をします。まず、通知の送信者が一致するか、キーワードが一致する場合 (静かな時間ではない場合)、ユーザーの電話に通知を送信します。 リーリー
メッセージが受信トレイにドラッグされると、トレーニング設定が更新されます:リーリー
プロセスフィルタリングメソッド二次処理メソッドは
DaemonController.php にもあります。メッセージを適切なフォルダーに移動するという、より時間のかかる作業を実行します:
リーリー
この方法では、電子メール アカウントを開いて、最近のメッセージを検索し、それらに関するデータを収集します。また、
imap_search
imap_fetch_overview、
parseHeader:
も使用します。
リーリー
フィルター フォルダー内の各メッセージのメイン処理ループは非常に詳細です。最初に受信者アドレスを確認します。SE では受信者アドレスによってフォルダーをトレーニングできるため、たとえば、happyvegetarian.com ドメインに送信されたメッセージは veggie フォルダーに送信されます。
リーリー
次に、送信者を検索し、データベースに新しいレコードを作成します (必要な場合)。送信者のトレーニングが存在する場合、ターゲット フォルダーを設定できます:
トレーニングを受けていない (新しい) 送信者がホワイトリスト チャレンジ (以下の次のセクションで説明します) を介して自身を認証した場合、このメッセージは受信箱にルーティングされます。 リーリー
次に、このメッセージに関するエンベロープ情報を含むメッセージ エントリをデータベースに作成します。リーリー
メッセージが未知の未検証の送信者から送信された場合、メッセージをレビュー フォルダーに移動できます。レビュー フォルダーには、認識できない送信者からのすべてのメッセージが含まれています。メッセージが既知の送信者からのもので、宛先が決まっている場合は、静かな時間帯でない限り (および「おやすみモード」がオフになっている場合) に限り、メッセージを移動できます。 リーリー 静かな時間帯には、メールは主にフィルターされたフォルダーに保存されます。
数時間ごとに、別のプロセスがメッセージ テーブル レコードを使用してメッセージ ダイジェストを構築し、最近受信してフィルタリングされた電子メールとそのルーティング方法を特定します。
###2。不明な送信者に対するホワイトリスト チャレンジを実装するホワイトリスト チャレンジの目標は、受信トレイに存在する可能性のあるマーケティング ボットやスパマーなどの不明な送信者からのメッセージをすべて保持することです。 SE は、不明な送信者からのメッセージをレビュー フォルダーに配置します。ただし、ホワイトリスト登録を有効にすると、送信者に本人であることを確認する機会を与えるためにチャレンジメールが送信されます。彼らが返信した場合、メッセージは受信箱に移動されます。電子メールが不要であることが判明した場合は、ダイジェストからメッセージを削除するか、トレーニング先のフォルダーにメッセージをドラッグできます。
ユーザーは設定でホワイトリストのオンとオフを切り替えることができます:
ホワイトリストを実装するには、新しい送信者がメッセージを受信するたびに、電子メールチャレンジを送信します:
リーリー ChallengeSenderユーザーがクリックできるように、エンコードされたリンクをユーザーに送信します。また、不在時のメッセージによるメール ループに陥らないように、いくつかの安全策も講じています。 リーリー 次に、受信者がエンコードされたリンクをクリックすると、データベース内でそのリンクが検証されます。送信側コントローラーはこれらのリクエストを処理し、その有効性をチェックします:
リーリーこれは、このメッセージと今後のメッセージをこの送信者から受信箱に移動するように処理ループに指示します。
有时,查看您已发送但未收到回复的消息摘要会有所帮助。为了识别这些邮件,Simplify Email 会监视已发送但尚未收到回复的邮件。
我们收到的每条消息都包含一个唯一的 ID,称为 message_id(IMAP 规范的一部分)。它通常看起来像这样:
Message-Id: <CALe0OAaF3fb3d=gCq2Fs=Ex61Qp6FdbiA4Mvs6kTQ@mail.gmail.com>
此外,当发送消息以回复其他消息时,它们有一个 in_reply_to
字段,该字段链接回原始 message_id
。
因此,我们使用 SQL 查询来查找所有收到的消息,这些消息没有引用其 message_id
的相应回复消息。为此,我们在没有 in_reply_to
id 的情况下使用 LEFT OUTER JOIN:
public function getUnanswered($account_id,$mode=0, $range_days = 7) { if ($mode==0) $subject_compare = 'not'; else $subject_compare = ''; $query = Yii::app()->db->createCommand("SELECT fi_sent_message.id, fi_sent_message.recipient_id as sender_id,fi_sent_message.subject,fi_sent_message.udate,fi_message.in_reply_to,fi_sent_message.message_id FROM fi_sent_message LEFT OUTER JOIN fi_message ON fi_message.in_reply_to = fi_sent_message.message_id WHERE fi_sent_message.account_id = ".$account_id." AND fi_message.in_reply_to is null and fi_sent_message.udate > ".(time()-(3600*24*$range_days))." and fi_sent_message.subject ".$subject_compare." like 'Re: %' ORDER BY fi_sent_message.udate DESC")->queryAll(); return $query; }
我们使用 $subject_compare
模式来区分我们发送的尚未回复的消息和我们发送给尚未回复的线程的回复。以下是您帐户中的未回复消息报告:
SE 还将此信息作为可选摘要提供,称为未回复电子邮件摘要。您可以每天、每隔几天或每周收到它。
我们还使用类似的 SQL 表格和 Google Charts 来提供有关某些人向您发送电子邮件的频率的报告:
public function reportInbound($account_id,$range=30,$limit = 100) { $result= Yii::app()->db->createCommand('SELECT fi_sender.personal, fi_sender.email,count(sender_id) as cnt FROM fi_message LEFT JOIN fi_sender ON fi_sender.id =fi_message.sender_id WHERE fi_sender.account_id = :account_id AND fi_message.created_at > DATE_SUB( NOW() , INTERVAL :range DAY ) GROUP BY sender_id ORDER BY cnt desc LIMIT :limit ')->bindValue('range',$range)->bindValue('account_id',$account_id)->bindValue('limit',$limit)->queryAll(); return $result; }
我很快就会撰写更多有关 Tuts+ 的 Google Charts 的文章。
我希望您已经发现 Simplify Email 足够有趣,可以尝试 PHP IMAP 编程。您可以构建许多很酷的功能,而不需要大型电子邮件提供商做任何新的事情。
如果您有任何疑问或更正,请在评论中提出。如果您想继续关注我未来的 Tuts+ 教程和其他系列,请关注 @reifman 或访问我的作者页面。您也可以在这里联系我。
以下是一些您可能会觉得有用的附加链接:
以上がIMAP と PHP を使用して高度な電子メール機能を構築するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。