无法通过POST方法发送文档到PHP页面

问题描述 投票:0回答:1

我正在使用 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 脚本没有推送我的文件 🙁

php file email google-apps-script post
1个回答
0
投票

由于我无法发布文档,我找到了另一个解决方案:我正在发布文档的内容。

我从 Google Apps 脚本中提取文档的内容,然后使用 Base 64 对其进行编码:

var finalFileData = finalFile.getBlob().getBytes();
var finalFileBase64 = Utilities.base64Encode(finalFileData);

现在我有了一个字符串,因此我可以将其发布到我的 PHP 脚本中。

我只需修改我的 PHP 来捕获此 POST 并解码 Base 64,然后根据内容重新创建文件。

© www.soinside.com 2019 - 2024. All rights reserved.