使用应用程序脚本在 Gmail 中批量发送带有相应附件的电子邮件
BulkSend emails with respective attachments in Gmail using appscript
我想使用电子表格批量发送 google 带附件的邮件。在这个 spreadsheet 中,我已经放置了电子邮件地址、内容模板和相应的附件 url。
当我尝试执行下面的代码时,除了 行项目 #21 “attachments.push(file.getAs(MimeType.PDF)) 之外,一切都很顺利。 ",显示错误。当我删除第 21 行并执行时,我可以发送带有 HTML 附件的批量电子邮件,而不是包含病毒并被标记为垃圾邮件的 PDF。
有人可以用正确的代码帮助我执行相同的操作并直接发送 pdf 而不是 HTML
var EMAIL_SENT = "EMAIL_SENT";
function sendEmails() {
var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 2;
var numRows = 3;
var blobs = [];
var dataRange = sheet.getRange(startRow, 1, numRows, 5)
var data = dataRange.getValues();
for (var i = 0; i < data.length; ++i) {
var row = data[i];
var emailAddress = row[2];
var subject = "Attachments";
var message = row[4];
var options = {muteHttpExceptions:true};
var attachments = UrlFetchApp.fetch(row[3], options).getBlob();
attachments.push(file.getAs(MimeType.PDF));
var emailSent = row[0];
if (emailSent != EMAIL_SENT) {
GmailApp.sendEmail(emailAddress, subject, message, {attachments: attachments,});
sheet.getRange(startRow + i, 1).setValue(EMAIL_SENT);
SpreadsheetApp.flush();
}
}
}
修改点:
- 当我看到您的脚本时,我认为您在
attachments.push(file.getAs(MimeType.PDF))
出现问题的原因是由于 var attachments = UrlFetchApp.fetch(row[3], options).getBlob();
。在这一行,attachments
是 HTTPResponse 对象。为此,您的 attachments.push(file.getAs(MimeType.PDF))
脚本尝试将 file.getAs(MimeType.PDF)
设置为 attachments
。由此,错误发生。并且,file
未声明。
- 而且,当我看到您的电子表格时,我注意到文件的 URL 是
https://drive.google.com/file/d/###/view?usp=sharing
等公开共享文件的 link。从这种情况来看,我认为那些文件可能是公开共享的或您的文件。如果我的理解是正确的,我认为你可以使用 Drive Service of DriveApp
and the method getBlob. Furthermore, as you can see in GmailApp: sendEmail 直接检索文件,option
参数中的 attachments
参数与 BlobSource
变量一起使用, 与 returns getBlob
. 相同
当以上几点反映到你的脚本中,就变成了下面这样。
修改后的脚本:
var EMAIL_SENT = "EMAIL_SENT";
function sendEmails() {
var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 2;
var numRows = 3;
var dataRange = sheet.getRange(startRow, 1, numRows, 5);
var data = dataRange.getValues();
for (var i = 0; i < data.length; ++i) {
var row = data[i];
var emailAddress = row[2];
var subject = "Attachments";
var message = row[4];
var fileId = row[3].split("/")[5];
var emailSent = row[0];
try {
var file = DriveApp.getFileById(fileId);
if (emailSent != EMAIL_SENT) {
GmailApp.sendEmail(emailAddress, subject, message, { attachments: [file.getBlob()] });
sheet.getRange(startRow + i, 1).setValue(EMAIL_SENT);
// SpreadsheetApp.flush(); // I think that this might not be required to be used.
}
} catch(e) {
console.log("File of " + row[3] + "cannot be retrieved. Error message is " + e.message);
}
}
}
注:
- 在上面的脚本中,当URL(
row[3]
)的文件无法检索时,可以在日志中看到URL。
参考:
我想使用电子表格批量发送 google 带附件的邮件。在这个 spreadsheet 中,我已经放置了电子邮件地址、内容模板和相应的附件 url。
当我尝试执行下面的代码时,除了 行项目 #21 “attachments.push(file.getAs(MimeType.PDF)) 之外,一切都很顺利。 ",显示错误。当我删除第 21 行并执行时,我可以发送带有 HTML 附件的批量电子邮件,而不是包含病毒并被标记为垃圾邮件的 PDF。
有人可以用正确的代码帮助我执行相同的操作并直接发送 pdf 而不是 HTML
var EMAIL_SENT = "EMAIL_SENT";
function sendEmails() {
var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 2;
var numRows = 3;
var blobs = [];
var dataRange = sheet.getRange(startRow, 1, numRows, 5)
var data = dataRange.getValues();
for (var i = 0; i < data.length; ++i) {
var row = data[i];
var emailAddress = row[2];
var subject = "Attachments";
var message = row[4];
var options = {muteHttpExceptions:true};
var attachments = UrlFetchApp.fetch(row[3], options).getBlob();
attachments.push(file.getAs(MimeType.PDF));
var emailSent = row[0];
if (emailSent != EMAIL_SENT) {
GmailApp.sendEmail(emailAddress, subject, message, {attachments: attachments,});
sheet.getRange(startRow + i, 1).setValue(EMAIL_SENT);
SpreadsheetApp.flush();
}
}
}
修改点:
- 当我看到您的脚本时,我认为您在
attachments.push(file.getAs(MimeType.PDF))
出现问题的原因是由于var attachments = UrlFetchApp.fetch(row[3], options).getBlob();
。在这一行,attachments
是 HTTPResponse 对象。为此,您的attachments.push(file.getAs(MimeType.PDF))
脚本尝试将file.getAs(MimeType.PDF)
设置为attachments
。由此,错误发生。并且,file
未声明。 - 而且,当我看到您的电子表格时,我注意到文件的 URL 是
https://drive.google.com/file/d/###/view?usp=sharing
等公开共享文件的 link。从这种情况来看,我认为那些文件可能是公开共享的或您的文件。如果我的理解是正确的,我认为你可以使用 Drive Service ofDriveApp
and the method getBlob. Furthermore, as you can see in GmailApp: sendEmail 直接检索文件,option
参数中的attachments
参数与BlobSource
变量一起使用, 与 returnsgetBlob
. 相同
当以上几点反映到你的脚本中,就变成了下面这样。
修改后的脚本:
var EMAIL_SENT = "EMAIL_SENT";
function sendEmails() {
var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 2;
var numRows = 3;
var dataRange = sheet.getRange(startRow, 1, numRows, 5);
var data = dataRange.getValues();
for (var i = 0; i < data.length; ++i) {
var row = data[i];
var emailAddress = row[2];
var subject = "Attachments";
var message = row[4];
var fileId = row[3].split("/")[5];
var emailSent = row[0];
try {
var file = DriveApp.getFileById(fileId);
if (emailSent != EMAIL_SENT) {
GmailApp.sendEmail(emailAddress, subject, message, { attachments: [file.getBlob()] });
sheet.getRange(startRow + i, 1).setValue(EMAIL_SENT);
// SpreadsheetApp.flush(); // I think that this might not be required to be used.
}
} catch(e) {
console.log("File of " + row[3] + "cannot be retrieved. Error message is " + e.message);
}
}
}
注:
- 在上面的脚本中,当URL(
row[3]
)的文件无法检索时,可以在日志中看到URL。