2012-09-20 67 views
4

我的PHP技能是中等的,但我想尝试实现这一点:是否可以在PHP中编写电子邮件解析器?

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

所以我需要分析服务器上我帐户中的邮件。

我认为这是公平的强制执行标准格式。 。和我在想

(In subject)NEWGIG [[or maybe set up a separate "[email protected]" 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等,但我没有太多的邮件经验,似乎有很多“烦人的位”需要注意。

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

顺便说一句 - 我在做电子邮件解析器,因为我想让它变得非常容易使用。音乐家是臭名昭着的懒惰,所以如果我可以让他们从他们的电子邮件(他们通常得到确认的地方)发布一个演出,那么它可以节省他们去网站,登录,去他们的帐户等的麻烦。

+0

如果你只是想发送一封电子邮件,PHP(即使它有HTML),那么这是很有可能的。 – greduan

+0

PHP是完全图灵完整的语言。是的,这是可能的。如果你指定了实现这个系统的问题,这个问题会更有建设性。 – deceze

+0

够公平的..但我不知道我应该花费多少时间来尝试实现某些我不确定的事情,或者根据某种方法可能会更容易/更困难。所以我来这里是为了“点头”。公平,我想。 –

回答

2

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

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

但是,创建一个Web表单来添加他们所有的演出数据会更简单快捷。

+0

这是我在脑海中看到的方法。除了不能,我只是作为一个目录访问邮件目录?为什么我必须使用IMAP功能进行连接? (我的电子邮件的机制知识显然是缺乏) 我同意webform会更容易...但我真的很喜欢通过电子邮件添加系统。这就是我在任务管理器上添加任务的方式,我只是想知道实现它有多困难。 –

+1

@ K.K.Smith这一切都取决于您的邮件服务器如何工作。如果它支持pop3/imap协议,则必须通过该协议与邮件服务器进行通信。这就是电子邮件客户端的工作方式,他们与邮件服务器交谈并从收件箱请求邮件。你很重要的是试图创建一个基本的邮件客户端。或者你可以按照Jan Prieser在他的回答中所说的方式。但它意味着你有一些服务器端配置要做。共享主机不可行 –

+0

感谢您的帮助。最后一个问题?我在Hostgator上面,在我的public_html文件夹上面我有一个名为“sitename”>“emailAccount”>“tmp”,“new”,“cur”的“邮件”文件夹。我认为这些将是我将简单地使用opendir()和readdir()的地方。每个人都提到通过协议连接到服务器的事实让我觉得我错了? –

7

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

最简单的方法是创建一个指向脚本的新电子邮件别名。我有很多在我/etc/aliases文件条目看起来是这样的:

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

每当邮件到达该地址这个被触发:[email protected]

脚本本身读起来像这样

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

您可能会发现使用现有的MIME解析器很有用,因为输入可能是现代MUA可以想到的任何东西。

+0

这是一个很好的答案! – dotancohen

+0

这似乎是最流行的解决方案,所以我相信这是很好的建议。我的PHP级别是这样的,我不知道后缀,exim和stdin是什么。在我的脑海中,我看到了这种方法:1.运行cron作业来检查我的传入邮件目录2.阅读并解析新电子邮件3.保留已处理的邮件列表以避免“加倍” 这完全兼容你说了什么?我会很乐意去做一些家庭作业。 我什至不知道为什么我需要一个MIME解析器,如果我只需要解析邮件的正文? –

+0

你的3个步骤对于我的方法来说都是不必要的。将邮件放入收件箱的软件就像是postfix或exim。邮件传输代理(MTA)。你可以告诉这个软件在到达时直接调用你的php脚本。所有你需要的是一台带有FQDN的服务器。 MIME解析器是必需的,因为您不能强制客户只发送纯文本邮件。大多数邮件客户端默认发送html邮件,并使用不同的正文部分。 –

1

你可以使用正则表达式来做到这一点。但是你的格式需要改进。

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

这里是恩:(创建如何得到TITLE我修改开启和结束标记)现在它使用双花括号

$str= ' 
(In subject)NEWGIG [[or maybe set up a separate "[email protected]" 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> 
相关问题