我创建了一个WebAPI并将其发布到AWS Lambda。在此API中,我会自动通过GMail SMTP发送一些电子邮件。我的电子邮件代码如下:
var secrets = new ClientSecrets
{
ClientId = Environment.GetEnvironmentVariable("GMailClientId"),
ClientSecret = Environment.GetEnvironmentVariable("GMailClientSecret")
};
var googleCredentials = await GoogleWebAuthorizationBroker.AuthorizeAsync(secrets, new[] { GmailService.Scope.MailGoogleCom }, ((MailboxAddress)message.From.First()).Address, CancellationToken.None);
if (googleCredentials.Token.IsExpired(SystemClock.Default))
{
await googleCredentials.RefreshTokenAsync(CancellationToken.None);
}
using (var client = new SmtpClient())
{
client.Connect("smtp.gmail.com", 587, SecureSocketOptions.StartTls);
var oauth2 = new SaslMechanismOAuth2(googleCredentials.UserId, googleCredentials.Token.AccessToken);
client.Authenticate(oauth2);
await client.SendAsync(message);
client.Disconnect(true);
}
这在我的本地计算机上工作得很好,但是当尝试通过AWS Lambda运行它时,在调用GoogleWebAuthorizationBroker.AuthorizeAsync
时出现以下错误:
此平台不支持相对FileDataStore路径。
GoogleWebAuthorizationBroker
将AuthorizeAsync
定义为:
public static Task<UserCredential> AuthorizeAsync(ClientSecrets clientSecrets, IEnumerable<string> scopes, string user, CancellationToken taskCancellationToken, IDataStore dataStore = null, ICodeReceiver codeReceiver = null);
我没有为dataStore参数提供任何内容,因此默认情况下它使用的是FileDataStore
实现。
我猜Lambda不喜欢这样,因为它正在尝试访问文件系统。
任何人都曾经遇到过这个问题,如果是这样,您是否知道解决方案?我不确定IDataStore
的任何Google实现都可以使用吗?
https://developers.google.com/api-client-library/dotnet/reference/1.9.2/interfaceGoogle_1_1Apis_1_1Util_1_1Store_1_1IDataStore
编辑: 我想知道是否需要创建IDataStore的数据库实现吗?类似于:https://www.codeproject.com/Articles/1088092/ADO-NET-Implementation-of-Google-API-IDataStore。谷歌虽然没有提供这种实现似乎有点奇怪...