4

.Net クライアント ライブラリを使用して Gmail で下書きを作成しようとしています。認証と API が機能しているように、正常にログインしてドラフトのリストを取得できます。ここで、Draft クラスのインスタンスを作成して API に送信する必要があります。しかし、下書きメッセージはどのように見える必要があるのでしょうか? https://developers.google.com/gmail/api/v1/reference/users/drafts/createでAPI エクスプローラーに何を入力しても問題ありません。下書きは常に空です。また、私の C# コードから実行する場合、draft.Message.Raw フィールドを別のものに設定する必要があり、エラーが発生します。

Missing draft message [400] 
4

3 に答える 3

2

私は今日までこれに苦労していました。

私がしたことは、このリンクのソリューションを下書きに適応させることでした。 http://jason.pettys.name/2014/10/27/sending-email-with-the-gmail-api-in-net-c/

Jason は、AE.Net.Mail という nuget を使用して、メール オブジェクトを RFC 2822 にシリアル化します。

私がしたことは、両方のナゲットをインストールしたことです

Install-Package Google.Apis.Gmail.v1
Install-Package AE.Net.Mail

その後、2つのメソッドを作成しました

static GmailService Service;
    public static void CriaService(string emailaConectar)
    {
        var certificate = new X509Certificate2(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ClientCredentials.CertificatePath), ClientCredentials.ClientSecret, X509KeyStorageFlags.Exportable);

        var credential = new ServiceAccountCredential(
            new ServiceAccountCredential.Initializer(ClientCredentials.ServiceAccountEmail)
            {
                Scopes = new[] { GmailService.Scope.GmailCompose },
                User = emailaConectar
            }.FromCertificate(certificate)) { };

        Service = new GmailService(new BaseClientService.Initializer()
        {
            HttpClientInitializer = credential,
            ApplicationName = ClientCredentials.ApplicationName,
        });
    }

    private static string Base64UrlEncode(string input)
    {
        var inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
        // Special "url-safe" base64 encode.
        return Convert.ToBase64String(inputBytes)
          .Replace('+', '-')
          .Replace('/', '_')
          .Replace("=", "");
    }

そして、私の Main メソッドでは、このように設計しました

        CriaService("xpto@gmail.com");

        var msg = new AE.Net.Mail.MailMessage
        {
            Subject = "Your Subject",
            Body = "Hello, World, from Gmail API!",
            From = new MailAddress("xpto@gmail.com")
        };
        msg.To.Add(new MailAddress("someone@gmail.com"));
        msg.ReplyTo.Add(msg.From); 
        var msgStr = new StringWriter();
        msg.Save(msgStr);

        Message m = new Message();
        m.Raw = Base64UrlEncode(msgStr.ToString());

        var draft = new Draft();
        draft.Message = m;

        try
        {
            Service.Users.Drafts.Create(draft, "xpto@opportunity.com.br").Execute();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
于 2015-04-02T16:21:37.493 に答える