当前位置: 首页 > 知识库问答 >
问题:

使用Gmail API发送带有附件(PDF)的邮件

孟文栋
2023-03-14

所有数据以文本格式发送,而不是作为附件的PDF格式。

var boundary = "__myapp__", nl = "\n";
// var attach = data.toString("base64");
var fileName = "abc.pdf";
var attach = new Buffer(fs.readFileSync("./" + fileName)).toString("base64");

var str = ["Content-Type: text/plain; charset=\"UTF-8\"\n",
    "MIME-Version: 1.0\n",
    "Content-Transfer-Encoding: 7bit\n",
    "to: ", to, "\n",
    "subject: ", subject, "\n\n",
    "Content-Type: multipart/alternate; boundary=" + boundary + nl,
    "--" + boundary,
    "Content-Type: text/plain; charset=UTF-8",
    "Content-Transfer-Encoding: 7bit" + nl,
    message + nl,
    "--" + boundary,
    "--" + boundary,
    "Content-Type: Application/pdf; name=myPdf.pdf",
    'Content-Disposition: attachment; filename=myPdf.pdf',
    "Content-Transfer-Encoding: base64" + nl,
    attach,
    "--" + boundary + "--"
].join('');

var encodedMail = new Buffer(str).toString("base64")
    .replace(/\+/g, '-')
    .replace(/\//g, '_');

resolve(encodedMail);


内容类型:多部分/备用;边界=myapp--_myapp_内容类型:文本/普通;charset=UTF-8Content-Transfer-Encoding:7bit测试消息--myapp--_myapp_Content-Type:Application/pdf;name=myPdf。PDF内容处置:附件;filename=myPdf。PDF内容传输编码:base64 JVBERi0xLjMgCiXi48/Tiaoxiagb2Jqiao8PCAKl1R5CGUGL0NHDGFSB2CGCI9QYWDLCYIDAGUIDAGUIDAKL1BHZ2VNB2RLIC9VC2VOB25LIAVVMLLD2VYUHJLZMVYZW5JZXMGPDWGCI9GAXRXAW5KB3CGDHJ1ZSAKL1BHZ2VMYXLLVDXQ1NPBMDSZVBZ2UGCI9OB25GDWXSU2NYZWWWWWWUGUGZUGZU5VZUGZU7V45月2日,社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区社区Pauil6GT97TzwinAnFKxzH199 ssQIywTBkAIURx92EgVBEWQG4dznCc。。。更多文本。。。终于==--myapp--


我想的是,发送带有附件的邮件的模板可能有一些问题。

这里有人能帮忙吗<谢谢

共有1个答案

季骏祥
2023-03-14

我能够通过使用适当的消息结构附加PDF文件。设置正确的mimetype和边界非常重要。

此引用(https://stackoverflow.com/a/50540373/13664358)由@Tanaike指出的帮助很大!

以下是发送带有PDF附件的电子邮件的全部功能:

const subject = 'My Subject';
const utf8Subject = `=?utf-8?B?${Buffer.from(subject).toString('base64')}?=`;

var fileName = "mypdf.pdf";
var attach = new Buffer.from(fs.readFileSync("./" + fileName)).toString("base64");

var emailBody = 'My Email Message';

var messageParts = [
    "MIME-Version: 1.0",
    'From: Teste <teste@teste.com>',
    'To: Teste <teste@teste.com>',
    `Subject: ${utf8Subject}`,
    "Content-Type: multipart/mixed; boundary=012boundary01",
    '',
    "--012boundary01",
    "Content-Type: multipart/alternative; boundary=012boundary02",
    '',
    "--012boundary02",
    "Content-type: text/html; charset=UTF-8", 
    "Content-Transfer-Encoding: quoted-printable",
    '',
    emailBody,
    '',
    "--012boundary02--",
    "--012boundary01",
    "Content-Type: Application/pdf; name=mypdf.pdf",
    'Content-Disposition: attachment; filename=mypdf.pdf',
    "Content-Transfer-Encoding: base64",
    '',
    attach,
    "--012boundary01--",
]

const message = messageParts.join('\n');

// The body needs to be base64url encoded.
const encodedMessage = Buffer.from(message)
  .toString('base64')
  .replace(/\+/g, '-')
  .replace(/\//g, '_')
  .replace(/=+$/, '');

const gmail = google.gmail({version: 'v1', auth});
gmail.users.messages.send({
  userId: 'me',
  requestBody: {
      raw: encodedMessage
  }
}, (err, res) => {
  if (err) return console.log('The API returned an error: ' + err);
});

注意:上面的代码对nodejs使用googleapi(https://www.npmjs.com/package/googleapis)

对于多个PDF,我们可以在--012boundary02--和--012boundary01--之间添加它们,如下所示:

"--012boundary02",
"Content-type: text/html; charset=UTF-8", 
"Content-Transfer-Encoding: quoted-printable",
'',
emailBody,
'',
"--012boundary02--",
"--012boundary01",
"Content-Type: Application/pdf; name=mypdf.pdf",
'Content-Disposition: attachment; filename=mypdf.pdf',
"Content-Transfer-Encoding: base64",
'',
attach,
"--012boundary01",
"Content-Type: Application/pdf; name=mypdf2.pdf",
'Content-Disposition: attachment; filename=mypdf2.pdf',
"Content-Transfer-Encoding: base64",
'',
attach2,
"--012boundary01",
"Content-Type: Application/pdf; name=mypdf3.pdf",
'Content-Disposition: attachment; filename=mypdf3.pdf',
"Content-Transfer-Encoding: base64",
'',
attach3,
"--012boundary01--",
 类似资料:
  • 尝试发送带有pdf附件的电子邮件,尝试使用swickmailer,但没有成功,此代码使用zip但不使用PDF:( 邮件被发送罚款,我得到的邮件:但附件是不存在的,在meial有所有的bas64编码在电子邮件像: onatatent-Type: Application/octet-stream; name="media.pdf"Content-transver-Encode: base 64 Con

  • 我需要在我的应用程序中集成邮件服务。我的应用程序应该发送电子邮件,其中必须附上。pdf文件(详细报告)。PDF文件现在位于远程服务器上。 有人能帮我理解如何在黑莓手机上发送带有pdf附件的邮件吗?如果实施是可行的,那么我将如何实施? 以下是我从Blackberry知识库论坛获得的用Blackberry发送邮件的链接 如何-创建附件 如何创建和发送消息

  • 问题内容: 如何使用Outlook 2010发送带有附件的电子邮件(本地文件或Intranet中的文件)? 似乎不起作用。 问题答案: 不,这根本不可能。协议中对此没有规定,如果可能的话,这将是一个巨大的安全漏洞。 发送文件但让客户端发送我能想到的电子邮件的最佳方法是: 让用户选择一个文件 将文件上传到服务器 上传后让服务器返回随机文件名 在消息正文中建立一个包含上载文件的URL 的链接

  • 我正在将Mailgun集成到我的iOS应用程序中,并尝试发送带有附件的电子邮件。电子邮件已发送,但附件似乎已被忽略。有什么想法吗?代码如下。我使用的是AFNetworking 2,我没有使用本机的Mailgun Objective-C SDK,因为它似乎没有得到维护。 我可以使用curl发送附件,例如:

  • 问题内容: 我遇到了一个问题:直到今天,我使用包含以下内容的标头使用PHP发送HTML邮件 现在,我添加了添加附件的功能。为此,我不得不将此行更改为 现在,使用,邮件的其余部分(即普通文本)将显示为文本/纯文本。我怎么能知道附件有效并且邮件文本仍然是HTML? 问题答案: 要发送带有附件的电子邮件,我们需要使用multipart / mixed MIME类型,该类型指定混合类型将包含在电子邮件中。

  • 我们正在尝试向多个用户发送带有PDF附件的电子邮件。附加的PDF通过kartik\mpdf\PDF生成。 我们采取的步骤 从DB中获取用户和消息内容 对于所有可用的用户,生成电子邮件对象,也生成PDF并发送带有附加pdf的邮件。 要发送电子邮件,我们使用亚马逊SES。 =========================== PHP通知–yii\base\ErrorException 未定义索引:数