node.jsgmail-apirfc2822

Issue with "from" field using gmail API in Node JS


I have a problem setting the author of a mail in the "from" field of the RFC2822 mail (here the detail). The problem is that the author does not appear in the received mail. The "from" field I've set looks like this:

MyName: name.surname@gmail.com

But I also tried:

MyName <name.surname@gmail.com>

None of these work, in the received mail the name is still missing looking at the original mail.

This should work because using nodemailer (with Gmail) and the same value for "from" it works. Can someone explain me what's happening? How can I solve?

EDIT: I report the code I am using as asked in one comment.

I separated the call to the API from the part that generates the mail body, so the call is:

function gmailSend(auth, mail){
    const gmail = google.gmail({version: 'v1', auth});
    const b64mex=mail.b64enc();
    return gmail.users.messages.send(
        {auth: auth,
            userId: 'me',
            resource:
                {raw: b64mex}
        }
    );

}

While the parameter "mail" is generated in this way:

function genMail(candidate, clerk_email, supervisor_email){
return new Mail({from: `MyName: name.surname@gmail.com`, to: candidate.email,
    subject: "Test Mail", bcc: supervisor_email,
    "reply-to": clerk_email}, genMessage(candidate));

}

Mail simply compose an object that has the properties given in its first parameter, while b64enc() puts all in a string respecting the RFC2822 and encodes it base64.

EDIT2: code for Mail class.

class Mail{
constructor(headers, body) {
    if(!headers.to)
        throw Error("Recipient missing");
    if(headers.subject){
        const b64subject=new Buffer(headers.subject).toString("base64")
            .replace(/\+/g, '-').
            replace(/\//g, '_');
        headers.subject='=?utf-8?B?'+b64subject+"?=";
    }
    Object.assign(this, headers);
    this.body = body;
}
b64enc(){
    const fields = ["Content-Type: text/html; charset=\"UTF-8\"\n",
        "MIME-Version: 1.0\n",
        "Content-Transfer-Encoding: 7bit\n"];
    for(const prop of Object.keys(this)){
        if(prop!=="body")
            fields.push(`${prop}: ${this[prop]}\n`);
    }
    fields.push("\n");
    fields.push(this.body);
    const str=fields.join('');
    const encodedMail = new Buffer(str).toString("base64")
        .replace(/\+/g, '-').
        replace(/\//g, '_');
    return encodedMail;
}

}

EDIT3: I add screenshots of desired and actual behaviour:

Desired behaviour, the hidden info are the sender's email and the receiver's one: desired behaviour, the hidden info are the sender's email and the receiver's one

Actual behaviour. The difference is that here there is not "MyName". enter image description here

What is shown in my email client of course is based on the content of "From:" in the plain email. In the first case it is "My name <email address>", in the second it is just "email address".


Solution

  • In order to show a name, and not just the email address, you can format the from field the following way:

    from: '"MyName" <name.surname@gmail.com>'