【问题标题】:Get sender email from gmail-api从 gmail-api 获取发件人电子邮件
【发布时间】:2014-09-07 00:34:23
【问题描述】:

我正在使用 gmail-api,但无法获取发件人的电子邮件。我说的是电子邮件的“完整”格式。我认为发件人的电子邮件实际上是使用 gmail 的 Web 界面写在“发件人”字段中的电子邮件。 这种完整格式的标头通常包括诸如“X-Original-Authentication-Results”之类的内容,通常我可以从中检索 smtp.mail 值,这是发件人的电子邮件,但还有其他电子邮件无法找到此标头。

这是我目前的代码:

if ("X-Original-Authentication-Results" == $header["name"]) {
        $value = $header["value"];
        preg_match("/smtp.mail=(.*)/", $value, $emailFound);
        $parsedEmail = $emailFound[1];
}

这是一些标题的典型格式:

[headers] => Array
                    (
                        [0] => Array
                            (
                                [name] => Delivered-To
                                [value] => randomemail@gmail.com
                            )

                        [1] => Array
                            (
                                [name] => Received
                                [value] => ................
                            )

                        [2] => Array
                            (
                                [name] => X-Received
                                [value] => ................
                            )

                        [3] => Array
                            (
                                [name] => Return-Path
                                [value] => 
                            )

                        [4] => Array
                            (
                                [name] => Received
                                [value] => ................
                            )

                        [5] => Array
                            (
                                [name] => Received-SPF
                                [value] => ................
                            )

                        [6] => Array
                            (
                                [name] => Authentication-Results
                                [value] => ................
                            )
........

那么有没有可靠的方法来获取发件人的正确电子邮件? 提前谢谢!

【问题讨论】:

    标签: gmail-api


    【解决方案1】:

    遍历 headers[] 数组并查找具有 'name' = "From" 的数组(或任何您感兴趣的标题名称)。请注意,可能有多个具有该名称的标题。通常会存在一些标准标头(To、From、Subject),但我不认为这是 RFC 规定的。

    【讨论】:

    • 感谢 GmailGuy.... 不幸的是,您以这种形式建议的标题:[36] => Array ([name] => From [value] => Eva M) 但我实际上正在寻找发件人的电子邮件,而不是他的姓名。知道在哪里可以找到吗?
    • “发件人”标题条目中的值应该是电子邮件“发件人”标题行的确切内容。它通常类似于:来自:“Some Name” 当您在 gmail Web UI 中“显示原始”时,它与 API 的显示是否不同?
    • 是的,不幸的是它有所不同。在 web UI 中显示: from: Eva M 及以上您可以看到 api 中的值。
    • 是所有电子邮件都发生这种情况还是仅这一封?如果只是这封邮件,您可以查看电子邮件并确定 From 标头中的不同之处吗?是否有任何特殊(例如 utf8 mime-word)字符或任何东西?不确定您在为漂亮的格式化打印做什么,但您确定它只是因为“”而没有隐藏它吗?
    【解决方案2】:

    知道这个问题是不久前提出的,但我最近遇到了这个问题,在网上找不到任何解决方案 - 所以我想分享我的发现。

    基本上将它包装在 htmlentities() 中就可以了——但您必须直接访问该部分;像这样:-

    $part = $message->payload['modelData']['headers'][0]['value']; 
    echo htmlentities($part);
    

    似乎 API 正在删除这些值,因为当您对有效负载执行 var_dump 时,字符串值实际上是可见的。

     ["name"]=> string(11) "Return-Path" ["value"]=> string(21) ""
    

    这也适用于 FROM 部分。只是认为这将是一种更简单的演示方式。 :)

    【讨论】:

    • 我无法获取发件人的电子邮件地址,但 htmlentities 成功了,谢谢!
    【解决方案3】:

    我做了一些实验。 API Users.messages: get的标头

    “发件人”的标题

    {
        "name": "From",
        "value": "Ray Lin \u003cray@xxx.com\u003e"
     }
    

    实验:

      foreach($headers as $header){ if($header->name==="From")  $from = $header->value;}
    
    // experiment 1:
        preg_match('/\\\u003c(.*?)\\\u003e/', $from, $match);
        echo $match[1]; // empty
    
    
    // experiment 2:(use a string instead)
        $str = 'Ray Lin \u003cray@xxx.com\u003e';
        preg_match('/\\\u003c(.*?)\\\u003e/', $str, $match);
        echo $match[1]; // ray@xxx.com
    
    // experiment 3:
        echo $from // Ray Lin
    
    // experiment 4:
        echo htmlentities($from) // Ray Lin <ray@xxx.com>
    
    // experiment 5:
        preg_match('/<(.*?)>/', $from, $match);
        $from =$match[1];
        echo $from  // ray@xxx.com
    
    // experiment 6:
        $from = htmlentities($from);
        preg_match('/<(.*?)>/', $from, $match);
        print_r($match); // empty Array()
    

    实验 5 非常适合我的需要,但你可以从实验 3 中看到,$from 只是两个字,我什至不知道电子邮件来自哪里。

    【讨论】:

    • 它并不总是提供用户名
    【解决方案4】:

    您还可以遍历 headers[] 数组并找到 X-Original-Sender,例如 $header-&gt;name == 'X-Original-Sender'。这适用于有效负载标头包含此值的情况。

    【讨论】:

      猜你喜欢
      • 2020-03-25
      • 1970-01-01
      • 2018-08-25
      • 2021-04-27
      • 2019-04-19
      • 2020-09-04
      • 2016-12-23
      • 2019-07-12
      • 2021-04-19
      相关资源
      最近更新 更多