如何向SendGrid web api发出包含多部分HTTP POST

时间:2016-03-02 20:48:27

标签: c++ qt post multipart sendgrid

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

我用C ++编写应用程序并使用QtCreator。我正在尝试使用SendGrid web api发送附带html文件的电子邮件。到目前为止,我已经能够发送电子邮件,但我无法将文件附加到它(该文件是本地的)。文档说:

  

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

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

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的调用

更新: 这是我对贾斯汀斯蒂尔的指示的解释:

 char speechMk = '"';
QString boundary = "----------------------------123456789abc";
    QByteArray data(QString("--" + boundary + "\r\n").toLatin1());
    data.append(QString("Content-Disposition: form-data; name=" + QString(speechMk) + "api_user" + QString(speechMk) + "\r\n").toLatin1());
       data.append("myuser");
       data.append("\r\n");

       data.append("--" + boundary + "\r\n");
       data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "api_key" + QString(speechMk) + "\r\n" );
       data.append("mypassword");
       data.append("\r\n");

       data.append("--" + boundary + "\r\n");
       data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "to" + QString(speechMk) + "\r\n");
       data.append("myemail@hotmail.co.uk");
       data.append("\r\n");

        data.append("--" + boundary + "\r\n");
       data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "toname" + QString(speechMk) + "\r\n");
       data.append( "Destination");
       data.append("\r\n");

       data.append("--" + boundary + "\r\n");
       data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "subject" + QString(speechMk) + "\r\n");
       data.append("eSubject");
       data.append("\r\n");

       data.append("--" + boundary + "\r\n");
       data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "text" + QString(speechMk) + "\r\n");
       data.append("eBody");
       data.append("\r\n");

       data.append("--" + boundary + "\r\n");
      data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "from" + QString(speechMk) + "\r\n");
      data.append("noreply@randomdomain.com");
      data.append("\r\n");

      data.append("--" + boundary + "\r\n");
      data.append("Content-Disposition: form-data; name=" +  QString(speechMk) + "files[1]" + QString(speechMk) + "; filename=" + QString(speechMk) + "TodayRoute.html" + QString(speechMk) + "\r\n");

      data.append("Content-Type: application/octet-stream");
      data.append("\r\n");
      QFile file1(path);
      if (!file1.open(QFile::ReadOnly)){
          qDebug() << "could not open";
      } else {
          data.append(file1.readAll().toBase64() + "\r\n");
      }
      data.append("--" + boundary + "\r\n");

    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(); 

1 个答案:

答案 0 :(得分:2)

我使用C#解决了这个问题,并了解到在Content-Disposition:行和值之间需要一个空行“\ r \ n”。我相信你还需要一个在Content-Type:行之后的文件。最后一个边界以“ - ”结尾。

db:migrate