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 将电子邮件消息解析为变量的主要内容,如果未能解决你的问题,请参考以下文章

PHP PDO 错误消息作为变量在电子邮件中发送

Php mail - 包含数组和条件的消息变量[重复]

使用 7BIT 内容传输编码解析电子邮件正文 - PHP

使用 MYSQL db 中的正文通过 PHP 发送电子邮件并解析 \n

PHP:从 POP3 或 IMAP 下载传入的电子邮件,对其进行解析,并在服务器上将其标记为已读/删除

在php中解析原始电子邮件