如何通过电子邮件控制Web应用程序?或者如何通过发送电子邮件来运行PHP脚本?

3
我想在CakePHP框架上运行一个使用PHP和MySQL的Web应用程序。为了让网站的门槛非常低,我不想使用标准的用户名/密码登录方式(也不想让用户麻烦地使用OpenID,这取决于用户类型)。因此,我考虑让用户通过发送邮件到login@domain.com进行登录,无需主题或内容即可登录。他们将收到一封带有链接的电子邮件,点击链接后将自动登录(其中包含哈希值)。此外,我还将允许用户执行某些操作,而无需访问网站,只需发送带有command@domain.com的电子邮件即可执行命令。我假设用户及其电子邮件提供商会注意他们的电子邮件帐户安全性,因此我的网站不需要处理此问题。
现在,如何从发送给一个不被人类阅读的帐户的电子邮件转换为触发某些脚本(基本上是“虚拟浏览器客户端”调用URL),然后CakePHP将处理剩下的事情?
我以前从未使用过cron job,但我认为我理解它们的目的或它们通常的工作方式。我不能让随机访问网站的人来调用脚本,因为这种解决方案由于几个原因而行不通。如果有人对电子邮件到来后脚本运行的可能性有任何意见,我想听听更多。如果它作为cron job运行,它将每隔X分钟检查一次,并且用户将在响应中遇到延迟(如果我理解正确的话)。
由于不同的命令具有不同的电子邮件地址,例如login@domain.com,我知道如何根据发送方电子邮件进行操作,因此我甚至不需要电子邮件的内容、主题或任何其他标题。
这个应用程序的安全性问题非常值得担忧,我了解这些问题,但是不想透露我的概念,我认为对于我正在做的事情来说这不是一个大问题。关于可用性问题,确实没有。它只是登录以提供用户配置文件的更改(如果/当他们需要),以及另一个命令。这是主要电子邮件,非常容易记住并且在整个概念的开始阶段。
10个回答

7
我曾经成功地使用过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邮箱,该邮箱输入到数据库中。
它由cronjob调用,使用wget调用我的php脚本的url。
*/5 * * * * "wget -q --http-user=me --http-passwd=pass 'http://mydomain.com/mail.php'" >> /dev/null 2>&1

编辑

我在考虑您需要用户通过电子邮件发送某些站点命令的需求。

是否有一个单一的地址可以发送多个命令,而不是有多个地址会更容易些呢?

我认为安全问题也很重要。除非这些命令是无害的或者不涉及任何特定用户的信息,否则系统将对任何知道如何欺骗电子邮件地址的人敞开大门(这将是所有人 :))。


3
你需要一个CronJob / Timer服务,定期检查邮箱并执行操作。或者,你应该检查邮件服务器是否可以在邮件到达时运行脚本(即查看是否可能将垃圾邮件过滤器脚本放入其中,并“滥用”该功能来调用你的脚本)。使用纯PHP时,大多数情况下你会很幸运,因为需要有一些东西来触发脚本。在访问量很大的页面上,你可以让index.php或其他文件进行检查,但是当有一段时间没有人访问你的网站时,邮件将不会发送,并且当多个人同时访问脚本时,你必须小心“竞态条件”。编辑:只需记住一个可用性缺陷:拥有多台电脑但不在每台电脑上安装电子邮件客户端的人们。例如,我使用4台电脑,但只有1台(我的主要电脑)安装了邮件客户端,我使用Webmail来检查其他电脑。现在,通过Webmail登录并发送邮件并不是最好的用户体验-为了使用你的网站,我首先必须登录到另一个网站,通过大多数Webmail工具都具有的糟糕的界面撰写邮件并等待回复。可能也可以在那里使用OpenID :-)

3
如果您的服务器允许,您可以使用.forward文件或Procmail启动一个进程(如php等),当邮件到达特定地址时。

1

我同意所有的安全问题。当涉及到发件人的电子邮件地址时,你假设“用户和他们的电子邮件提供商会负责他们的电子邮件帐户安全”,这是不正确的。

但既然你特别问了“如何从发送电子邮件到未读取人员的帐户到触发一些脚本”,我建议使用procmail将传入的电子邮件交付给你编写的脚本。

我不会调用URL。我会让脚本通过读取stdin中发送的消息来执行工作。这样,脚本对网站上的任何人都不可访问。

为设置这个,你为用户提供的电子邮件地址必须与系统上的真实用户相关联。在该用户的主目录中,创建一个名为“.procmailrc”的文件。

在该文件中,添加以下两行:

:0 hb:
| /path/to/program

/path/to/program 是处理传入消息的脚本或程序的完整路径。然后使用类似以下代码的代码创建脚本:

#!/usr/bin/php
<?php

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

?>

电子邮件消息不会保留在邮箱中,因此如果您想保存或记录它,请让脚本执行。

--
布鲁斯


一个有趣的想法。我采用了使用POP3连接的方法,这样我的代码就可以在共享托管环境中工作,在这种环境下你无法完全控制电子邮件的传递方式。 - Mark Biek

1

你不想用OpenID来麻烦用户,但是你希望他们使用这种电子邮件方案。首先,电子邮件可能需要很长时间才能传递。没有任何保证的时间可以确保电子邮件的投递。甚至不能保证电子邮件会被成功送达。我知道事情通常都很快,但是完成一次往返可能需要多达10分钟的时间,这并不罕见。此外,除非你加密了电子邮件,否则你发送回来的链接是公开的。这意味着任何人都可以使用该链接进行登录。根据你想要的安全级别,这可能是一个问题,但这绝对是需要考虑的事情。使用像这样的非标准登录方法将需要比它实际价值更多的工作量,而且我真的看不到整个过程有任何优势。


1

我也在考虑使用procmail来启动一些脚本。还有formail,可以方便地更改或提取标题。如果您具有邮件服务器的管理员访问权限,您也可以使用/etc/aliases并将其导向到您的脚本。

除了可用性问题,您还应该考虑安全性——使用虚假发件人地址发送电子邮件实际上非常简单,因此我不会依赖它进行任何关键操作。


0
除了安全性和易用性之外,电子邮件传递可能是另一个问题。根据用户的电子邮件提供商,电子邮件传递可能会延迟几分钟到几个小时。

0

thedailywtf.com上有一个非常有趣的教育故事,讲述了软件设计方面的知识。这个问题应该通过正确的设计来解决,而不是依赖技术炒作。

Alexander,请阅读这个链接的故事,思考手套的概念,而不是通过电子邮件驱动的网页浏览。

PHP并不是一把锤子


0

我认为你应该认真重新考虑这种方法。电子邮件的可靠性并不是很高。各种垃圾邮件过滤器可能会拦截带有链接的电子邮件,从而使“命令”未完成,更不用说安全风险了。

很容易伪造电子邮件的发件人地址。你基本上向任何人开放了你的系统。

此外,你突然要求用户记住一系列命令放在电子邮件地址前面,而不是用户名/密码组合。最好提供他们一个用户名/密码,然后给予访问帮助页面的权限。

换句话说,这种方案的可用性和安全性得分非常低。

我实在找不到任何优点来抵消这种方法的巨大缺点。


0
一个防止垃圾邮件的解决方案是确保第一行、最后一行或特定行包含某个字符串,几乎像密码一样,但完整的句子更好。
只有你知道这个词或短语,十分安全,只需记得在使用后删除邮件和那些没有秘密行的邮件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接