Получение токена доступа к Gmail и отправка электронной почты в среде без браузера - PullRequest
0 голосов
/ 04 июля 2019

Я хотел бы узнать, как отправлять электронные письма, используя Mailkit. Проблема в том, что теперь я использую двухфакторную аутентификацию в своей учетной записи gmail, поэтому я не могу использовать упрощенные параметры отправки почты. Согласно документации Mailkit - Клятва должна быть использована.

Итак, я зарегистрировал новое приложение в Google API и получил секретный ключ. Затем я пытаюсь аутентифицироваться так:

var secrets = new ClientSecrets
{
    ClientId = "xxxx",
    ClientSecret = "yyyy"
};

var scopes = new string[] { GmailService.Scope.MailGoogleCom };

var googleCredentials = await GoogleWebAuthorizationBroker.AuthorizeAsync(secrets, scopes, email, CancellationToken.None);
if (googleCredentials.Token.IsExpired(SystemClock.Default))
{
    await googleCredentials.RefreshTokenAsync(CancellationToken.None);
}

При достижении строки AuthorizeAsync - открывается новое окно браузера, в котором я должен ввести свои учетные данные ... Это не было бы проблемой, если бы я запустил это приложение в Windows ... НО, это огромный проблема.

Я создаю консольное ядро ​​dotnet, которое предназначено для работы в среде Linux в режиме CLI. Я не могу позволить себе вводить учетные данные каждый раз, когда токен истекает ... потому что вообще нет графического интерфейса ...

Можно ли заставить отправку электронной почты "просто" работать без дополнительных входов во внешние приложения?

Мне только что пришло в голову, что, возможно, будет проще зарегистрировать новую учетную запись электронной почты с упрощенной опцией входа в систему и использовать ее в моих приложениях вместо того, чтобы пытаться заставить работать текущую учетную запись Gmail. Итак, есть какие-нибудь идеи или предложения?

1 Ответ

1 голос
/ 05 июля 2019

Вы можете использовать служебную учетную запись [1] [2] с делегированием по всему домену [3], что предоставит вам доступ для олицетворения любой учетной записи Gmail из вашего домена.Вы можете создать учетную запись службы в Cloud Platform после выбора проекта.

После получения учетной записи службы можно создать файл p12, который можно использовать для получения токена, необходимого для отправки электронных писем в Mailkit.Вот код, описанный в документации Mailkit для реализации использования учетной записи службы [4]: ​​

var certificate = new X509Certificate2 (@"C:\path\to\certificate.p12", "password", X509KeyStorageFlags.Exportable);
var credential = new ServiceAccountCredential (new ServiceAccountCredential
    .Initializer ("your-developer-id@developer.gserviceaccount.com") {
    // Note: other scopes can be found here: https://developers.google.com/gmail/api/auth/scopes
    Scopes = new[] { "https://mail.google.com/" },
    User = "user@gmail.com"
}.FromCertificate (certificate));

bool result = await credential.RequestAccessTokenAsync (CancellationToken.None);

// Note: result will be true if the access token was received successfully

using (var client = new ImapClient ()) {
    client.Connect ("imap.gmail.com", 993, true);

    var oauth2 = new SaslMechanismOAuth2 ("user@gmail.com", credential.Token.AccessToken);
    client.Authenticate (oauth2);
}

Строка пути в первой функции кода - это путь к файлу p12 из вашей службы.учетная запись, которую вы можете загрузить с Cloud Platform.

Редактировать:

Обходной путь, если вы не являетесь администратором G Suite, будет реализовывать процесс авторизации, как вбыстрый запуск [5], он будет отображать экран согласия в браузере только при первом запуске, и он создаст токен, который можно использовать в последующих запусках кода, оставив файл токена внутри рабочегокаталог.Вам нужно будет проверить, как использовать службу gmail или объект учетных данных в библиотеке MailKit.

[1] https://cloud.google.com/iam/docs/service-accounts

[2] https://cloud.google.com/iam/docs/understanding-service-accounts

[3] https://developers.google.com/admin-sdk/directory/v1/guides/delegation

[4] https://github.com/jstedfast/MailKit/blob/master/FAQ.md#q-how-can-i-log-in-to-a-gmail-account-using-oauth-20

[5] https://developers.google.com/gmail/api/quickstart/dotnet

...