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

时间:2020-03-05 18:48:30  来源:igfitidea点击:

我想使用CakePHP框架在php和mysql上运行Web应用程序。为了将使用网站的门槛保持在较低的水平,我不想使用带有用户名/密码的标准登录名。 (而且我也不想像OpenID那样麻烦用户。请转到用户类型。)

因此,我认为用户可以通过发送电子邮件至[email protected]来登录,而无需主题或者内容。然后,他们将收到一封包含链接的电子邮件,该链接将使他们登录(其中将包含一个哈希)。另外,我将让用户甚至根本不访问该站点就执行一些操作,只需发送一封电子邮件到[email protected]即可执行该命令。我将假设用户及其电子邮件提供商会注意他们的电子邮件帐户安全性,因此在我的网站上不需要它。

现在,如何将电子邮件发送到人类无法读取的帐户,再执行一些脚本(基本上是"虚拟浏览器客户端"调用url),cakephp将负责其余的工作)?

我以前从未使用过Cron工作,但我确实认为我了解他们的目的或者工作原理。我不能让随机访问该站点的人调用该脚本,因为该解决方案由于多种原因而无法使用。我想我想听听更多有关如果有人对此有任何输入的情况下运行脚本作为对收到的电子邮件的响应的可能性的更多信息。如果它是作为cron作业运行的,则只会每隔X分钟检查一次,并且用户的响应会有所滞后(如果我正确理解的话)。

由于不同命令的电子邮件地址不同,例如[email protected],并且我知道根据发件人电子邮件进行的操作以及如何执行此操作,因此我什至不需要电子邮件中的内容,主题或者任何其他标题。

我很担心此应用程序的安全性,我理解这些问题,但是在不放弃我的概念的情况下,我认为这对我正在做的事情没有太大的影响。此外,关于可用性问题,确实没有任何问题。如果/当他们需要时,只需登录即可在用户个人资料上提供更改以及其他命令。这是主要电子邮件,非常容易记住,也是整个概念的开始。

解决方案

回答

我们将需要某种CronJob / Timer服务,该服务会定期检查邮箱,然后对其进行操作。另外,我们应该检查邮件服务器在邮件到达时是否可以运行脚本(即查看是否可以放入spamfilter-script并"滥用"该功能来调用脚本)。

使用纯PHP时,由于需要一些东西来触发脚本,因此我们几乎不走运。在有很多流量的Page上,我们可以使用index.php或者进行任何检查,但是当很长时间没有人访问网站时,该邮件将不会被发送,因此我们必须注意"种族"条件",当多个人同时访问脚本时。

编辑:请记住一个可用性缺陷:具有多台PC且每台都没有电子邮件客户端的人。例如,我使用4台PC,但是只有1台(我的主要PC)安装了Mail Client,而我使用Webmail来检查其他PC。现在,要使用网站,登录和通过Webmail发送邮件并不是最大的可用性,我首先必须登录到另一个网站,通过大多数Webmail工具具有的卑鄙界面编写邮件,然后等待答复。也可以在那里使用OpenID :-)

回答

我已经非常成功地使用了pop3 php类(还有一个Pear POP3模块)。

使用pop3类看起来像这样:

require ('pop3.php');

$pop3 = new pop3_class();
$pop3->hostname = MAILHOST;
$pop3->Open();
$pop3->Login('[email protected]', '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

编辑

我一直在考虑我们是否需要让用户通过电子邮件发送某些站点命令。

具有一个可以发送多个命令的地址而不是具有多个地址会更容易吗?

我认为安全问题也很有效。除非这些命令是非破坏性的,或者没有针对用户进行任何操作,否则该系统将向任何知道如何欺骗电子邮件地址的人(所有人都是:))敞开大门。

回答

如果服务器允许,则可以在邮件到达特定地址时使用.forward文件或者Procmail来启动进程(php或者其他任何程序)。

回答

我们不想让使用OpenID的用户麻烦,但我们希望他们处理这种电子邮件方案。首先,电子邮件可能需要很长时间才能通过。没有任何时间可以保证将电子邮件发送进来。甚至也不能保证电子邮件会到达那里。我知道事情通常很快,但是往返最多要花10分钟的时间并不少见。另外,除非我们正在加密电子邮件,否则我们发送回的链接将以公开方式发送。这意味着任何人都可以使用该链接进行登录。根据我们想要的安全程度,这可能是(也可能不是)一个问题,但这绝对是要考虑的问题。使用这样的非标准登录方法将比可能值得的工作多得多,而且我看不到整个过程有什么好处。

回答

我也在考虑使用procmail启动一些脚本。还有formail,可以方便地更改或者提取标头。如果我们具有对邮件服务器的管理员访问权限,则还可以使用/ etc / aliases并仅管道传输到脚本。

除了可用性问题之外,我们还应该真正考虑安全性,使用伪造的发件人地址发送电子邮件实际上非常简单,因此对于任何关键的事情我都不会依赖它。

回答

我会认真考虑一下这种方法。电子邮件的可靠性不是很高。有各种各样的垃圾邮件过滤器可能拦截带有链接的电子邮件,从而使"命令"完成一半,更不用说安全风险了。

欺骗电子邮件中的发件人地址非常容易。我们基本上是向任何人开放系统。

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

换句话说,该方案的可用性和安全性得分很低。

我无法真正找到这种方法的优势,甚至无法抵消巨大的劣势。

回答

我同意所有安全方面的考虑。当我们认为发件人的电子邮件地址时,"用户及其电子邮件提供商应注意其电子邮件帐户安全性"的假设是不正确的。

但是,由于我们特别询问"我如何将电子邮件发送到未被人阅读的帐户,然后再执行某些脚本",因此,我建议使用procmail将传入的电子邮件传递到我们编写的脚本中。

我不会呼叫网址。我希望脚本通过阅读在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]
}

?>

该电子邮件将不会保留在邮箱中,因此,如果要保存或者记录它,请让脚本来执行。

--
布鲁斯

回答

一种防止垃圾邮件的解决方案,请确保第一行,最后一行或者特定行包含一定的字符串,几乎就像密码一样,但是最好使用完整的句子。

只有我们有一个或者多个单词,非常安全,请记住在使用后删除邮件以及不包含秘密行的邮件。

回答

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

回答

在thedailywtf.com上有一个关于设计软件的非常好的教育故事。提出的问题应通过适当的设计解决,而不是通过techo-woopla解决。

亚历山大,请阅读链接的故事并思考手套,而不是电子邮件驱动的网页浏览。

PHP不是锤子。