Пожалуйста, прости меня, если это новый ie вопрос. Приведенный ниже код работает в течение первого часа, затем срок действия токена доступа истекает, и он больше не работает. Я читал много мест, где токен доступа должен быть обновлен с помощью токена refre sh, но я нигде не вижу, как это сделать. Я использую сгенерированный токен доступа для отправки электронной почты. Спасибо за вашу помощь!
private void GetClientSecrets()
{
// I don't like requesting this much access but I can't get it to work with less access
string[] scopes = { "email", "profile", "https://mail.google.com/" };
UserCredential credential;
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
new ClientSecrets
{
ClientId = _clientID,
ClientSecret = _clientSecret
},
scopes,
"user",
CancellationToken.None,
new FileDataStore(_credentialPath, true)).Result;
var jwtPayload = GoogleJsonWebSignature.ValidateAsync(credential.Token.IdToken).Result;
_username = jwtPayload.Email;
_accessToken = credential.Token.AccessToken;
}
public void SendGmail(string toEmail, string subject, string body, string replyTo = "", string cc = "", string bcc = "")
{
// Gmail SMTP server address
SmtpServer oServer = new SmtpServer("smtp.gmail.com");
// enable SSL connection
oServer.ConnectType = SmtpConnectType.ConnectSSLAuto;
// Using 587 port, you can also use 465 port
oServer.Port = 587;
// use Gmail SMTP OAUTH 2.0 authentication
oServer.AuthType = SmtpAuthType.XOAUTH2;
// set user authentication
oServer.User = _username;
// use access token as password
oServer.Password = _accessToken;
oServer.MailFrom = _username;
SmtpMail oMail = new SmtpMail("TryIt");
oMail.From = _username;
oMail.To = toEmail;
if (!string.IsNullOrWhiteSpace(cc))
{
oMail.Cc = cc;
}
if (!string.IsNullOrWhiteSpace(replyTo))
{
oMail.ReplyTo = replyTo;
}
if (!string.IsNullOrWhiteSpace(bcc))
{
oMail.Bcc = bcc;
}
oMail.Subject = subject;
oMail.TextBody = body;
if (SystemConfig.DebugMode)
{
Logger.SimpleWriteToLog($"Sending email from {_username} (reply to: {replyTo}) to {toEmail} (CC: {cc}, BCC: {bcc}) using OAUTH 2.0{Environment.NewLine}{subject}{Environment.NewLine}{body}");
}
EASendMail.SmtpClient oSmtp = new EASendMail.SmtpClient();
oSmtp.SendMail(oServer, oMail);
}
}
ОБНОВЛЕНИЕ (2/12/2020)
Я не мог найти, как сделать это в API, но на этой странице показано, как это можно сделать с помощью POST.
Обновление токена доступа
https://developers.google.com/identity/protocols/OAuth2InstalledApp#offline