Пример создания черновика с вложением на С#?

Я написал тестовое приложение на C#, которое создает черновик сообщения с помощью нового API Gmail. Он отлично работает, когда сообщение не имеет вложений.

Я отказываюсь от IMAP API и использую компоненты MailBee.NET с этим API. Компоненты MailBee.NET включают класс, который создает сообщение RFC 2822, поэтому я повторно использовал его, закодировал сообщение в формате Base64 и присвоил свойству «Raw», как описано здесь:

https://developers.google.com/gmail/api/guides/drafts

        MailMessage msg = new MailMessage();
        msg.Subject = "test!";
        msg.BodyPlainText = "Test content";
        msg.Attachments.Add(@"D:\Trace.log", "Trace.log", Guid.NewGuid().ToString(), null, null, NewAttachmentOptions.Inline, MailTransferEncoding.Base64);

        Message m = new Message();
        m.Raw = Convert.ToBase64String(msg.GetMessageRawData());

        Draft d = new Draft();
        d.Message = m;
        d = gs.Users.Drafts.Create(d, "me").Execute();

Он отлично работает, когда вложение не добавлено, но завершается ошибкой с ответом 500, когда оно добавляется:

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "backendError",
    "message": "Backend Error"
   }
  ],
  "code": 500,
  "message": "Backend Error"
 }
}

Может ли кто-нибудь привести пример того, как это сделать с помощью .NET API? Пример на странице API очень прост и не дает много полезной информации, а документация не очень хороша. Вероятно, было бы лучше использовать классы Message / MessagePart / MessagePartBody, включенные в .NET Client, однако я не могу найти каких-либо четких указаний или примеров по их использованию, поэтому не знаю, с чего начать.

Вопросы:

1) Может ли кто-нибудь предоставить пример кода создания черновика сообщения с вложением с использованием классов в .NET Client?

2) Можно ли прикрепить более одного файла? Вся документация относится к одному файлу, а руководство Multipart относится ровно к двум частям: метаданным и вложению.


person Chris Wood    schedule 26.06.2014    source источник
comment
Весьма вероятно, что я неправильно использую классы Message/MessagePart/MessagePartBody. Что ж, посмотрим, как ты их используешь.   -  person Neil Smith    schedule 27.06.2014


Ответы (3)


Предоставление образца «сырого» поля, которое вы загружаете, определенно будет полезно для отладки (либо в кодировке base64, либо просто напрямую).

Однако это звучит как связанное с: API GMail: невозможно добавить вложение в черновик

person Eric D    schedule 27.06.2014

также об этом: m.Raw = Convert.ToBase64String(msg.GetMessageRawData());

вы хотите убедиться, что используете «веб-безопасный» (он же «безопасный для URL») алфавит кодировки base64 из http://tools.ietf.org/html/rfc4648#section-5

как сказано в документах по указанному вами URL-адресу: """ Ваше приложение может создавать черновики, используя метод drafts.create. Общий процесс заключается в следующем:

Создайте сообщение MIME, соответствующее RFC 2822. Преобразуйте сообщение в URL-безопасную строку в кодировке base64. Создайте черновик, установив значение поля drafts.message.raw в закодированную строку. """

Google API используют

person Eric D    schedule 27.06.2014

Как и в случае с плакатом другого вопроса, на который ссылался GmailGuy, это волшебным образом начало работать в одночасье. Так что, в конце концов, это, должно быть, была проблема на стороне Gmail.

Касательно:

m.Raw = Convert.ToBase64String(msg.GetMessageRawData());

Спасибо за предупреждение об этом; На самом деле я закодировал его ранее, но, пытаясь сделать 20 разных вещей, чтобы все заработало, я удалил его и забыл добавить обратно!

Кроме того, для подтверждения: да, вы можете добавить более одного вложения при использовании подхода с необработанным сообщением.

person Chris Wood    schedule 27.06.2014
comment
Рад, что это работает для вас сейчас, и спасибо за подтверждение. Само собой разумеется, что есть определенно люди Gmail, наблюдающие за переполнением стека для отчетов об ошибках! :) - person Eric D; 27.06.2014
comment
Я предполагаю, что msg.GetMessageRawData() относится к упомянутым вами компонентам MailBee.NET? Неужели нет другого способа сделать это? - person muttley91; 15.07.2014