Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
126 views
in Technique[技术] by (71.8m points)

node.js - 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: [email protected]

But I also tried:

MyName <[email protected]>

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: [email protected]`, 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"
",
        "MIME-Version: 1.0
",
        "Content-Transfer-Encoding: 7bit
"];
    for(const prop of Object.keys(this)){
        if(prop!=="body")
            fields.push(`${prop}: ${this[prop]}
`);
    }
    fields.push("
");
    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".

question from:https://stackoverflow.com/questions/65645956/issue-with-from-field-using-gmail-api-in-node-js

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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

from: '"MyName" <[email protected]>'

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...