如何仅在 ASP.NET 核心控制台应用程序中使用服务帐户详细信息发送电子邮件?

How to send email using service account details only in ASP.NET Core console application?

我有 Gmail API 服务帐户详细信息 = 客户端 ID 和服务帐户。我怎样才能在没有 OAuth 的情况下从一个 ID 向另一个 ID 发送电子邮件?

我只想使用服务帐户凭据授权此电子邮件发送过程。

是否有 nuget 包可以帮助满足此要求?

How can I just send an email from one id to other without OAuth?

我假设你的意思是如何在不弹出 Oauth2 同意屏幕的情况下发送电子邮件。

一旦您在 google 工作区帐户中正确配置了权限,使用服务帐户就可以做到这一点。您授权服务帐户代表您的域用户之一执行操作。这样,服务帐户就可以以该用户的身份发送电子邮件,而无需用户同意该访问,因为您已通过 google 工作区对其进行了预授权。

以下代码将向您展示如何授权您的应用程序使用服务帐户。

class Program
    {
        public static string Base64Encode(string plainText)
        {
            var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
            return System.Convert.ToBase64String(plainTextBytes);
        }

    public static void SendMail()
    {
        try
        {
            string ApplicationName = "Gmail API .NET Quickstart";
            const string serviceAccount = "xxxx@xxxx-api.iam.gserviceaccount.com";

            var certificate = new X509Certificate2(@"c:\XXXX.p12", "notasecret", X509KeyStorageFlags.Exportable);

            var gsuiteUser = "YourDomain@YourDomain.com";

            var serviceAccountCredentialInitializer = new ServiceAccountCredential.Initializer(serviceAccount)
            {
                User = gsuiteUser,
                Scopes = new[] { GmailService.Scope.GmailSend, GmailService.Scope.GmailLabels }

            }.FromCertificate(certificate);

            var credential = new ServiceAccountCredential(serviceAccountCredentialInitializer);
            if (!credential.RequestAccessTokenAsync(CancellationToken.None).Result)
                throw new InvalidOperationException("Access token failed.");

            var service = new GmailService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName = ApplicationName,
            });

            var mailMessage = new MailMessage();
            mailMessage.From = new MailAddress("se@Yourdomain.com");
            mailMessage.To.Add("ddddd@hotmail.com");
            mailMessage.ReplyToList.Add("se@Yourdomain.com");
            mailMessage.Subject = "test";
            mailMessage.Body = "<h1>sdf</h1>";
            mailMessage.IsBodyHtml = true;

            //foreach (System.Net.Mail.Attachment attachment in email.Attachments)
            //{
            //    mailMessage.Attachments.Add(attachment);
            //}

            var mimeMessage = MimeKit.MimeMessage.CreateFromMailMessage(mailMessage);

            var gmailMessage = new Message
            {
                Raw = Base64Encode(mimeMessage.ToString())
            };

            Message message1 = new Message();
            UsersResource.MessagesResource.SendRequest sendRequest = service.Users.Messages.Send(gmailMessage, "me");
            var s = sendRequest.Execute();


            Console.WriteLine("Message delivered!");
        }
        catch (Exception ep)
        {
            Console.WriteLine(ep.ToString());
        }
    }

诀窍是记住正确设置域范围的委派并决定服务帐户将模拟哪个用户并记住添加该电子邮件

没有 google 工作空间

如果您没有 google 工作区帐户,则无法使用服务帐户。您可能需要考虑改用 smtp 服务器。