2016-03-02 93 views
2

我知道存在类似的问题,但我仍无法使其工作或理解我应该做什么。如何向包含多部分HTTP POST的SendGrid web api发送请求

我用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&[email protected]&toname=Destination&subject=Example_Subject&text=testingtextbody&[email protected] 

我没有看到一个多HTTP后会来到这个和它如何能取代当前的发布数据,我见过像在多部分HTTP帖子中设置标题和正文的东西,但我没有看到任何与我正在做什么或我应该如何处理它有关。

可能有人请给我的,我怎么能连接本地文件到后期调用SendGrid在Qt的C++

更新的例子: 这是我的贾斯汀·斯蒂尔的说明解释:

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("[email protected]"); 
     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("[email protected]"); 
     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("[email protected]&"); 
     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("[email protected]"); 



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

如果你可以“翻译” VBA到你的语言看我的回答[http://stackoverflow.com/questions/35423101/sendgrid-attachments-are-empty-or-corrupt-using-api-vba ](http://stackoverflow.com/questions/35423101/sendgrid-attachments-are-empty-or-corrupt-using-api-vba) –

+0

在那个例子中你会看到BASE64ENCODEDFILE,你会用Base64编码文件替换它(从磁盘读取,base64编码)。要添加更多文件,请添加:dataToSend = dataToSend +“ - ”+ boundary + vbCrLf dataToSend = dataToSend +“Content-Disposition:form-data; name =”“files [2]”“; filename =”“ my2ndPDF.pdf “”” + vbCrLf dataToSend = dataToSend + “内容类型:应用/八位字节流” + vbCrLf dataToSend = dataToSend + 2NDBASE64ENCODEDFILE + vbCrLf dataToSend = dataToSend + “ - ” +边界+ vbCrLf –

+0

发布一些代码,以便我们看到你正在尝试。这里是一个示例如何附加一个文件,并为QNAM多部分设置标头http://stackoverflow.com/questions/15109656/qnetworkaccessmanager-post-http-multipart-from-serial-qiodevice – misha130

回答

2

我这个用C#打得四处,得知你需要一个空行“\ r \ n”内容处置之间:线和价值。我相信你也需要在文件的Content-Type:行之后。最后一个边界以' - '结尾。

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("\r\n"); 
    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("\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("\r\n"); 
    data.append("[email protected]"); 
    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("\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("\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("\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("\r\n"); 
    data.append("[email protected]"); 
    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"); 
    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); 
+0

非常感谢,这工作!虽然它确实需要两个小改动,但我将'files [1]'重命名为'文件[TodayRoute.html]',并且从'file1.readAll()'中删除了'.toBase64()' – user2471711