如何向包含多部分 HTTP POST 的 SendGrid Web API 发出请求

How to make a request to SendGrid web api which includes a multipart HTTP POST

本文关键字:Web SendGrid API 请求 POST 包含多 HTTP      更新时间:2023-10-16

我知道有类似的问题,但我仍然无法让它工作或理解我应该做什么。

我用C++编写应用程序并使用QtCreator。我正在尝试使用 SendGrid Web api 发送一封附加了 html 文件的电子邮件。到目前为止,我已经能够发送电子邮件,但是在将文件附加到其中时遇到问题(该文件是本地的)。文档说:

文件内容必须是分段 HTTP POST 的一部分。 例如:files[file1.jpg]=file1.jpg&files[file2.pdf]=file2.pdf'

不确定这是什么意思,所以我研究了多部分 http 帖子是什么并看到了示例,但我看不出如何让它与我正在做的事情一起工作。到目前为止,我需要做的就是调用 post,输入请求的链接和 post 数据:

api_user=your_sendgrid_username&api_key=your_sendgrid_password&to=destination@example.com&toname=Destination&subject=Example_Subject&text=testingtextbody&from=info@domain.com

我不明白多部分 HTTP 帖子会在哪里出现,以及它如何替换当前的帖子数据,我看到了在多部分 HTTP 帖子中设置标题和正文之类的东西,但我看不出这些与我正在做的事情或我应该做什么有什么关系。

有人可以给我一个例子,说明如何在Qt C++中将本地文件附加到对SendGrid的后期调用

更新:这是我对贾斯汀·斯蒂尔(Justin steele)指示的解释:

 char speechMk = '"';
QString boundary = "----------------------------123456789abc";
    QByteArray data(QString("--" + boundary + "rn").toLatin1());
    data.append(QString("Content-Disposition: form-data; name=" + QString(speechMk) + "api_user" + QString(speechMk) + "rn").toLatin1());
       data.append("myuser");
       data.append("rn");
       data.append("--" + boundary + "rn");
       data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "api_key" + QString(speechMk) + "rn" );
       data.append("mypassword");
       data.append("rn");
       data.append("--" + boundary + "rn");
       data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "to" + QString(speechMk) + "rn");
       data.append("myemail@hotmail.co.uk");
       data.append("rn");
        data.append("--" + boundary + "rn");
       data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "toname" + QString(speechMk) + "rn");
       data.append( "Destination");
       data.append("rn");
       data.append("--" + boundary + "rn");
       data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "subject" + QString(speechMk) + "rn");
       data.append("eSubject");
       data.append("rn");
       data.append("--" + boundary + "rn");
       data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "text" + QString(speechMk) + "rn");
       data.append("eBody");
       data.append("rn");
       data.append("--" + boundary + "rn");
      data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "from" + QString(speechMk) + "rn");
      data.append("noreply@randomdomain.com");
      data.append("rn");
      data.append("--" + boundary + "rn");
      data.append("Content-Disposition: form-data; name=" +  QString(speechMk) + "files[1]" + QString(speechMk) + "; filename=" + QString(speechMk) + "TodayRoute.html" + QString(speechMk) + "rn");
      data.append("Content-Type: application/octet-stream");
      data.append("rn");
      QFile file1(path);
      if (!file1.open(QFile::ReadOnly)){
          qDebug() << "could not open";
      } else {
          data.append(file1.readAll().toBase64() + "rn");
      }
      data.append("--" + boundary + "rn");
    file1.close();
    QNetworkAccessManager theMan;
    QNetworkRequest req = QNetworkRequest(QUrl("https://api.sendgrid.com/api/mail.send.json"));
    req.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("multipart/form-data; boundary=" + boundary));
    theMan.post(req,data);

这是我之前(下面)的,它会发送一封带有附件的电子邮件,但附加文件不包含我想要的内容。

 QByteArray data(QString("api_user=myuser&").toLatin1());
        data.append("api_key=mypassword&");
        data.append("to=myemail@hotmail.co.uk&");
        data.append("toname=Destination&");
        data.append("files[TodayRoute.html]=");
        QFile file(path);
            if (!file.open(QIODevice::ReadOnly)){
                qDebug() << "QFile Error: File not found!";
            //    return data;
            } else { qDebug() << "File found, proceed as planned"; }
        data.append(file.readAll());
        data.append("&subject=Example_Subject&");
        data.append("text=testingtextbody&");
        data.append("from=noreply@domainrandom.com");

           QUrl mResultsURL = QUrl("https://api.sendgrid.com/api/mail.send.json");
           QNetworkAccessManager mNetworkManager;
           QNetworkRequest request(mResultsURL); //our server with php-script
          mNetworkManager.post(request,data);
        file.close(); 

我用 C# 玩了一下,了解到在 Content-Disposition: 行和值之间需要一个空行"\r"。我相信您还需要在文件的内容类型:行之后添加一个。最后一个边界以"--"结尾。

    char speechMk = '"';
    QString boundary = "----------------------------123456789abc";
    QByteArray data(QString("--" + boundary + "rn").toLatin1());
    data.append(QString("Content-Disposition: form-data; name=" + QString(speechMk) + "api_user" + QString(speechMk) + "rn").toLatin1());
    data.append("rn");
    data.append("myuser");
    data.append("rn");
    data.append("--" + boundary + "rn");
    data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "api_key" + QString(speechMk) + "rn" );
    data.append("rn");
    data.append("mypassword");
    data.append("rn");
    data.append("--" + boundary + "rn");
    data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "to" + QString(speechMk) + "rn");
    data.append("rn");
    data.append("myemail@hotmail.co.uk");
    data.append("rn");
    data.append("--" + boundary + "rn");
    data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "toname" + QString(speechMk) + "rn");
    data.append("rn");
    data.append( "Destination");
    data.append("rn");
    data.append("--" + boundary + "rn");
    data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "subject" + QString(speechMk) + "rn");
    data.append("rn");
    data.append("eSubject");
    data.append("rn");
    data.append("--" + boundary + "rn");
    data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "text" + QString(speechMk) + "rn");
    data.append("rn");
    data.append("eBody");
    data.append("rn");
    data.append("--" + boundary + "rn");
    data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "from" + QString(speechMk) + "rn");
    data.append("rn");
    data.append("noreply@randomdomain.com");
    data.append("rn");
    data.append("--" + boundary + "rn");
    data.append("Content-Disposition: form-data; name=" +  QString(speechMk) + "files[1]" + QString(speechMk) + "; filename=" + QString(speechMk) + "TodayRoute.html" + QString(speechMk) + "rn");
    data.append("Content-Type: application/octet-stream");
    data.append("rn");
    data.append("rn");
    QFile file1(path);
    if (!file1.open(QFile::ReadOnly)){
        qDebug() << "could not open";
    } else {
        data.append(file1.readAll().toBase64() + "rn");
    }
    data.append("--" + boundary + "--rn");
    file1.close();
    QNetworkAccessManager theMan;
    QNetworkRequest req = QNetworkRequest(QUrl("https://api.sendgrid.com/api/mail.send.json"));
    req.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("multipart/form-data; boundary=" + boundary));
    theMan.post(req,data);