【发布时间】:2019-07-30 00:26:39
【问题描述】:
我正在尝试从 C# .NET MVC 应用程序调用 GmailService 上的发送。当我调用发送时,我不断收到 403 错误。
我检查了我的范围,Gmail 设置肯定启用了 Gmail API,而且我的 ClientID 和 ClientSecret 是新的。
var httpClient = new HttpClient{
BaseAddress = new Uri("https://www.googleapis.com")
};
var requestUrl = $"oauth2/v4/token?code={code}&client_id={ClientId}&client_secret={SecretKey}&redirect_uri={RedirectUrl}&grant_type=authorization_code";
var dict = new Dictionary<string, string>{
{ "Content-Type", "application/x-www-form-urlencoded" }
};
var req = new HttpRequestMessage(HttpMethod.Post, requestUrl){Content = new FormUrlEncodedContent(dict)};
var response = await httpClient.SendAsync(req);
var token = JsonConvert.DeserializeObject<GmailToken>(await response.Content.ReadAsStringAsync());
Session["user"] = token.AccessToken;
//var obj = await GetuserProfile(token.AccessToken);
var obj = await DoSendEmail(token);
public void DoSendEmail(GmailToken inToken) {
const string fromAcct = "XXXXXXXX@gmail.com";
TokenResponse token = new TokenResponse();
token.AccessToken = inToken.AccessToken;
token.ExpiresInSeconds = inToken.ExpiresIn;
token.IdToken = inToken.IdToken;
token.TokenType = inToken.TokenType;
token.IssuedUtc = DateTime.UtcNow;
IAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer {
ClientSecrets = secrets,
Scopes = SCOPES,
ProjectId = "Xcent CP"
});
UserCredential credential = new UserCredential(flow, fromAcct, token);
if (credential.Token.IsExpired(credential.Flow.Clock)) {
bool success = credential.RefreshTokenAsync(CancellationToken.None).Result;
if (!success) {
throw new Exception("Could not refresh token");
}
}
GmailService gs = null;
try {
gs = new GmailService(new Google.Apis.Services.BaseClientService.Initializer() {
ApplicationName = APP_NAME,
HttpClientInitializer = credential
});
var mailMessage = new System.Net.Mail.MailMessage();
mailMessage.From = new System.Net.Mail.MailAddress(fromAcct);
mailMessage.To.Add("XXXXXXXX@comcast.net");
mailMessage.ReplyToList.Add(fromAcct);
mailMessage.Subject = "Test email";
mailMessage.Body = "<html><body>Hi <b>Lee</b>, this is <b>yet another</b> test message.</body></html>";
mailMessage.IsBodyHtml = true;
var mimeMessage = MimeKit.MimeMessage.CreateFromMailMessage(mailMessage);
var gmailMessage = new Google.Apis.Gmail.v1.Data.Message {
Raw = Encode(mimeMessage.ToString())
};
gs.Users.Messages.Send(gmailMessage, fromAcct).Execute();
}
catch (Exception ex) {
throw ex;
}
finally {
if (gs != null) {
gs.Dispose();
}
gs = null;
}
}
我不知道该去哪里看...我浏览了很多很多在线文章和教程,似乎尝试了所有方法,但我仍然遇到 403 错误。救命!
谢谢, 李
【问题讨论】:
-
这是你的全部代码吗?您在哪里使用 Google 的服务器进行身份验证?如果您查看developer's API reference for C#,这里有关于如何设置 Google 身份验证的指南。哪一行代码返回 403 错误?
-
嗨 Rafa,失败的行是“gs.Users.Messages.Send(gmailMessage, fromAcct).Execute();”。不确定您所说的身份验证是什么意思...我有以下代码: Response.Redirect($"accounts.google.com/o/oauth2/v2/auth?client_id={ClientId}&response_type=code&scope=openid%20email%20profile&redirect_uri={RedirectUrl}&state=abcdef");
-
您需要进行身份验证,以便向 Google 证明实际上是您授权这些操作,而不是其他人。您是否要访问您在 Response.Redirect 中获得的链接?您需要访问该 URL 并确认您愿意让程序以您的名义运行。
-
以“var httpClient”(上面的第一个块)开头的代码是我处理重定向的地方。我收到了一个令牌,但该令牌似乎没有 mail.google.com 范围。
-
代码中的一行是
Scopes = SCOPES。SCOPES来自哪里?您需要定义范围,例如:static string[] SCOPES = { GmailService.Scope.Gmail};我建议您将代码基于 .NET 快速入门模板 developers.google.com/gmail/api/quickstart/dotnet 并通过您的请求替换请求UsersResource.LabelsResource.ListRequest request = service.Users.Labels.List("me");...:Users.Messages.Send(...
标签: c# google-api gmail-api