在c#中创建Gmail API的消息

本文关键字:API 消息 Gmail 创建 | 更新日期: 2023-09-27 18:12:57

我正在考虑在我正在开发的应用程序中使用Gmail API。然而,我不确定如何将他们的Java或Python示例更改为c#。现有的样本是如何变化的?

在c#中创建Gmail API的消息

这是我能够得到的工作,使用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)
    };
    Google.Apis.Gmail.v1.UsersResource.MessagesResource.SendRequest request = service.Users.Messages.Send(gmailMessage, ServiceEmail);
    request.Execute();
}
public static string Encode(MimeMessage mimeMessage)
{
    using (MemoryStream ms = new MemoryStream())
    {
        mimeMessage.WriteTo(ms);
        return Convert.ToBase64String(ms.GetBuffer())
            .TrimEnd('=')
            .Replace('+', '-')
            .Replace('/', '_');
    }
}

}

注意:如果您收到电子邮件反弹问题,很可能是由于没有设置ReplyToList字段。参见:GMail API电子邮件弹跳

这是一个棘手的问题,但我最终得到了它。我使用NuGet包AE.Net.Mail来获取RFC 2822位。

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

相同的代码,稍微进一步分析和原因张贴在这里:http://jason.pettys.name/2014/10/27/sending-email-with-the-gmail-api-in-net-c/

看起来这并不是Gmail API的问题。你应该寻找的是"c#创建电子邮件"(可能会添加"RFC 2822",因为这是定义这些电子邮件格式的RFC)。一旦你有了这样一个有效的"电子邮件消息"(真实的,完整的电子邮件内容,你可以使用SMTP或IMAP等),那么使用它与Gmail API应该是相当微不足道的。