2016-03-02 90 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