如何通过电子邮件控制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,我知道根据发件人电子邮件要做什么以及如何做,我什至不需要电子邮件中的内容、主题或任何其他标题。


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

有帮助吗?

解决方案

我已经用过 pop3 php 类 取得了巨大的成功(还有一个 梨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 调用,该 cronjob 使用 wget 调用我的 php 脚本的 url。

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

编辑

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

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

我认为安全问题也很合理。除非命令是非破坏性的或者不执行任何特定于用户的操作,否则系统将对任何知道如何欺骗电子邮件地址的人(这将是每个人:))开放。

其他提示

您将需要某种 CronJob/定时器服务来定期检查邮箱,然后对其进行操作。或者,您应该检查邮件服务器是否可以在邮件到达时运行脚本(即看看是否可以放入垃圾邮件过滤器脚本并“滥用”该功能来调用您的脚本)。

对于纯 PHP,您通常会运气不好,因为需要某些东西来触发脚本。在一个流量很大的页面上,你可以让你的index.php或者其他什么东西来做检查,但是当相当长一段时间没有人访问你的网站时,那么邮件将不会被发送,你必须小心“race”当多人同时访问脚本时出现“条件”。

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

如果您的服务器允许,您可以使用 。向前 文件或 程序邮件 当邮件到达某个地址时启动一个进程(php 或任何东西)。

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

我也在考虑使用 procmail 来启动一些脚本。还有 formail,它可能会在更改或提取标题时派上用场。如果您拥有邮件服务器的管理员访问权限,您还可以使用 /etc/aliases 并通过管道连接到您的脚本。

除了可用性问题之外,您还应该真正考虑安全性 - 使用虚假发件人地址发送电子邮件实际上非常简单,因此我不会依赖它来完成任何重要的事情。

我同意所有的安全问题。当涉及发件人的电子邮件地址时,您关于“用户及其电子邮件提供商负责其电子邮件帐户安全”的假设是不正确的。

但由于您特别询问“我如何从将电子邮件发送到人类无法读取的帐户到触发某些脚本”,我建议使用 procmail 将传入电子邮件传递到您编写的脚本。

我不会调用 URL。我会让脚本通过读取标准输入上发送的消息来执行工作。这样,网站上的任何人都无法访问该脚本。

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

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

:0 hb:
| /path/to/program

where/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 不是 锤子.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top