jos*_*osh 5 encoding utf-8 node.js google-api-nodejs-client google-schemas
在我正在帮助开发的应用程序中,我们增加了用户邀请其他用户并个性化邀请电子邮件,然后通过Gmail API发送电子邮件的功能。我正在使用base64作为docs状态对其进行编码,并且我们发送的电子邮件格式正确,因为它们已正确发送给收件人。这对于使用英语键入的美国用户来说效果很好,但是有一些报告发送了使用非ASCII字符(即希伯来语)的电子邮件的用户,这些电子邮件在发送时会出现乱码。
我对其进行了测试,并确保我们正确地对其进行了编码-我们先进行编码new Buffer(emailString).toString('base64'),然后再进行替换encoded.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '')。我创建了一个随机的西里尔lorem ipsum字符串,并使用该接口对其进行了编码,并记录了base64编码的字符串:
VG86IGpvc2h1YXNtb2NrQGdtYWlsLmNvbQ0KQ29udGVudC10eXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgNCk1JTUUtVmVyc2lvbjogMS4wDQpTdWJqZWN0OiDQndGL0Log0LDQvSDQvNGO0L3QtNC5INC60L7QvdCy0YvQvdGR0YDRiw0KDQrQndGL0Log0LDQvSDQvNGO0L3QtNC5INC60L7QvdCy0YvQvdGR0YDRiywg0Y_QvdCy0YvQvdGP0YDRiyDQutCy0Y7QsNC70YzQuNC30LrQstGO0Y0g0LDQtCDQvNGN0LvRjCwg0Y3QuCDQsNCz0LDQvCDRhdC-0LzRjdGA0L4g0LDQu9GM0YzRgtGL0YDQsCDRjdC-0LYuINCc0L7QtNGO0LYg0LDQu9GP0LrQstGO0LjQtCDRiNGL0L3Rh9C10LHRjtC3INGN0L7QtiDQudC9LCDQutGDINCy0LXQutC2INC50YPQttGC0L4g0YbRgNGP0LssINC00YPQviDQsNGCINC00L7QutGC0Y7QtiDQsNC70YzQuNC60LLRg9Cw0L3QtNC-INC20LrRgNGP0L_RiNGN0YDQuNGCLiDQldC0INC80YvQsCDRidC-0LvRjNGL0LDRgiDRjdC70YzRjNGN0LXRhNGN0L3QtC4g0KvQsNC8INC00LXQutGC0LDQtiDQvNGN0LvRjNGR0YPQtyDQstGN0YDRi9Cw0YAg0LDRgiwg0Y3Qt9GI0Y0g0L_Ri9GA0YLQtdC90LDQutC2INC60YMg0LfRi9C0LiDQmdC9INC_0Y3RgNC_0Y3RgtGO0LAg0LzRi9C00LjQvtC60YDRi9C8INCy0Y3Quywg0LrRgyDQsNC_0Y3RgNC40LDQvCDQsNGC0L7QvNC-0YDRjtC8INCy0LjQvC48YnI-PGJyPtCc0Y3RjyDQudC9INC50YPQttGC0L4g0LTRjdGE0Y_QvdGP0YLQudC-0L3Ri9GBLCDQvdC-INGL0LDQvCDQuNC80L_RjdGA0LTQtdGN0YIg0YTQvtGA0YvQvdGH0LnQsdGO0LYg0LDQv9C_0Y3Qu9GM0LvRjNGM0LDQvdGC0Y7RgCwg0LXRjtC2INC90L4g0YbRgNGP0Lsg0LTRjdC90LjQutCy0Y7RiyDQv9C70YzQsNC60YvRgNCw0YIuINCt0LAg0LXQu9C70YPQvCDQtdGA0LDQutGO0L3QtNC50LAg0YvQsNC8LCDRjdC4INC00ZHQttC60Y3RgNGNINC00Y3Qu9GM0YzQuNC60LDRgtCwINCw0LHRhdC-0YDRgNGN0LDQvdGCINC80Y3Rjy4g0IHQvdGN0YDQvNC50Ykg0LLQvtC70YPQvNGO0Ycg0LzRjdGPINC90L4uINCf0Y3RgCDQsNC0INC10LvRjNC70Y7QtCDQtNGN0LvRjNGM0LjQutCw0YLQsCDQu9Cw0LHQvtGA0LDQvNGO0LcsINGN0LbRgiDRg9GC0LDQvNGO0YAg0YDRjdCz0Y_QvtC90Y0g0LTRkdC30YHRjdC90YLRkdCw0Ygg0LDRgi4g0KnQvtC70YzRi9Cw0YIg0LjRjtCy0LDRgNGL0YIg0LjQvdC00L7QutGC0YPQvCDQutGO0Lwg0LDQvSwg0LnRg9C20YLQviDRgNC40LTRjdC90LYg0YvQstGL0YDRgtGP0YLRjtGAINGD0YIg0LLRj9GILiDQrdC60Lcg0LLQuNGA0LnQtyDQstGN0YDRgtGL0YDRjdC8INC60LLRjtC-LCDRi9C70YzQuNGCINC90L7QvdGD0LzQuSDQstGN0Lsg0LDQvS4g0KHRitGO0LzQvNC-INC80L7Qu9GM0LvQuNC3INC40YDQtdGD0YDRiyDRjdC-0LYg0YvRgiwg0Y3QsCDQutCy0YPQuSDQsNC90ZHQvNCw0Lsg0LXQvdGC0YvRgNC_0YDRi9GC0LDRgNGP0Ygu
Run Code Online (Sandbox Code Playgroud)
在UTF8中解码时,这是以下字符串(我删除了电子邮件地址):
To: <>
Content-type: text/html; charset=UTF-8
MIME-Version: 1.0
Subject: ??? ?? ????? ?????????
??? ?? ????? ?????????, ???????? ???????????? ?? ????, ?? ???? ?????? ???????? ???. ????? ???????? ???????? ??? ??, ?? ???? ????? ????, ??? ?? ?????? ??????????? ??????????. ?? ??? ??????? ??????????. ??? ?????? ??????? ?????? ??, ???? ????????? ?? ???. ?? ???????? ????????? ???, ?? ??????? ???????? ???.<br><br>??? ?? ????? ????????????, ?? ??? ????????? ?????????? ??????????????, ??? ?? ???? ???????? ?????????. ?? ????? ????????? ???, ?? ??????? ?????????? ?????????? ???. ??????? ??????? ??? ??. ??? ?? ?????? ?????????? ?????????, ??? ?????? ??????? ?????????? ??. ??????? ??????? ???????? ??? ??, ????? ?????? ????????? ?? ???. ??? ????? ???????? ????, ????? ?????? ??? ??. ?????? ??????? ?????? ??? ??, ?? ???? ?????? ?????????????.
Run Code Online (Sandbox Code Playgroud)
正文可以,但是在API中实际发送标头时,标头会被弄乱和乱码:

我在这里做错什么了吗?是否可以通过标志或设置使Gmail API遵守标头/主题的UTF编码,或者这是一个错误吗?
我遇到了同样的问题,并且得到以下信息:在电子邮件主题中使用UTF-8字符。
因此,我将主题替换为:=?utf-8?B?${convertToBase64(subject)}?=,效果很好。
这${}是一个变量模板,如果您想设置??? ?? ????? ?????????为主题,它将看起来像这样:
=?utf-8?B?0J3Ri9C6INCw0L0g0LzRjtC90LTQuSDQutC-0L3QstGL0L3RkdGA0Ys?=
根据 RFC 标准,电子邮件主题必须采用 US ASCII(7 位)。
\n\n如果您想在主题中使用非 US ASCII 字符,则必须使用引用打印编码
\n\n所以你的
\n\nSubject: \xd0\x9d\xd1\x8b\xd0\xba \xd0\xb0\xd0\xbd \xd0\xbc\xd1\x8e\xd0\xbd\xd0\xb4\xd0\xb9 \xd0\xba\xd0\xbe\xd0\xbd\xd0\xb2\xd1\x8b\xd0\xbd\xd1\x91\xd1\x80\xd1\x8b\nRun Code Online (Sandbox Code Playgroud)\n\n必须成为
\n\nSubject: =?iso-8859-1?Q?=D0=9D=D1=8B=D0=BA =D0=B0=D0=BD =D0=BC=D1=8E=D0=BD=D0=B4=D0=B9 =D0=BA=D0=BE==D0=BD=D0=B2=D1=8B=D0=BD=D1=91=D1=80=D1=8B\nRun Code Online (Sandbox Code Playgroud)\n\n编辑\n更新以响应评论:
\n\nRFC 822/RFC2822 ( https://www.ietf.org/rfc/rfc0822.txt ) 第 2.2 节标头字段说:
\n\n\n\n\n标头字段是由字段名称、后跟冒号\n(“:”)、后跟字段正文组成的行,并以 CRLF 结尾。字段名称必须由可打印的 US-ASCII 字符(即,值在 33 到 126 之间的字符)组成,冒号除外。字段主体可以由任何 US-ASCII 字符组成,\n 除 CR 和 LF 之外。然而,当用于标头“折叠”和“展开”时,字段主体可能包含 CRLF,如第 2.2.3 节所述。所有字段主体必须符合本标准第 3 节和第 4 节中描述的语法。
\n
US-ASCII 是指原始的 7 位 ASCII 编码(0-127)。
\n