如何创建Gmail API邮件消息

8

我想使用谷歌的Gmail API 发送一条消息。我已经成功验证,并正在尝试使用GmailService 来发送一条消息。

我想使用以下代码:

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 字段。是否有最简单的方法将完整的 MailMessage 转换为字符串,以便我可以将其设置为 PayloadRaw 属性的值?或者这根本不是我应该做的事情?

Message 类的文档

4个回答

7
我发现了一个解决方案。奇怪的是,.NET似乎不支持这个功能。不过有一个很好的NuGet包叫AE.Net.Mail,它可以将易于创建的邮件对象写入流中。 这是指引我找到解决方案的示例代码
由于网站似乎已经关闭,我将代码复制并粘贴在这里,而谷歌的缓存可能不会永久保存:
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("=", "");
  }
}

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

4

这里有一种使用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


2

C#代码用于Gmail API消息(发送电子邮件)

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

-1
这是对我有效的代码:
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接