8
votes

I am using the gmail-api and having trouble getting the email of the sender. I am talking about the "full" format of the email. I consider the email of the sender to be the one that is actually written in the "From" field using the web interface of gmail. The headers of this full format usually include stuff like "X-Original-Authentication-Results" from which normally I can retrieve the smtp.mail value which is the sender's email but there are other emails where this header cannot be found.

This is my code so far:

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

and here is a typical format of some headers:

[headers] => Array
                    (
                        [0] => Array
                            (
                                [name] => Delivered-To
                                [value] => [email protected]
                            )

                        [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] => ................
                            )
........

So is there a solid way to get the correct email of the sender? Thank you in advance!

4

4 Answers

7
votes

Loop through the headers[] array and look for the one with the 'name' = "From" (or whatever the header name is you're interested in). Note there may be multiple headers with that name. There are some standard headers that will usually exist (To, From, Subject) but I don't believe that's mandated by the RFC.

7
votes

Know this question is from a while back, but I ran into this problem recently and couldn't really find any solutions online - so thought I'd share my findings.

Basically wrapping it in the htmlentities() would do the trick - but you'd have to access the part directly; as such:-

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

It seems that the API is removing the values because when you do a var_dump on the payload, the string value is actually visible.

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

This works on the FROM part too. Just thought this would a much easier way to demonstrate it. :)

1
votes

I did a few experiments. the header from API Users.messages: get

header of "From"

{
    "name": "From",
    "value": "Ray Lin \[email protected]\u003e"
 }

Experiments:

  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 \[email protected]\u003e';
    preg_match('/\\\u003c(.*?)\\\u003e/', $str, $match);
    echo $match[1]; // [email protected]

// experiment 3:
    echo $from // Ray Lin

// experiment 4:
    echo htmlentities($from) // Ray Lin <[email protected]>

// experiment 5:
    preg_match('/<(.*?)>/', $from, $match);
    $from =$match[1];
    echo $from  // [email protected]

// experiment 6:
    $from = htmlentities($from);
    preg_match('/<(.*?)>/', $from, $match);
    print_r($match); // empty Array()

experiment 5 is ideal to my need, but you can see from experiment 3, $from was just two words, I don't even know where the email was from.

0
votes

You could also loop through the headers[] array and find X-Original-Sender like $header->name == 'X-Original-Sender'. This works in the case the payload header contains this value.