How to create a Gmail API message

I want to send a message using the Google Gmail API. I have successfully authenticated and am trying to use GmailService to send a message.

I would like to use this:

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

where myService is Google.Apis.Gmail.v1.GmailService and myMessage is Google.Apis.Gmail.v1.Data.Message .

myService great, I did an OAuth dance. I can receive messages from the inbox and all that. But I do not know how to build myMessage . I have standard .NET MailMessage , with the person being read by Subject, Body, To, From, etc.

But the Google Message class accepts Payload or Raw fields. What is the easiest way to convert full MailMessage to a string that I can set for Payload or Raw properties? Or is this not what I should do at all?

Documentation for the message class .

+5
source share
4 answers

I have found a solution. Oddly enough, .NET does not seem to support this natively / easily. There is a good nuget package, although it is called AE.Net.Mail, which can write an easy-to-create message object to the stream.

Here is an example code that pointed me in that direction .

The copied and pasted code as a site does not seem to work, and Googleโ€™s cache may not last forever:

 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(" yourbuddy@gmail.com ")); 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("=", ""); } } 
+7
source

Here is an alternate version using 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("=", ""); } 

Note. If you get a problem with email failure, this is probably due to the fact that the ReplyToList field is not set. See: Google API Failures from GMail

+2
source

C # code for Gmail API message (sending email)

  namespace GmailAPIApp { class SendMail { static string[] Scopes = { GmailService.Scope.GmailSend }; static string ApplicationName = "Gmail API .NET Quickstart"; static void Main(string[] args) { UserCredential credential; using (var stream = new FileStream("credentials_dev.json", FileMode.Open, FileAccess.Read)) { string credPath = "token_Send.json"; credential = GoogleWebAuthorizationBroker.AuthorizeAsync( GoogleClientSecrets.Load(stream).Secrets, Scopes, "user", CancellationToken.None, new FileDataStore(credPath, true)).Result; Console.WriteLine("Credential file saved to: " + credPath); } // Create Gmail API service. var service = new GmailService(new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = ApplicationName, }); // Define parameters of request. string plainText = "To: xxxx@gmail.com \r\n" + "Subject: Gmail Send API Test\r\n" + "Content-Type: text/html; charset=us-ascii\r\n\r\n" + "<h1>TestGmail API Testing for sending <h1>"; var newMsg = new Google.Apis.Gmail.v1.Data.Message(); newMsg.Raw = SendMail.Base64UrlEncode(plainText.ToString()); service.Users.Messages.Send(newMsg, "me").Execute(); Console.Read(); } 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("=", ""); } } } 
0
source

This is the code that worked for me:

 Private Async Sub BtnSendGmail_Click(sender As Object, e As EventArgs) Handles BtnSendGmail.Click Try Dim credential As UserCredential = Await GoogleWebAuthorizationBroker.AuthorizeAsync(New ClientSecrets With { .ClientId = "---------Your ClientId------------", .ClientSecret = "----------Your ClientSecret-----------" }, {GmailService.Scope.GmailSend}, "user", CancellationToken.None, New FileDataStore(Me.GetType().ToString())) Dim service = New GmailService(New BaseClientService.Initializer() With { .HttpClientInitializer = credential, .ApplicationName = Me.GetType().ToString() }) Dim plainText As String = "From: sender@gmail.com " & vbCrLf & "To: dest1@gmail.com ," & " dest2@gmail.com " & vbCrLf & "Subject: This is the Subject" & vbCrLf & "Content-Type: text/html; charset=us-ascii" & vbCrLf & vbCrLf & "This is the message text." Dim newMsg = New Google.Apis.Gmail.v1.Data.Message With { .Raw = EncodeBase64(plainText.ToString()) } service.Users.Messages.Send(newMsg, "me").Execute() MessageBox.Show("Message Sent OK") Catch ex As Exception MessageBox.Show("Message failed :" & vbCrLf & "Source: " & ex.Source & vbCrLf & "HResult: " & ex.HResult & vbCrLf & "Message: " & ex.Message & vbCrLf & "StackTrace: " & ex.StackTrace) End Try End Sub Public Shared Function EncodeBase64(ByVal text As String) As String ' Encodes a text-string for sending as an email message Dim bytes As Byte() = System.Text.Encoding.UTF8.GetBytes(text) Return System.Convert.ToBase64String(bytes).Replace("+"c, "-"c).Replace("/"c, "_"c).Replace("=", "") End Function 
0
source

Source: https://habr.com/ru/post/1232294/


All Articles