2016-11-29 4 views
1

Gmail APIを使用して添付ファイル付きのメッセージドラフトを作成し、GmailにアップロードするC#WinFormsアプリケーションを作成しました。これは数か月前までうまくいきました。そのコードは次のとおりです。C#デスクトップアプリケーションのDrafts用の再開可能なアップロード

上記のコードは、ドラフトメッセージのサイズが1 MB未満の場合にのみ機能します。

Google.GoogleApiException: Google.Apis.Requests.RequestError
Request payload size exceeds the limit: 1048576 bytes. [400]

私はそれが今1メガバイトを超える添付ファイル付きのドラフトをアップロードするためresumable upload protocolを使用する必要がありますように、GoogleはそのAPIを変更することを信じています。メッセージ/添付ファイルがこの制限を超えた場合、コードは次のエラーを発行します。

次に上記のコードの最後の行は、再開可能アップロードプロトコルをサポートアップロードを可能にするCreateMediaUpload Class Referenceを使用過

service.Users.Drafts.Create(draft, "me", stream, @"message/rfc822"); 

enter image description here

を有しています。しかし、ドラフト本体の作成方法やストリームのコード方法に関係なく、このオーバーロードを正しく使用して、任意のサイズのドラフトを作成してアップロードすることはできませんでした。このオーバーロードが機能するようにコードを構造化する正しい方法は何でしょうか?または、Gmail APIからの再開可能なアップロードプロトコルを使用して、C#デスクトップアプリケーションからの添付ファイル付きドラフトメッセージをアップロードする他の方法はありますか?すべての助けは非常に感謝しています。

更新

私は添付ファイルを追加する2行のコードを削除した場合、このコード行:

service.Users.Drafts.Create(draft, "me", stream, @"message/rfc822").Upload(); 

は、Gmailのそのボディテキストで草案が作成されます。しかし、私が考えることのできるものは、このオーバーロードを使用してドラフトの添付ファイルを作成および/またはストリーミングするものではありません。私はマルチパートのMIMEメッセージ、ファイルストリーム、メモリストリーム、および添付ファイルのbase64エンコーディングの有無にかかわらず試してみました。これまで読んでくれてありがとう。

+0

最後に、@ message/rfc822をGetMimeType(_uploadFile)に変更してみてください。 – DaImTo

+0

@DaImToの提案を歓迎しますが、これを動作させることはできません。 'stream.ReadTimeout'と' stream.WriteTimeout'に対する 'System.InvalidOperationException'です。私はストリームとドラフトのボディーがどう関係しているのだろうと思っています。ドラフト・ボディには何が流れているのか正確には何が流れているのですか?これはマルチパートのMIMEメッセージである必要がありますか?アップロードを再開可能と宣言する別の方法はありますか?これらの質問やその他の質問を引き続き検討します。 – joeschwa

+0

私はtbhを覚えていません私はそれを把握しようとしているライブラリのコードを掘り下げています:) – DaImTo

答えて

1

私は今朝前にC#でGoogle Gmail APIを使ったことがないので、私はあなたの質問に興味を持っていました。私はあなたの添付ファイルの問題を複製し、添付ファイルを含む成功したテスト電子メールで以下のコードを使用して解決しました。もし問題が残っている場合は、解決するようにマークしてください。もう一度見てみましょう)。

基本的に、私がやったことは

  1. パラメータとしてストリームオブジェクトを受け取り作成()メソッドの異なるオーバーロードを使用しています。
  2. この異なるオーバーロードは関数であり、CreateMediaUpload型を返します。
  3. このCreateMediaUploadタイプには、元のメッセージサイズの制限を回避して、再開可能なアップロードをサポートするアップロード(および非同期アップロード)メソッドがあります。

私が送ったテストファイルは1.6メガバイトでした。これは、あなたと私が以前に受け取っていたリクエストペイロードの最大しきい値よりもはるかに高いものでした。

ハッピーメールを送信しよう!もう一度、あなたがまだ問題を抱えている場合、コメントに私に教えてください...また、私はデバッグ/ストップウォッチ/送信何かにこれを置く前に最後に物事を削除したいと思います。テスト用です

 // Create Gmail API service. 
     var service = new GmailService(new BaseClientService.Initializer() 
      { 
       HttpClientInitializer = credential, 
       ApplicationName = ApplicationName, 
      }); 


     var file = new Attachment(FileLocation); 

     MailMessage msg = new MailMessage(); 
     msg.IsBodyHtml = true; 
     msg.Attachments.Add(file); 
     msg.Body = "Tester Body"; 
     msg.To.Add("[email protected]"); 

     MimeMessage messageMIME = MimeMessage.CreateFromMailMessage(msg); //using MimeKit here 
     MemoryStream memory = new MemoryStream(); 
     messageMIME.WriteTo(memory); 


     Draft draft = new Draft(); 

     var createRequest = service.Users.Drafts.Create(draft, "me", memory, @"message/rfc822"); 


     var startTime = Stopwatch.StartNew(); 
     var uploadProgress = createRequest.Upload(); 

     if (uploadProgress.Status == UploadStatus.Completed) 
     { 
      Debug.WriteLine(String.Format("Elapsed Time: {0}", startTime.Elapsed)); 
      Debug.WriteLine(String.Format("Status: {0}", uploadProgress.Status.ToString())); 
      Debug.WriteLine(String.Format("Bytes Sent: {0}", uploadProgress.BytesSent)); 

      //to send the draft email, uncomment the lines below 

      //draft = createRequest.ResponseBody; 
      //var send = service.Users.Drafts.Send(draft, "me"); 
      //send.Execute(); 

     } 
     else 
     { 
      Debug.WriteLine(String.Format("Exception: {0}", uploadProgress.Exception.Message)); 
     } 
+1

まずは感謝の言葉を聞かせて@HBomb!あなたのコードは動作します。ただ一つの事を追加したい。あなたの答えはあなたがbase64urlエンコーディングをリファクタリングしたと述べていますが、あなたが書いたコードはそれを省略しています。そして、エンコードが必要ないことがわかったので、私は[GMAIL API Working with Drafts]ページ(https://developers.google.com/gmail/api/guides/drafts)と[Gmail APi Uploading Attachments Page](https://developers.google.com/gmail/api/guides/uploads)を参照し、Base64urlでエンコードされた文字列を必要とする標準のドラフト作成とは対照的に、 'CreateMediaUpload'がバイナリデータをアップロードすることを確認しました。とても有難い! – joeschwa

+0

@joeschwa - 心配しないで、エンコードが削除されたという事実を反映するように投稿を更新しました。それは私のコードの以前のバージョンに存在していたので、私はそれを書いたときにちょっと混乱しました。それを指摘してくれてありがとう!ベスト、-H – HBomb

関連する問題