У меня возникла проблема с установкой автора письма в поле "От" сообщения RFC2822 (здесь подробности). Проблема в том, что автор не появляется в полученной почте. Поле from, которое я установил, выглядит так:
MyName: [email protected]
Но я также пробовал:
MyName <[email protected]>
Ничего из этого не работает, в полученной почте имя по-прежнему отсутствует, глядя на исходную почту.
Это должно работать, потому что работает nodemailer (с Gmail) и то же значение для from. Может кто-нибудь объяснить мне, что происходит? Как я могу решить?
РЕДАКТИРОВАТЬ: я сообщаю код, который я использую, как указано в одном комментарии.
Я отделил вызов 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: [email protected]`, to: candidate.email,
subject: "Test Mail", bcc: supervisor_email,
"reply-to": clerk_email}, genMessage(candidate));
}
Mail просто создает объект со свойствами, указанными в его первом параметре, а b64enc() помещает все в строку, соответствующую RFC2822, и кодирует ее в base64.
EDIT2: код для класса Mail.
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: в обычном электронном письме. В первом случае это Мое имя ‹адрес электронной почты›, во втором просто адрес электронной почты.
Mail
отnew Mail
? - person Iamblichus   schedule 11.01.2021from
? Проблем сto
,subject
и т.д. нет? - person Iamblichus   schedule 12.01.2021from: '"Name" <email-address>'
, как показано в этом примере, также не работает? - person Iamblichus   schedule 13.01.2021from
значение'"Name" <email-address>'
, я получу желаемое поведение (я использую не ваш код, а код, основанный на этом ответе Можете ли вы попробовать указанный код и посмотреть, работает ли он? - person Iamblichus   schedule 13.01.2021