从Gmail API获取发件人电子邮件

9
我正在使用gmail-api,但在获取发件人的电子邮件方面遇到了麻烦。我指的是电子邮件的“完整”格式。我认为发件人的电子邮件是实际写在gmail网页界面的“发件人”字段中的那个。
这种完整格式的标头通常包括一些内容,例如“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] => ................
                            )
........

有没有一种可靠的方法来获取发件人的正确电子邮件地址? 提前感谢您!
4个回答

7

我知道这个问题是一段时间之前的,但最近我也遇到了这个问题,而且在网上找不到任何解决方案 - 所以我想分享一下我的发现。

基本上,将其包装在htmlentities()中就可以解决问题 - 但你必须直接访问该部分; 如下所示:

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

看起来API正在删除值,因为在有效载荷上执行var_dump时,字符串值实际上是可见的。

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

这也适用于FROM部分。我认为这是一个更容易演示的方法。 :)


我无法获取发件人的电子邮件地址,但是htmlentities解决了这个问题,谢谢! - Budianto IP

7

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


3
谢谢 GmailGuy....不幸的是,你在这个表单中建议的标题如下: [36] => 数组 ( [name] => 发件人 [value] => Eva M ) 但我实际上是在寻找发件人的电子邮件地址,而不是他的姓名。你有什么想法在哪里可以找到它? - lost in binary
1
"From" 头部条目中的值应该是电子邮件 "From" 头部行的确切内容。通常是这样的:From: "Some Name" emailaddr@example.com当您在 Gmail Web UI 中 "显示原始邮件" 时,它是否与 API 中的不同? - Eric D
是的,不幸的是它是不同的。在Web UI中显示为: 来自:Eva M email@hotmail.com你可以在API中看到上面的值。 - lost in binary
1
这是所有电子邮件都发生了这种情况还是只有这一个?如果只有这一个,您能否查看电子邮件并确定“发件人”标题中有什么不同?是否有任何特殊字符(例如utf8 mime-word)或其他内容?我不确定您用于漂亮格式化打印的方式,但您确定它不是因为“<>”而隐藏了它吗? - Eric D

1

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

"From" 的头信息

{
    "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只有两个单词,我甚至不知道这封电子邮件来自哪里。


它并不总是提供用户名。 - Mahir Mahbub

0
你也可以通过循环 headers[] 数组并查找 X-Original-Sender 像 $header->name == 'X-Original-Sender' 这样的方式来实现。这在有效载荷头包含该值的情况下是可行的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接