PHP 将电子邮件消息解析为变量
Posted
技术标签:
【中文标题】PHP 将电子邮件消息解析为变量【英文标题】:PHP Parsing Email Message into Variables 【发布时间】:2011-06-04 15:28:10 【问题描述】:我目前正在为我的客户构建一个可以归类为票务系统类型的系统。但是,用户不是像普通系统那样输入票证,而是从第三方(始终是同一个第三方)以电子邮件格式接收票证,然后通过管道输入。
我需要查看的内容(我曾想过使用各种方法,但似乎无法挑选出最好的)是从电子邮件中获取详细信息并将它们放入单个变量中。
将收到的电子邮件示例如下:
姓名:哈里·史密斯 状态:已婚 地址:泰恩路 14 号, 利特尔伍德 曼彻斯特 MC2 3DN 电话:01551 221502
显然,完整的电子邮件要长得多,但我正在考虑从电子邮件中取出详细信息,以便我可以根据新系统的要求处理它们。实际上,我正在寻找可以以以下方式存储信息的东西:
名称:%name% 状态:%status% 地址:%address% 电话:%telephone%
我还没有完全弄清楚如何编写一个字符串搜索来查找 Name:
并存储它之后的每一个直到到达 Status:
。
任何帮助或指示都会很棒。
谢谢:)
【问题讨论】:
【参考方案1】:逐行读取数据文件。用“:”分解每一行。如果计数 == 2,那么你知道你在一个新的令牌上,在这种情况下 key = index[0] 并且 value = index[1]。现在检查下一行,如果你运行explode后只有一个元素,只需将其添加到上一个键。
$email = ...;//email here
$email = str_replace(array("\r\n","\n\r","\n","\r"), "\r", $email); //fix line breaks
$emaillines = explode("\r", $email);
$result = array();
$key = "first";
foreach($emaillines as $line)
$parts = explode(":",$line,2);
if(count($parts)>1)
$key = $parts[0];
$result[$key] = $parts[1];
else
$result[$key] .= "\r".$parts[0];
print_r($result);
【讨论】:
听起来很有希望,请您进一步扩展一下,即多行的地址。 谢谢你也可以试试这个和萨尔曼的回答。我会在今天晚些时候回来更新。 干得好!在进入 for-each 循环之前不要忘记初始化$result = array();
。
效果很好,但是我有一个错误Notice: Undefined index: in
,它在这条线上$result[$key] .= "\r".$parts[0];
还有,有没有办法丢弃诸如标题之类的细节(不包括:)。目前它们被包含在它上面的数组值中【参考方案2】:
您可以使用基本的字符串操作和正则表达式从电子邮件中提取数据。以下代码可以作为起点。正则表达式还有很大的改进空间。
<?php
$message = "Name: Harry Smith
Status: Married
Address: 14 Tyne Road,
Littlewood
Manchester
MC2 3DN
Telephone: 01551 221502";
preg_match(
"@" .
"^Name:(.*)" .
"^Status:(.*)" .
"^Address:(.*)" .
"^Telephone:(.*)" .
"@ms",
$message,
$match
);
var_dump($match);
// $match[1]...[4] contain the desired information
// you may want to trim() each value
?>
【讨论】:
它实际上不是 4 行,大约是 35 行,但是是的,收到的每封电子邮件都是两种不同布局之一(可通过电子邮件主题识别)【参考方案3】:你可以使用 str_replace。
$string = str_replace("%name%", $name, $string);
【讨论】:
抱歉,我正在考虑尝试存储 %name% 的内容,而不是用我已有的值替换 %name%以上是关于PHP 将电子邮件消息解析为变量的主要内容,如果未能解决你的问题,请参考以下文章
使用 MYSQL db 中的正文通过 PHP 发送电子邮件并解析 \n