web-dev-qa-db-ja.com

メールをApache / phpサーバーにプッシュする

電子メールメッセージを常にチェックする必要があるWebサービスを構築しました。基本的に、ユーザーは私たちに電子メールを送信し、サーバーはその電子メールに基づいてアクションを実行する必要があります。 POPを使用して毎分新しいメッセージをチェックするcrontab PHPスクリプトを使用できます。しかし、これはpopserverにとって不快であり、あまり効率的ではありません(1分は長すぎます)。

しかし、私はモバイルデバイスの周りでIMAPを使用したプッシュ型電子メールについて読みました。私の場合、モバイルデバイスではなく、Webサーバーです。

メールをウェブサーバーにプッシュしてPHPスクリプトを実行させることはできますか?GmailをPOP/SMTP/IMAPサーバーとして使用しています。

EDIT 1回答から、次のことがわかりました。

  1. 電子メールをチェックする私のウェブサーバー上に24時間年中無休の実行プロセス(デーモン)がなければなりません

  2. このデーモンは、i)POPとNOOP、またはii)IMAPとIDLEを使用してGmailと通信できます。

最高は何ですか? POPまたはIMAP? GoogleはIMAPの使用をもっと勧めているようです。

Gmailを使いすぎたくない(メールをチェックするための「フェアユース」とは何ですか?10秒ごとですか?

ありがとう!

3
Trident Splash

POP3を使用して接続を開いたままにすると、新しいメッセージが表示されない場合があります。仕様の一部であるかどうかは思い出せませんが、私が扱ったPOP3サーバーは、基本的にメールボックスをロックします。 POP3セッションであるため、POP3セッションが開いている限り、新着メールは到着しません(表示されます)(STATとUIDL、およびLISTとLASTは、終了して再ログインするまで常に同じ応答を返します)。

IMAPを使用している場合は、IMAP接続を開いたままにして、定期的にポーリングして新着メールを探すことができるはずです。これは、(たとえば)10秒ごとに実行する場合は、ログイン、チェック、および切断よりもはるかに安価です。

フロントエンドWebサーバーでポーラーを実行しません。変更をポーリングするバックエンドの長時間実行プロセス(デーモン)があり、メッセージパッシングシステムを介してフロントエンドWebサーバーのPHPアプリに通信します(「メッセージパッシングシステム」は共有データベースのテーブルにリクエストとステータス情報を書き込むのと同じくらい簡単です)。

必要に応じて、ポーラーデーモンをPHPに記述できます。このプロセスをさらに使いこなして、メールボックスの変更に適応させることができます。ユーザーのメールボックスが絶えず変更される場合は、接続を維持して頻繁にポーリングします。メールボックスが変更されない場合は、IMAP接続を切断し、5分後にもう一度確認します。

ジェームズ

3
jwa

Webサーバーを制御している場合: gmailを使用して電子メールをWebサーバーに転送し、/ etc/aliasesファイルのパイプを使用して電子メールを読み取り可能なphpスクリプトにフィードできます。標準から。(または、選択した電子メールサーバー(MTA)のスクリプトに電子メールをパイプする同等のメカニズム。私は個人的にeximを使用します。)基本的に、エイリアスファイルは次のようになります。

username: |/var/www/myphpscript.php

myphpscript.phpは、STDINの電子メールを読み取り、それに基づいて動作します。

Webサーバーを制御していない場合: IMAPはIDLEコマンドをサポートしており、電子メールの到着を待っている間にクライアントがサーバーへの接続を開くことができます。 (これは、クライアントがサーバーへの開いた接続を確立して維持する必要があることを除いて、プッシュ通知にいくぶん似ています)Gmail IMAPサーバーへの接続を開き、IDLEコマンドを使用して新しい電子メールを待つスクリプトを書くことができます。これには、サーバー上で永続的なプロセスを実行する機能が必要になります。 fetchmailのようなものを使用してこれを実行し、その電子メールをphpスクリプトに渡す方法があるかもしれません。

お役に立てば幸いです。

2

独自のメールサーバーをホストしている場合は、 procmail のようなものを使用できます。メールの処理を自動化するオプションはないと思います。

1
Jim Blizard

メールサーバーの管理者権限を持っている場合は、daemon/Perl/Shell/phpスクリプトを記述してファイルの存在を確認し、5秒間スリープしてから(または気になる間隔を短くして)確認してください。再び。これが「プッシュ」メールサーバーが行うすべてのことであり、複雑さの層を排除することになります。

[〜#〜]編集[〜#〜]

すみません、誤解しました。あなたがポップサーバーを制御していると思いました。

ポップサーバーが実行しているソフトウェアを知っていますか?それが何らかのプッシュメカニズムをサポートしているかどうかを知るのに大いに役立ちます。

編集2

これをチェックしてください: http://www.phpclasses.org/browse/package/2.html

アイドル状態の接続がタイムアウトするのを防ぐために、「NOOP」をサポートしています。 PHP POP3クライアントを実装するために必要なもののように聞こえます。

1
Matt Simmons

POPをプッシュすることはできません。これは、厳密に入手できるプロトコルです。

Gmailの代わりに独自のメールサーバーを使用できますか?それができない場合、GMailはメールの自動転送を許可しますか?いずれの場合も、メールサーバーを設定して、その受信メールに基づいてアクションをトリガーできます。

0
John Gardeniers

私の答えはおそらくsysadminよりもプログラミング関連です...

Google APIを介して、メールが利用可能になるまで基本的に待機する、長期間有効なhttpリクエストを開始するスクリプトを作成できる可能性があると思います。

ほとんどの「プッシュ」メールはクライアントが開始します。クライアントは新しいメールを要求するHTTPリクエストを作成し、サーバーは存在する場合に応答を送信します。

60秒の待機時間が長すぎる場合は、Gmailを使用するという決定を再検討することをお勧めします。 Gmailは通常の使用にはかなり適していますが、メッセージの即時配信は、システムが実行に集中しているものではないようです。 Googleは、メッセージの迅速な配信について多くの保証を提供していません。

独自のサーバーを実行している場合は、メッセージをプロセスに配信するようにメールサーバーを構成するための多くのオプションがあります。そのメールサーバーのドキュメントを確認してください。

0
Zoredache