使用谷歌Gmail api for Gsuite

时间:2018-01-30 00:44:15

标签: c# google-api asp.net-core-mvc google-oauth gmail-api

我完全疯了,试图让这项工作成功。我需要使用gmail api从我们的域发送邮件。每次我得到这个结果:

Google.Apis.Requests.RequestError
Bad Request [400]
Errors [
    Message[Bad Request] Location[ - ] Reason[failedPrecondition] Domain[global]
]

我疯了!

我已经阅读了所有这些,但我仍然没有弄明白:

如何让它发挥作用?

这些是我所做的步骤:

  1. 在console.developers.google.com
  2. 中创建了一个新项目
  3. 启用了gmail api
  4. 创建了一个服务帐户
  5. 为服务帐户
  6. 创建了一个key.p12文件
  7. 配置域范围的权限
  8. 在admin.google.com
  9. 中启用了gmail api
  10. 在security-> advanced-> Api acces
  11. 中添加了api范围
  12. 添加并验证了我的域名
  13. 屏幕:

    enter image description here

    enter image description here

    enter image description here

    enter image description here

    enter image description here

    enter image description here

    这是我的代码:

    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套件(这是否会产生问题?)。

2 个答案:

答案 0 :(得分:1)

试图帮助@Yeronimo,我的回答(希望对你有所帮助):

设置

这是实施中最重要的部分。重要的是要了解G套件帐户和常规Google帐户之间存在巨大差异。您需要G套件的管理员帐户才能进行设置。

第1步

!重要!使用google套件的管理员帐户执行所有步骤!

转到google developers console并设置你的项目和api密钥,这是我多次没有成功的做法。但我做得对。这是你随处可见的。

  • 创建新项目
  • 创建Serviceaccount
  • 等。

第2步

转到google G suite admin页面并设置G套件的权利。

  • 转到Api-rights(我有一个荷兰语控制台 - &gt;所以我只是试着翻译)
  • 打开您要使用的API
  • 并信任内部应用

enter image description here

  • 然后进入高级设置(这是愚蠢的隐藏)
  • 在那里你可以进入一个名为的东西:维护api-client acces
  • 去那里
  • 使用您要使用的api端点添加serviceaccount客户端ID

您可以在此处找到客户端ID:console.developers.google.com - &gt;登录 - &gt;服务帐户 - &gt;维护服务帐户 - &gt;选项 - &gt;显示客户端ID。

我为您提供了截图,以便您可以找到它。我不能把控制台放在英语上。

enter image description here

enter image description here

enter image description here

然后复制该客户端ID并使用它。还可以找到您需要的端点here

enter image description 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部分。一旦添加,它就开始工作了。

请注意,电子邮件地址是您要访问的域用户的地址。所以不是您的服务帐户电子邮件。