電子メール経由で Web アプリケーションを制御するにはどうすればよいですか?または、メールを送信してphpスクリプトを実行する方法はありますか?

StackOverflow https://stackoverflow.com/questions/46777

  •  09-06-2019
  •  | 
  •  

質問

CakePHP フレームワークを使用して、php と mysql で Web アプリケーションを実行したいと考えています。また、サイト利用の敷居を低く保つために、ユーザー名とパスワードによる標準のログインは使用したくないのです。(そして、OpenID のようなものでユーザーに迷惑をかけたくありません。ユーザータイプに進みます。)

そこで、ユーザーは件名や内容を必要とせずに、login@domain.com にメールを送信することでログインできるようにしたいと考えています。そして、返信として、ログインするためのリンク (ハッシュが含まれる) が記載された電子メールが届きます。また、ユーザーがサイトにまったくアクセスせずにいくつかのアクションを実行できるようにします。command@domain.com を使用して電子メールを送信するだけで、コマンドが実行されます。ユーザーとその電子メール プロバイダーが電子メール アカウントのセキュリティを管理しているため、私のサイトではその必要がないと仮定します。

さて、人間が読まないアカウントに電子メールが送信されてから、いくつかのスクリプトが起動されるまではどうすればよいでしょうか(基本的に、「ダミーブラウザクライアント」がURLを呼び出します(そして、cakephpが残りを処理します))。


これまで cron ジョブを使用したことはありませんが、その目的や一般的な動作については理解しているつもりです。この解決策はいくつかの理由で機能しないため、サイトを訪問するランダムな人々がスクリプトを呼び出すことはできません。受信した電子メールへの応答としてスクリプトを実行する可能性について、誰かがそれについて何らかの意見を持っている場合は、さらに詳しく聞きたいと思います。cron ジョブとして実行すると、X 分ごとにのみチェックされ、ユーザーの応答に遅れが生じます (私が正しく理解している場合)。

コマンドごとに異なるメールアドレスが存在するため、次のようになります。 ログイン@domain.com と私は、送信者のメールに基づいて何をすべきか、またその方法を知っています。メールの内容、件名、その他のヘッダーさえ必要ありません。


このアプリケーションのセキュリティについては多くの懸念があり、問題は理解していますが、私のコンセプトを明かすまでもなく、それが私がやっていることにとって大きな問題であるとは思いません。ユーザビリティの問題についても、実際には何もありません。必要に応じてユーザー プロファイルに変更を加えるためにログインするだけで、もう 1 つのコマンドが必要になります。これがメインのメールであり、非常に覚えやすく、この概念全体の始まりです。

役に立ちましたか?

解決

私が使用したのは、 Pop3 PHPクラス 大成功を収めました( Pear POP3 モジュール).

Pop3 クラスの使用は次のようになります。

require ('pop3.php');

$pop3 = new pop3_class();
$pop3->hostname = MAILHOST;
$pop3->Open();
$pop3->Login('myemailaddress@mydomain.com', 'mypassword');

foreach($pop3->ListMessages("","") as $msgidx => $msgsize)
{
    $headers = "";
    $body = "";

    $pop3->RetrieveMessage($msgidx, $headers, $body, -1);
}

データベースにフィードする POP3 メールボックスを監視するためにこれを使用します。

これは、wget を使用して私の php スクリプトへの URL を呼び出す cronjob によって呼び出されます。

*/5 * * * * "wget -q --http-user=me --http-passwd=pass 'http://mydomain.com/mail.php'" >> /dev/null 2>&1

編集

ユーザーに特定のサイト コマンドを電子メールで送信させる必要性について考えています。

複数のアドレスを持つよりも、複数のコマンドを送信できる単一のアドレスを持つ方が簡単ではないでしょうか?

セキュリティ上の懸念もかなり妥当だと思います。コマンドが非破壊的であるか、ユーザー固有のことを何も行っていない限り、システムは電子メール アドレスを偽装する方法を知っている人であれば誰でも利用できます (これは誰でも可能です :) )。

他のヒント

メールボックスを定期的にチェックしてそれに基づいて動作する、ある種の CronJob/Timer サービスが必要になります。あるいは、メールの到着時にメールサーバーがスクリプトを実行できるかどうかを確認する必要があります(つまり、spamfilter スクリプトを組み込み、その機能を「悪用」して代わりにスクリプトを呼び出すことが可能かどうかを確認してください)。

純粋な PHP では、何かがスクリプトをトリガーする必要があるため、ほとんどの場合運が悪いです。トラフィックが多いページでは、index.php などでチェックを行うこともできますが、サイトに長期間アクセスしないとメールは送信されないため、「競合」に注意する必要があります。条件」は、複数の人が同時にスクリプトにアクセスしている場合に発生します。

編集: ユーザビリティ上の欠陥が 1 つあることに留意してください。複数の PC を持っていて、すべての PC に電子メール クライアントをインストールしていない人。たとえば、私は 4 台の PC を使用していますが、メール クライアントがインストールされているのは 1 台 (メインの PC) のみで、他の PC は Web メールを使用して確認しています。さて、Web メール経由でログインしてメールを送信することは、最高の使いやすさではありません。あなたのサイトを使用するには、まず別のサイトにログインし、ほとんどの Web メール ツールにあるくだらないインターフェイスでメールを作成し、応答を待つ必要があります。そこで OpenID を使用することもできます:-)

サーバーが許可している場合は、 。フォワード ファイルまたは プロメール メールが特定のアドレスに到着したときにプロセス (php など) を開始します。

OpenID でユーザーを煩わせたくはありませんが、この電子メール スキームには対処してもらいたいと考えています。まず、電子メールは送信に時間がかかることがあります。電子メールが配信される保証時間はありません。電子メールがそこに届くという保証さえありません。通常はすぐに処理が完了することはわかっていますが、往復が完了するまでに最大 10 分かかることも珍しくありません。また、電子メールを暗号化していない限り、返信するリンクは公開された状態で送信されます。つまり、誰でもそのリンクを使用してログインできるということです。どれだけ安全性を確保したいかによって、これが問題になる場合もあればそうでない場合もありますが、考慮する必要があることは間違いありません。このような非標準のログイン方法を使用すると、おそらく価値があるよりもはるかに多くの作業が必要になり、プロセス全体にとって何の利点もありません。

また、procmail を使用してスクリプトを開始することも考えていました。ヘッダーを変更または抽出するのに便利な formail もあります。メール サーバーへの管理者アクセス権がある場合は、/etc/aliases を使用して、スクリプトにパイプすることもできます。

ユーザビリティの問題に加えて、セキュリティについても真剣に考慮する必要があります。偽の送信者アドレスを使用して電子メールを送信するのは実際には非常に簡単なので、重要なことについてはそれに依存しません。

私はセキュリティに関するすべての懸念に同意します。「ユーザーとその電子メール プロバイダーが電子メール アカウントのセキュリティを管理している」というあなたの仮定は、送信者の電子メール アドレスに関しては正しくありません。

ただし、「人間が読まないアカウントに電子メールが送信されてから、スクリプトが起動されるまでどうすればよいか」という具体的な質問があるため、procmail を使用して受信電子メールを作成したスクリプトに配信することをお勧めします。

URL を呼び出すつもりはありません。標準入力で送信されたメッセージを読み取って、スクリプトに作業を実行させます。そうすることで、Web サイト上の誰もがスクリプトにアクセスできなくなります。

これを設定するには、ユーザーに提供する電子メールアドレスをシステム上の実際のユーザーに関連付ける必要があります。そのユーザーのホーム ディレクトリに、「.procmailrc」というファイルを作成します。

そのファイルに次の 2 行を追加します。

:0 hb:
| /path/to/program

ここで、/path/to/プログラムは、着信メッセージを処理するためのスクリプトまたはプログラムへの完全なパスです。次に、次のようなコードでスクリプトを作成します。

#!/usr/bin/php
<?php

$fp=fopen('php://stdin','r');
while($line = fgets($fp)) {
    [do something with each $line of input here]
}

?>

電子メール メッセージはメールボックスには残らないため、保存またはログに記録したい場合は、スクリプトに実行させます。

--
ブルース

このアプローチを真剣に再検討したいと思います。電子メールの信頼性はそれほど高くありません。リンクを含む電子メールを傍受する可能性のあるあらゆる種類のスパムフィルターが存在し、セキュリティ リスクは言うまでもなく、「コマンド」が中途半端になってしまいます。

電子メールの差出人アドレスを偽装するのは非常に簡単です。基本的にシステムを誰にでも公開することになります。

また、ユーザー名とパスワードの組み合わせの代わりに、電子メール アドレスの前に置くコマンドのリストをユーザーに覚えさせることも突然要求されます。ユーザー名とパスワードを提供して、ヘルプ ページへのアクセスを許可する方がよいでしょう。

言い換えれば、このスキームの使いやすさとセキュリティのスコアは非常に低いということです。

このアプローチには、大きな欠点を上回るほどの利点がまったく見つかりません。

スパムを防ぐ 1 つの解決策は、最初の行、最後の行、または特定の行にパスワードのような特定の文字列が含まれていることを確認することですが、全文の方が良いです。

言葉を持っているのはあなただけです。非常に安全です。使用後のメールと秘密の回線のないメールは忘れずに削除してください。

セキュリティと使いやすさとは別に、電子メール配信には別の問題が発生する可能性があります。ユーザーの電子メール プロバイダーによっては、電子メールの配信が数分から数時間遅れる場合があります。

本当に素晴らしい教育的な話があります thedailywtf.com ソフトウェアの設計について。提起された問題は、手帳ウープラではなく、適切なデザインによって解決されるべきです。

アレクサンダー、リンク先の記事を読んで、電子メールによる Web ページの閲覧ではなく、手袋について考えてください。

PHP は ハンマー.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top