C# Gmail API中的Users.Messages.Send接收403错误

C# Gmail API中的Users.Messages.Send接收403错误,c#,google-api,gmail-api,C#,Google Api,Gmail Api,我正试图通过C#.NET MVC应用程序调用Gmail服务上的Send。当我呼叫send时,我一直收到403错误 我已经检查了我的范围,Gmail设置肯定启用了Gmail API,我的ClientID和ClientSecret都是新的 var-httpClient=新的httpClient{ BaseAddress=新Uri(“https://www.googleapis.com") }; var requestUrl=$“oauth2/v4/token?code={code}&client_i

我正试图通过C#.NET MVC应用程序调用Gmail服务上的Send。当我呼叫send时,我一直收到403错误

我已经检查了我的范围,Gmail设置肯定启用了Gmail API,我的ClientID和ClientSecret都是新的

var-httpClient=新的httpClient{
BaseAddress=新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=新字典{
{“内容类型”,“应用程序/x-www-form-urlencoded”}
};
var req=newhttprequestmessage(HttpMethod.Post,requestUrl){Content=newformurlencodedcontent(dict)};
var响应=等待httpClient.SendAsync(req);
var token=JsonConvert.DeserializeObject(wait response.Content.ReadAsStringAsync());
会话[“用户”]=token.AccessToken;
//var obj=await GetuserProfile(token.AccessToken);
var obj=等待DoSendEmail(令牌);
public void DoSendEmail(GmailToken inToken){
来自ACCT的常量字符串=”XXXXXXXX@gmail.com";
TokenResponse token=新的TokenResponse();
token.AccessToken=inToken.AccessToken;
token.ExpiresInSeconds=inToken.ExpiresIn;
token.IdToken=inToken.IdToken;
token.TokenType=inToken.TokenType;
token.IssuedUtc=DateTime.UtcNow;
IAAuthorizationCodeFlow=新的GoogleAuthorizationCodeFlow(新的GoogleAuthorizationCodeFlow.Initializer{
ClientSecrets=秘密,
范围=范围,
ProjectId=“Xcent CP”
});
UserCredential=新的UserCredential(流、fromAcct、令牌);
if(credential.Token.IsExpired(credential.Flow.Clock)){
bool success=credential.refreshtTokenAsync(CancellationToken.None).Result;
如果(!成功){
抛出新异常(“无法刷新令牌”);
}
}
Gmail服务=null;
试一试{
gs=新的Gmail服务(新的Google.api.Services.BaseClientService.Initializer(){
ApplicationName=应用程序名称,
HttpClientInitializer=凭证
});
var mailMessage=new System.Net.Mail.mailMessage();
mailMessage.From=新系统.Net.Mail.MailAddress(fromAcct);
mailMessage.To.Add(“XXXXXXXX@comcast.net");
mailMessage.ReplyToList.Add(fromact);
mailMessage.Subject=“测试电子邮件”;
mailMessage.Body=“嗨,李,这是另一条测试消息。”;
mailMessage.IsBodyHtml=true;
var mimeMessage=MimeKit.mimeMessage.CreateFromMailMessage(mailMessage);
var gmailMessage=new Google.api.Gmail.v1.Data.Message{
Raw=Encode(mimeMessage.ToString())
};
gs.Users.Messages.Send(gmailMessage,fromact.Execute();
}
捕获(例外情况除外){
掷骰子;
}
最后{
如果(gs!=null){
gs.Dispose();
}
gs=null;
}
}
我不知道该去哪里看……我已经阅读了很多在线文章和教程,尝试了所有的方法,但我仍然被403错误困扰着。救命啊

谢谢,

所以在花了很多时间研究这个问题后,我发现了问题所在。我的谷歌登录链接如下:

Response.Redirect($“{ClientId}&Response_type=code&scope=openid%20email%20profile&Redirect_uri={RedirectUrl}&state=abcdef”)

“openid%20email%20profile”是我为登录指定的唯一作用域,因此,关于我用于流变量的作用域的403错误


这是你所有的代码吗?你在哪里使用谷歌的服务器进行身份验证?如果您查看了,这里有一个关于如何使用Google设置身份验证的指南。哪一行代码返回403错误?嗨,Rafa,失败的那一行是“gs.Users.Messages.Send(gmailMessage,fromact.Execute();”。不确定您所说的身份验证是什么意思…我有以下代码:Response.Redirect($“{ClientId}&Response_type=code&scope=openid%20email%20profile&Redirect_uri={RedirectUrl}&state=abcdef”);您需要进行身份验证,以便向谷歌证明,授权这些行动的实际上是您,而不是其他人。您是否要转到响应中的链接。重定向?您需要遵循该URL并确认您很高兴该程序代表您运行。以“var httpClient”(上面的第一个块)开头的代码就是我处理重定向的地方。我正在取回一个令牌,但该令牌似乎没有mail.google.com的作用域。代码中的一行是
Scopes=Scopes
范围从哪里来?您需要定义作用域,类似于:
static string[]scopes={GmailService.Scope.Gmail}我建议您以.NET快速启动的模板为基础编写代码,并替换请求
UsersResource.labelsrource.ListRequest request=service.Users.Labels.List(“我”)通过您的请求:
用户。消息。发送(…