【发布时间】:2020-12-23 23:38:48
【问题描述】:
我正在尝试将文件附加到我使用 Google Apps 脚本使用 MailApp.sendEmail() 发送的电子邮件中。在浏览器 JavaScript 中,我使用此代码手动读取文件,因为我已经处理了 HTML 表单中提交按钮的等效项,并且它可以工作:
var file = document.getElementById('myfile');
var fileInfo = [];
if(file.files.length) // if there is at least 1 file
{
if (file.files[0].size < maxEmailAttachmentSize) // and its size is < 25M
{
var reader = new FileReader();
reader.onload = function(e)
{
fileInfo[0] = e.target.result;
};
reader.readAsBinaryString(file.files[0]);
fileInfo[1] = file.files[0].name;
fileInfo[2] = file.files[0].type;
fileInfo[3] = file.files[0].size;
}
console.log(fileInfo); // here I see the full file and info. All looks correct.
}
然后我将它发送到服务器。
google.script.run.withSuccessHandler(emailSent).sendAnEmail(fileInfo);
在服务器上,我提取字段并发送电子邮件,如下所示:
var fname = fileInfo[1];
var mimeType = fileInfo[2];
var fblob = Utilities.newBlob(fileInfo[0], mimeType, fname);
// all looks right in the Logger at this point
try {
GmailApp.sendEmail(emaiRecipient, emailSubject, emailBody,
{
name: 'Email Sender', // email sender
attachments: [fblob]
}
);
catch …
当文件是文本文件或 HTML 文件时,这可以正常工作,但当文件是其他文件时则不行。该文件已发送,但它是空的并且显然已损坏。谁能看出这段代码有什么问题? (它也不适用于 MailApp.sendEmail()。)我确实在另一个 stackoverflow 帖子中看到该文档必须保存一次,但这是我绝对不想做的事情。难道没有别的办法了吗?我错过了什么?
【问题讨论】:
-
请添加更多详细信息。你想附加什么样的文件?文件大小是多少?文件是否包含可能有害、可疑、垃圾邮件的内容? FileReader 是异步的。您的客户端代码如何处理这个问题?另外,请添加minimal reproducible example。
-
我已尝试发送 .txt、.HTML、.JPG、.PNG 和 .PDF。只有前 2 个有效。它们都相对较小,在我的控制台输出中,我看到在浏览器端读取的文件在发送到服务器之前已经完成。在服务器端,我可以看到文件内容的日志与客户端上的相同。例如,JPG 和 PNG 文件很小,显然不是可疑文件或垃圾邮件。服务器端的 Mimetypes 对于每个文件都是正确的。我的代码中一定有错误,但是什么?
-
这能回答你的问题吗? stackoverflow.com/questions/7431365
-
@TheMaster 很有帮助。谢谢你。我试图将 readAsBinaryString() 更改为 readAsArrayBuffer() 保持所有其他内容相同,但我在服务器上收到 Uncaught TypeError 异常:由于属性中的非法值而失败:10。我可以在现有的使用 readAsArrayBuffer() 的客户端代码?我不能使用 Tanaike 的出色示例,因为我们在 Rhino JavaScript 引擎上运行,而不是 V8。我们不支持或更新最新的 JavaScript 语法。谢谢!
-
@jeff 更新到 v8。无论如何,Tanaike 的解决方案是完全客户端的。不需要v8。如果您遇到问题,那是由于其他原因,需要单独调查。
标签: javascript email google-apps-script