是否可以在PHP中编写电子邮件解析器?

时间:2012-09-20 13:13:21

标签: php codeigniter email

我的PHP技能是中级的,但我想尝试实现这个:

我有一个本地爵士音乐家的网站。我希望他们能够将即将到来的演出添加到他们的个人资料页面。我希望他们能够通过电子邮件发送这些更新,就像我可以将任务添加到我的在线Todo列表中一样。

所以我需要解析在我的帐户中登陆服务器的电子邮件。

我认为执行标准格式是公平的。我正在思考

(In subject)NEWGIG   [[or maybe set up a separate "newgig@mySite.com" email account for gig updates only]]

TITLE>My next super gig<TITLE
DATE>03/10/2012<DATE
DESC>Here is some supplementary information<DESC
LINK>www.hereIsTheVenue.com<LINK

将添加演出并发送确认电子邮件。

这有多难?可能吗?我想我可以做所有的测试解析和SQL等等。但是我没有太多的邮件经验,似乎有很多“小巧的”需要注意。

在我开始之前,有人可以确认这是可行的吗?需要注意的任何提示或事项?

BTW - 我正在做电子邮件解析器,因为我希望它非常易于使用。众所周知,音乐家是懒惰的,所以如果我可以让他们在他们的电子邮件中发布演出(通常会得到确认),那么就可以节省他们去网站,登录,访问他们的帐户等的麻烦。

3 个答案:

答案 0 :(得分:7)

是的,这是可行的。您只需访问具有smtp端点的服务器即可。像postfix或exim或其他任何听取传入电子邮件的东西。 您需要将此软件配置为将传入的邮件作为纯文本传递到您的脚本或程序中,该脚本或程序可以处理来自stdin的输入。

最简单的方法是创建一个指向脚本的新电子邮件别名。我的/etc/aliases文件中有大量条目,如下所示:

userpart: "|/usr/bin/php -f /path/to/some/script.php"

只要电子邮件到达此地址,就会触发此操作:userpart@this.server.example

脚本本身就像这样读取输入

$fp = fopen('php://stdin','r');
    while (!feof($fp)) {
            $input .= fgets($fp);
    }
fclose($fp);

您可能会发现使用现有的MIME解析器非常有用,因为输入可能是现代MUA所能想到的任何内容。

答案 1 :(得分:2)

解析电子邮件就像解析任何类型的数据一样。您只需要为电子邮件定义通用格式。

编写解析器后,创建一个脚本,使用php imap函数定期连接到邮件服务,读取邮件,解析它们并将它们插入db。

但是,创建一个可以添加所有gig数据的Web表单会更简单,更快捷。

答案 2 :(得分:1)

您可以使用正则表达式执行此操作。但是你的格式需要一些改进。

确保您的格式不包含用户可以输入的格式并破坏您的格式。如果您希望使用户/客户端使用XML格式非常简单。用户编辑它会更容易。

以下是ex :(我创建了如何获取 TITLE 并修改开头和结尾标记)现在它使用 双花括号

$str= '
(In subject)NEWGIG   [[or maybe set up a separate "newgig@mySite.com" email account for gig 
updates only]]
{{TITLE}}My next super gig{{TITLE}}
DATE>03/10/2012<DATE
DESC>Here is some supplementary information<DESC
LINK>www.hereIsTheVenue.com<LINK';
preg_match('#{{TITLE}}(?P<title>.+){{TITLE}}#', $str, $matches);
echo $matches['title'];

XML格式(您可以使用simplexml_load_string function来解析XML格式):

<document>
<TITLE>My next super gig</TITLE>
<DATE>03/10/2012</DATE>
<DESC>Here is some supplementary information</DESC>
<LINK>www.hereIsTheVenue.com</LINK>
</document>