我正在使用 Google Apps 脚本通过电子邮件发送存储在我的 Google 驱动器上的 PDF。不幸的是,有一些限制,比如我可以发送的电子邮件数量,所以我想更改脚本以移动到我用 PHPmailer 准备的 PHP 页面来发送电子邮件。
这是 Google Apps 脚本中的实际解决方案(我想要替换的工作解决方案):
//Create file based on the GoogleSpredSheet URL:
var token = ScriptApp.getOAuthToken();
var docurl = UrlFetchApp.fetch(url, { headers: { 'Authorization': 'Bearer ' + token } });
var pdf = docurl.getAs('application/pdf');
var finalFile = DriveApp.createFile(pdf);
//Send e-mail
GmailApp.sendEmail (ToUser, MailSubject, MailBody, {
from: EmailFrom,
attachments: [finalFile]
});
因此,我创建了一个 PHP 页面(phpmailer.php),我们可以在其中使用以下变量通过 POST 方法推送电子邮件:
//Parameters
$RecipientEmail = $_POST['RecipientEmail'];
$RecipientLabel = $_POST["RecipientLabel"];
$EmailSubject = $_POST["EmailSubject"];
$AttachedFile = $_POST["AttachedFile"];
$EmailBody = $_POST["EmailBody"];
我按照 HTML 表单来测试我的邮件程序,我确认这工作正常:
<form action="phpmailer.php" method="POST" enctype="multipart/form-data">
<div class="row">
<div class="col">
<label for="RecipientEmail">Email du destinataire*</label>
<input type="email" class="form-control" name="RecipientEmail" aria-describedby="emailHelp" placeholder="Adresse e-mail" required>
</div>
<div class="col">
<label for="RecipientLabel">Nom du destinataire</label>
<input type="text" class="form-control" name="RecipientLabel" placeholder="Nom">
</div>
</div>
<div class="row">
<div class="col">
<label for="EmailSubject">Objet de l'email*</label>
<input type="text" class="form-control" name="EmailSubject" placeholder="Objet" required>
</div>
<div class="col">
<label for="AttachedFile">Pièce jointe</label>
<div class="custom-file">
<input type="file" class="form-control" name="AttachedFile" placeholder="Fichier">
</div>
</div>
</div>
<div class="form-group">
<label for="EmailBody">Corps de l'email</label>
<textarea id="story" class="form-control" name="EmailBody" placeholder="Message" rows="5" cols="33"></textarea>
</div>
<button type="submit" class="btn btn-primary">Envoyer l'email</button>
</form>
所以,现在我用以下代码替换 Google Apps 脚本中的代码(我第一次共享):
//Create file based on the GoogleSpredSheet URL:
var token = ScriptApp.getOAuthToken();
var docurl = UrlFetchApp.fetch(url, { headers: { 'Authorization': 'Bearer ' + token } });
var pdf = docurl.getAs('application/pdf');
var finalFile = DriveApp.createFile(pdf);
//Send e-mail
var payload = {
'RecipientEmail' : ToUser,
'RecipientLabel' : ToUserName,
'EmailSubject' : MailSubject,
'EmailBody' : MailBody,
'AttachedFile' : [finalFile]
};
var options = {
'method' : 'post',
'payload' : payload
};
var url = "http://XXX/phpmailer.php";
var httpRequest = UrlFetchApp.fetch(url, options).getContentText();
不幸的是,当电子邮件发送时,附件丢失了。
我从 PHP 页面执行了
var_dump ($AttachedFile);
并得到了 NULL
,所以这意味着 Google Apps 脚本没有推送我的文件 🙁
由于我无法发布文档,我找到了另一个解决方案:我正在发布文档的内容。
我从 Google Apps 脚本中提取文档的内容,然后使用 Base 64 对其进行编码:
var finalFileData = finalFile.getBlob().getBytes();
var finalFileBase64 = Utilities.base64Encode(finalFileData);
现在我有了一个字符串,因此我可以将其发布到我的 PHP 脚本中。
我只需修改我的 PHP 来捕获此 POST 并解码 Base 64,然后根据内容重新创建文件。