我正在使用gmail-api并无法收到发件人的电子邮件。我在谈论"完整"电子邮件的格式。我认为发件人的电子邮件是实际写在" From"使用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] => ................
)
........
那么有没有可靠的方法来获取发件人的正确电子邮件? 提前谢谢!
答案 0 :(得分:6)
知道这个问题是从一段时间以来,但我最近遇到了这个问题,并且无法在网上找到任何解决方案 - 所以我想我会分享我的发现。
基本上将它包装在htmlentities()中就可以了 - 但你必须直接访问该部分;如此: -
$part = $message->payload['modelData']['headers'][0]['value'];
echo htmlentities($part);
似乎API正在删除值,因为当您对有效内容执行var_dump时,字符串值实际上是可见的。
["name"]=> string(11) "Return-Path" ["value"]=> string(21) ""
这也适用于FROM部分。只是认为这将是一种更容易展示它的方法。 :)
答案 1 :(得分:5)
循环遍历headers []数组并查找带有'name'=“From”(或者您感兴趣的标题名称)的数组。请注意,可能有多个具有该名称的标头。通常存在一些标准标题(To,From,Subject),但我不相信RFC的强制要求。
答案 2 :(得分:0)
我做了一些实验。 来自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
只是两个字,我甚至不知道电子邮件的来源。
答案 3 :(得分:0)
您还可以遍历headers []数组,并找到$header->name == 'X-Original-Sender'
之类的X-Original-Sender。如果有效载荷头包含此值,则此方法有效。