Невозможно отправлять сообщения через SMTP mailkit и Gmail API с использованием служебной учетной записи - PullRequest
0 голосов
/ 02 февраля 2020

Я работал некоторое время, чтобы попытаться заставить эту систему работать с системой gmail api и служебной учетной записью (чтобы избежать создания пустой учетной записи пользователя), и я не уверен, в чем я ошибся .

        public static async Task<ServiceResponse> SendMail(ContactUsModel ContactInfo)
        {
            ServiceResponse response = new ServiceResponse();

            try
            {
                var certificate = new X509Certificate2(@"cert.p12", "notasecret", X509KeyStorageFlags.Exportable);
                var credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer("service account")
                {
                    // Note: other scopes can be found here: https://developers.google.com/gmail/api/auth/scopes
                    Scopes = new[] { "https://mail.google.com" },
                    User = "service account"
                }.FromCertificate(certificate));

                // Note: result will be true if the access token was received successfully
                bool result = await credential.RequestAccessTokenAsync(CancellationToken.None);

                // create an OAuth2 SASL context
                var oauth2 = new SaslMechanismOAuth2("service account", credential.Token.AccessToken);

                MimeMessage msg = new MimeMessage();
                msg.From.Add(new MailboxAddress(ContactInfo.Name, ContactInfo.EmailAddress));
                msg.To.Add(new MailboxAddress("Me", "business email account"));
                msg.Subject = ContactInfo.Subject;
                msg.Body = new TextPart("plain")
                {
                    Text = $"From: {ContactInfo.Name}\nEmail: {ContactInfo.EmailAddress}\nDate:{ContactInfo.AppointmentDate.ToString()}\nMessage: {ContactInfo.Message}"
                };

                using(SmtpClient client = new SmtpClient())
                {
                    client.ServerCertificateValidationCallback = (s, c, h, e) => true;
                    client.Connect("smtp.gmail.com", 587, SecureSocketOptions.StartTls);
                    client.Authenticate(oauth2);
                    client.Send(msg);
                    client.Disconnect(true);
                }

                response.Success = true;
                response.Message = "Message Sent";
            }
            catch (Exception e)
            {
                response.Success = false;
                response.Message = "An error occurred. Please call us.";
            }

            return response;
        }

Я включил API gmail и установил учетную запись службы для облачной функции invoker.

Это ошибка, которую я получаю в настоящее время, и я не знаю, почему.

{"status":"400","schemes":"Bearer","scope":"https://mail.google.com/"}

Редактировать: обновить код и сообщение об ошибке обновления.

1 Ответ

0 голосов
/ 02 февраля 2020

Вы используете не ту область. Область действия "https://www.googleapis.com/auth/gmail.send" предназначена для использования библиотеки протоколов на основе HTTP для отправки сообщений.

Вам необходима область действия "https://mail.google.com/" для Протоколы IMAP, POP3 и / или SMTP.

...