在 Node JS 中使用 gmail API 的 "from" 字段出现问题
Issue with "from" field using gmail API in Node JS
我在 RFC2822 邮件的“发件人”字段中设置邮件作者时遇到问题(here 详细信息)。
问题是作者没有出现在收到的邮件中。我设置的“发件人”字段如下所示:
MyName: name.surname@gmail.com
但我也尝试过:
MyName <name.surname@gmail.com>
None这些作品,在收到的邮件中查看原始邮件仍然缺少名称。
这应该可以工作,因为使用 nodemailer(与 Gmail)和相同的“发件人”值可以工作。有人可以向我解释发生了什么吗?我该如何解决?
编辑:我按照一条评论中的要求报告了我正在使用的代码。
我将对 API 的调用与生成邮件正文的部分分开,因此调用是:
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}
}
);
}
当这样生成参数“mail”时:
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 简单地组成一个对象,该对象具有第一个参数中给定的属性,而 b64enc() 将所有内容放入符合 RFC2822 的字符串中并对其进行 base64 编码。
EDIT2:邮件代码 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:我添加了所需行为和实际行为的屏幕截图:
期望的行为,隐藏信息是发件人的电子邮件和收件人的电子邮件:
实际行为。不同的是这里没有“MyName”。
我的邮件客户端中显示的内容当然是基于普通邮件中“发件人:”的内容。在第一种情况下它是“我的名字<电子邮件地址>”,在第二种情况下它只是“电子邮件地址”。
为了显示姓名,而不仅仅是电子邮件地址,您可以按以下方式设置 from
字段的格式:
from: '"MyName" <name.surname@gmail.com>'
我在 RFC2822 邮件的“发件人”字段中设置邮件作者时遇到问题(here 详细信息)。 问题是作者没有出现在收到的邮件中。我设置的“发件人”字段如下所示:
MyName: name.surname@gmail.com
但我也尝试过:
MyName <name.surname@gmail.com>
None这些作品,在收到的邮件中查看原始邮件仍然缺少名称。
这应该可以工作,因为使用 nodemailer(与 Gmail)和相同的“发件人”值可以工作。有人可以向我解释发生了什么吗?我该如何解决?
编辑:我按照一条评论中的要求报告了我正在使用的代码。
我将对 API 的调用与生成邮件正文的部分分开,因此调用是:
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}
}
);
}
当这样生成参数“mail”时:
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 简单地组成一个对象,该对象具有第一个参数中给定的属性,而 b64enc() 将所有内容放入符合 RFC2822 的字符串中并对其进行 base64 编码。
EDIT2:邮件代码 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:我添加了所需行为和实际行为的屏幕截图:
期望的行为,隐藏信息是发件人的电子邮件和收件人的电子邮件:
实际行为。不同的是这里没有“MyName”。
我的邮件客户端中显示的内容当然是基于普通邮件中“发件人:”的内容。在第一种情况下它是“我的名字<电子邮件地址>”,在第二种情况下它只是“电子邮件地址”。
为了显示姓名,而不仅仅是电子邮件地址,您可以按以下方式设置 from
字段的格式:
from: '"MyName" <name.surname@gmail.com>'