通过电子邮件发送至 Web 应用程序?

通过电子邮件发送至 Web 应用程序?

有人能告诉我如何执行以下操作:

我的公司使用 Linux、Apache、MySQL 和 PHP 构建了自己的项目管理系统。在 Web 应用程序的数据库中,有一个名为 t_project 的表,用于存储公司所有项目的信息。我的老板希望我设计一个解决方案,如果有人向 (t_project.project_id)@mysite.com 发送电子邮件,Web 应用程序会将电子邮件写入名为 t_project_message 的数据库表。

我该如何解决这个问题?我需要学什么?

补充笔记 我刚刚注意到我的问题中的文本丢失了“(t_project.project_id)@mysite.com”,我已将其添加回来。那么这是否意味着我需要与数据库中的项目数量一样多的电子邮件帐户?那可能是数万个...

答案1

您在 PHP 主机上运行什么电子邮件服务器?对于我负责的几个 PHP 应用程序,我使用 Exim,并使用 Exim 设置传输和路由器。这意味着 Exim 将接受该消息,然后它将运行 PHP 脚本并将该消息传递给 PHP 脚本 STDIN。然后 PHP 脚本根据消息的内容执行操作。

下面的路由器/配置将接受消息[电子邮件保护][电子邮件保护]和 tckt-{id#}@helpdesk.example.org。使用 Exim,传输和路由器配置非常灵活,以下只是您可能配置此配置的一种可能方式。我怀疑我配置的内容是否直接适用于您的项目,您可能需要阅读进出口。我也很确定其他邮件服务器也能做同样的事情。我只是不熟悉它们。

### router/050_helpdesk_router
#################################
helpdesk_router:
  driver = accept
  domains = helpdesk.example.org
  caseful_local_part = true
  local_parts = lsearch;/etc/exim4/helpdesk
  local_part_suffix_optional
  local_part_suffix = -*
  transport = helpdesk_transport


### transport/20_helpdesk_router
#################################

helpdesk_transport:
  driver = pipe
  command = /usr/bin/php ${lookup{$local_part}lsearch{/etc/exim4/helpdesk}} $local_part '${if def:local_part_suffix {$local_part_suffix}}'
  # return the data from the script on a failure
  return_fail_output = true
  # temporary error
  temp_errors = 10
  # set a timeout for 30 seconds
  timeout = 30s
  current_directory = /home/helpdeskadmin/
  home_directory = /home/helpdeskadmin/
  user = helpdeskadmin
  group = helpdeskadmin

### /etc/exim4/helpdesk
#################################
helpdesk:   /srv/www/helpdesk.example.org/www/helpdesk/mail/recv.php
tckt:       /srv/www/helpdesk.example.org/www/helpdesk/mail/recv.php

为了给出问题的邮件解析部分的起点。我使用Zend_Mail用于解析传入的消息并发送邮件。

您有时间告诉我您的方法与 Ben 的方法相比有哪些优点/缺点吗?

像我描述的那样,用钩子钩住 MTA。

  • 没有轮询间隔。当发送邮件服务器连接时,您的进程将立即启动以接受消息。使用邮箱和轮询,您将不得不等到下一个轮询周期。
  • 您可以立即拒绝或回复无效消息,而不会冒应用程序成为反向散射源的风险。如果地址不太正确,您可能希望退回该消息。
  • 您说您有很多项目。使用传输,您不必创建大量邮箱,也不必单独轮询每个邮箱,如果您正确定义传输,则可以获得一个传输配置来处理所有事情。

通常,使用 PHP 时,可以从 cron 进行邮箱轮询。从 cron 中,您必须非常小心,以确保轮询进行某种形式的锁定,这样您就不会两次响应或处理同一条消息。

答案2

我过去经常这样做的方式是fetchmail通过 cron 每 X 分钟运行一次。Fetchmail 将通过 IMAP 或 POP3 检索邮件,然后可以通过某种类型的处理程序/解析器脚本(通常用 perl、python 等编写)传输邮件。解析器脚本将从邮件中提取您需要的任何数据,然后将该信息插入到数据库中的适当位置。

答案3

根据您的邮件服务器,您可以编写一个 PHP 脚本,该脚本将使用 IMAP 轮询服务器上的邮箱并采取相应的操作。

PHP 有一个 IMAP 扩展,它可以从服务器获取电子邮件消息,以及在服务器上移动它们或在将其提交到数据库后将其完全删除。

您可以使用 cron 适当地安排此任务。

答案4

虽然您可以轮询 POP 邮箱,但这是一个非常低效的解决方案。假设您可以将邮件路由到目标系统,更好的解决方案是同步处理请求。虽然您可以只使用 .forward 机制,但我建议使用 procmail 作为 MDA - 它允许您编写复杂的行为脚本,如运行程序、转发副本、有条件回复等。

相关内容