Creating a Message for Gmail API in C#

前端 未结 3 1614
离开以前
离开以前 2020-12-16 16:31

I\'m looking at using the Gmail API in an application I\'m working on. However, I\'m not sure how to change their Java or Python examples over to C#. How exactly does the ex

相关标签:
3条回答
  • 2020-12-16 16:55

    Seems like this isn't really an issue with the Gmail API. What you should be looking for is "c# create email" (potentially adding "RFC 2822" as that's the RFC that defines the format for these emails). Once you have such a valid "email message" (the real, entire email content you can use with SMTP or IMAP, etc) then using it with the Gmail API should be pretty trivial.

    0 讨论(0)
  • 2020-12-16 16:57

    This was a tricky problem to solve, but I did end up getting it. I used the NuGet package AE.Net.Mail to get the RFC 2822 bit.

    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(MyOwnGoogleOAuthInitializer);
        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("=", "");
      }
    }
    

    Same code with a little further analysis and reasons are posted here: http://jason.pettys.name/2014/10/27/sending-email-with-the-gmail-api-in-net-c/

    0 讨论(0)
  • 2020-12-16 17:13

    Here is what I was able to get working, 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 are getting an email bounce issue, it is likely due to not setting the ReplyToList field. See: GMail API Emails Bouncing

    0 讨论(0)
提交回复
热议问题