我完全疯了,试图让这项工作成功。我需要使用gmail api从我们的域发送邮件。每次我得到这个结果:
Google.Apis.Requests.RequestError
Bad Request [400]
Errors [
Message[Bad Request] Location[ - ] Reason[failedPrecondition] Domain[global]
]
我疯了!
我已经阅读了所有这些,但我仍然没有弄明白:
如何让它发挥作用?
这些是我所做的步骤:
屏幕:
这是我的代码:
public class TestMailController : Controller
{
static string ApplicationName = "IdiciumGmail";
private static String serviceAccountEmail = "idiciumgmail@turing-thought-193608.iam.gserviceaccount.com";
public IActionResult Index()
{
string debugMessage = "";
var certificate = new X509Certificate2(@"key.p12", "notasecret", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable);
ServiceAccountCredential credential = new ServiceAccountCredential(
new ServiceAccountCredential.Initializer(serviceAccountEmail)
{
Scopes = new[] { GmailService.Scope.MailGoogleCom }
}.FromCertificate(certificate));
if (credential.RequestAccessTokenAsync(CancellationToken.None).Result)
{
// Create Gmail API service.
var service = new GmailService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = ApplicationName,
});
/*
var message = new MimeMessage();
message.From.Add(new MailboxAddress("Bestuur", "bestuur@indicium.hu"));
message.To.Add(new MailboxAddress("Tester", "william.wl@live.nl"));
message.Subject = "Is this working";
message.Body = new TextPart(TextFormat.Html)
{
Text = "Ja ja als je dit krijgt werkt het.... EINDELIJK. <br><br> <b>ook html werkt</b>"
};
*/
Message m = new Message();
m.Raw = "RnJvbTogQmVzdHV1ciA8YmVzdHV1ckBpbmRpY2l1bS5odT4gClRvOiBXaWxsaWFtIExvb3NtYW4g\nPHdpbGxpYW0ud2xAbGl2ZS5ubD4gClN1YmplY3Q6IERpdCBpcyBlZW4gdGVzdAoKVGhpcyBpcyBh\nIG1lc3NhZ2UganVzdCB0byBzYXkgaGVsbG8uIFNvLCAiSGVsbG8iLg==";
try
{
//var result = service.Users.Messages.Send(m, "bestuur@indicium.hu").Execute();
var result = service.Users.Messages.List("bestuur@indicium.hu").Execute();
debugMessage += "Send email: " + result;
}
catch (Exception e)
{
debugMessage += e.Message;
//throw;
}
debugMessage += "The END!";
}
return Content(debugMessage);
}
我在api explorer中测试了base 64原始字符串,并且在那里工作了!所以我猜这不是问题所在。有人可以帮我这个,我变得绝望。顺便说一下,我们为非营利组织使用免费版G套件(这是否会产生问题?)。
答案 0 :(得分:1)
试图帮助@Yeronimo,我的回答(希望对你有所帮助):
设置
这是实施中最重要的部分。重要的是要了解G套件帐户和常规Google帐户之间存在巨大差异。您需要G套件的管理员帐户才能进行设置。
第1步
!重要!使用google套件的管理员帐户执行所有步骤!
转到google developers console并设置你的项目和api密钥,这是我多次没有成功的做法。但我做得对。这是你随处可见的。
第2步
转到google G suite admin页面并设置G套件的权利。
您可以在此处找到客户端ID:console.developers.google.com - &gt;登录 - &gt;服务帐户 - &gt;维护服务帐户 - &gt;选项 - &gt;显示客户端ID。
我为您提供了截图,以便您可以找到它。我不能把控制台放在英语上。
然后复制该客户端ID并使用它。还可以找到您需要的端点here。
提示!查看更详细的步骤here
使用Google文档中的代码
使用json或证书文件进行授权。这取决于您使用的库。我使用lib进行c#所以我不得不使用证书文件。在为服务帐户创建凭据时,您可以选择。请注意,在使用serviceaccount之前可能需要一段时间。我认为它不起作用,而5分钟后突然发生了。这很烦人但是当它最终工作时它就像一个魅力。
如果您需要有关代码或其他方面的帮助,请问我。我试着尽快回答。我希望这会对你有所帮助。
答案 1 :(得分:0)
我遇到了同样的问题,但我的理由略有不同。您仍然需要按照@botenvouwer
列出的步骤进行操作我有这个代码,我从文档中获取,但是没有工作并提出上述错误:
credential = GoogleCredential.FromStream(stream).CreateScoped(scopes).CreateWithUser("user@yourdomain.com").UnderlyingCredential as ServiceAccountCredential;
我忘记的部分是指定何时创建要使用它的用户的服务。您无法在调用API时指定用户,但您必须在此处执行此操作:
type
Foo = object
# handler all integer types:
template myTypeMapping(T: typedesc[SomeInteger]): typedesc = string
# specific handling of the Foo type:
template myTypeMapping(T: typedesc[Foo]): typedesc = seq[string]
# all sequence types are not re-mapped:
template myTypeMapping(T: typedesc[seq]): typedesc = T
所以它在CreateWithUser部分。一旦添加,它就开始工作了。
请注意,电子邮件地址是您要访问的域用户的地址。所以不是您的服务帐户电子邮件。