我正在研究在我正在开发的应用程序中使用Gmail API。然而,我不确定如何将它们的Java或Python示例更改为C#。现有的样例具体如何更改?
这是我使用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 Emails Bouncing
mimeMessage.ToString()
。根据 namespace MimeKit
中的备注:一般来说,不应该使用此方法返回的字符串将消息序列化到磁盘上。建议您改用 MimeKit.MimeMessage.WriteTo(System.IO.Stream,System.Threading.CancellationToken)
。 - Doan Van ThangmimeMessage.ToString()
方法根本行不通(API返回“需要收件人地址”错误)。由@ChrCury78发布的链接(https://stackoverflow.com/questions/55402719/sending-email-with-gmail-api-encoding-greek-characters-in-body)提供了可行的解决方案(将`MimeMessage`写入流而不是使用`ToString()`)。应该使用提供的代码更新此答案。我花了几个小时才弄清楚。 - thankyoussd这是一个棘手的问题,但我最终解决了它。我使用了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/
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看起来这并不是Gmail API的问题。你应该寻找的是"c#创建电子邮件"(可能需要添加"RFC 2822",因为这是定义这些电子邮件格式的RFC)。一旦你拥有了这样一个有效的"电子邮件消息"(真正的、完整的电子邮件内容,可以与SMTP或IMAP等一起使用),那么将其与Gmail API一起使用就应该非常简单。
MimeMessage
、Properties
等的相应对象,但快速搜索并没有帮助到我。 - muttley91