【问题标题】:PHP Parsing Email Message into VariablesPHP 将电子邮件消息解析为变量
【发布时间】:2011-06-04 15:28:10
【问题描述】:

我目前正在为我的客户构建一个可以归类为票务系统类型的系统。但是,用户不是像普通系统那样输入票证,而是从第三方(始终是同一个第三方)以电子邮件格式接收票证,然后通过管道输入。

我需要查看的内容(我曾想过使用各种方法,但似乎无法挑选出最好的)是从电子邮件中获取详细信息并将它们放入单个变量中。

将收到的电子邮件示例如下:

姓名:哈里·史密斯
状态:已婚
地址:泰恩路 14 号,
利特尔伍德
曼彻斯特
MC2 3DN
电话:01551 221502

显然,完整的电子邮件要长得多,但我正在考虑从电子邮件中取出详细信息,以便我可以根据新系统的要求处理它们。实际上,我正在寻找可以以以下方式存储信息的东西:

名称:%name%
状态:%status%
地址:%address%
电话:%telephone%

我还没有完全弄清楚如何编写一个字符串搜索来查找 Name: 并存储它之后的每一个直到到达 Status:

任何帮助或指示都会很棒。

谢谢:)

【问题讨论】:

    标签: php


    【解决方案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%
    猜你喜欢
    • 1970-01-01
    • 2011-03-27
    • 2013-03-11
    • 1970-01-01
    • 2012-11-19
    • 2021-02-06
    • 1970-01-01
    • 2019-08-22
    • 2011-11-27
    相关资源
    最近更新 更多