2015-09-25 24 views
5

GoogleのGmail APIを使用してメッセージを送信したいと思います。認証に成功し、GmailServiceを使用してメッセージを送信しようとしています。Gmail APIメッセージの作成方法

私はこれを使用したい:

myService.Users.Messages.Send(myMessage, "me").Execute(); 

myServiceというはGoogle.Apis.Gmail.v1.GmailServiceある場合とmyMessageはGoogle.Apis.Gmail.v1.Data.Messageです。

myServiceいいです、私はOAuthのダンスをしました。私は自分の受信トレイやそのすべてからメッセージを受け取ることができます。しかし、私はmyMessageを構築する方法を知らない。私は、など

から、するために、人間が読める件名で、本文を標準.NET MailMessageを持っているしかし、Google MessageクラスはフィールドPayloadまたはRawをとります。 MailMessagePayloadまたはRawのプロパティに設定できる文字列に変換する最も簡単な方法は何ですか?それとも私がやっているべきことではないのですか?

The documentation for the Message class

答えて

7

解決策が見つかりました。不思議なことに、.NETはこれをネイティブに/簡単にサポートしていないようです。しかし、AE.Net.Mailと呼ばれる素敵なナゲットパッケージがあります。これは簡単に作成できるメッセージオブジェクトをストリームに書き込むことができます。

Here's the sample code that pointed me in that direction。サイトとして

コピーと貼り付けコードがダウンしているようだ、とGoogleのキャッシュが永遠に続くしない場合があります。

using System.IO; 
using System.Net.Mail; 
using Google.Apis.Gmail.v1; 
using Google.Apis.Gmail.v1.Data; 

public class TestEmail { 

    public void SendIt() { 
    var msg = new AE.Net.Mail.MailMessage { 
     Subject = "Your Subject", 
     Body = "Hello, World, from Gmail API!", 
     From = new MailAddress("[you]@gmail.com") 
    }; 
    msg.To.Add(new MailAddress("[email protected]")); 
    msg.ReplyTo.Add(msg.From); // Bounces without this!! 
    var msgStr = new StringWriter(); 
    msg.Save(msgStr); 

    var gmail = new GmailService(Context.GoogleOAuthInitializer); 
    var result = gmail.Users.Messages.Send(new Message { 
     Raw = Base64UrlEncode(msgStr.ToString()) 
    }, "me").Execute(); 
    Console.WriteLine("Message ID {0} sent.", result.Id); 
    } 

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

今後これを見ている人は、AE.Net.Mail'Nugetパッケージ(https://www.nuget.org/packages/AE.Net.Mail/)を使用していることを確認してください。 'System.Net.Mail'(https://msdn.microsoft.com/en-us/library/system.net.mail(v=vs.110).aspx)ではありません。それらは*とても*類似していますが、動作が少し異なります(例えば 'System.Net.Mail.MailMessage'は' Save'メソッドを持っていません) – derekantrican

0

ここMimeKitを使用して使用する代替バージョンがあります。

public void SendEmail(MyInternalSystemEmailMessage email) 
{ 
    var mailMessage = new System.Net.Mail.MailMessage(); 
    mailMessage.From = new System.Net.Mail.MailAddress(email.FromAddress); 
    mailMessage.To.Add(email.ToRecipients); 
    mailMessage.ReplyToList.Add(email.FromAddress); 
    mailMessage.Subject = email.Subject; 
    mailMessage.Body = email.Body; 
    mailMessage.IsBodyHtml = email.IsHtml; 

    foreach (System.Net.Mail.Attachment attachment in email.Attachments) 
    { 
     mailMessage.Attachments.Add(attachment); 
    } 

    var mimeMessage = MimeKit.MimeMessage.CreateFromMailMessage(mailMessage); 

    var gmailMessage = new Google.Apis.Gmail.v1.Data.Message { 
     Raw = Encode(mimeMessage.ToString()) 
    }; 

    Google.Apis.Gmail.v1.UsersResource.MessagesResource.SendRequest request = service.Users.Messages.Send(gmailMessage, ServiceEmail); 

    request.Execute(); 
} 

public static string Encode(string text) 
{ 
    byte[] bytes = System.Text.Encoding.UTF8.GetBytes(text); 

    return System.Convert.ToBase64String(bytes) 
     .Replace('+', '-') 
     .Replace('/', '_') 
     .Replace("=", ""); 
} 

注:あなたは電子メールのバウンスの問題を取得している場合、それが原因ReplyToListフィールドを設定しないように思われます。参照してください:GMail API Emails Bouncing

関連する問題