Google 电子邮件 API 引发 400 错误。需要收件人地址 (c#)

Posted

技术标签:

【中文标题】Google 电子邮件 API 引发 400 错误。需要收件人地址 (c#)【英文标题】:Google Email API is raising 400 error. Recipient address required (c#) 【发布时间】:2021-10-23 02:50:31 【问题描述】:

我见过类似的question,但我仍然不确定如何继续。

最近我升级了我的 Gmail API 库,所以我不知道它是否相关。

我遇到了类似的错误:

<LogEntry Date="2021-08-22 12:35:10" Severity="Exception" Source="MSAToolsGMailLibrary.MSAToolsGMailLibraryClass.SendEmail" ThreadId="1">
<Exception Type="Google.GoogleApiException" Source="Google.Apis.Requests.ClientServiceRequest`1+&lt;ParseResponse&gt;d__35.MoveNext">
<Message>Google.Apis.Requests.RequestError
Recipient address required [400]
Errors [
Message[Recipient address required] Location[ - ] Reason[invalidArgument] Domain[global]
]
</Message>
<StackTrace>   at Google.Apis.Requests.ClientServiceRequest`1.&lt;ParseResponse&gt;d__35.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at Google.Apis.Requests.ClientServiceRequest`1.Execute()
at MSAToolsGMailLibrary.MSAToolsGMailLibraryClass.SendEmail(String From, String Subject, String Attachment)</StackTrace>
</Exception>
</LogEntry>

即使我尝试我的测试代码也会发生这种情况:

    using Message = Google.Apis.Gmail.v1.Data.Message

    public bool SendTestEmail(string From, string Subject, string Body)
    
        try
        
            MailMessage mail = new MailMessage();
            mail.Subject = Subject;
            mail.Body = Body;
            mail.From = new MailAddress(From);
            mail.IsBodyhtml = false;
            mail.To.Add(new MailAddress(From));
            MimeKit.MimeMessage mimeMessage = MimeKit.MimeMessage.CreateFromMailMessage(mail);

            Message message = new Message();
            message.Raw = Base64UrlEncode(mimeMessage.ToString());

            var result = m_Service.Users.Messages.Send(message, "me").Execute();
        
        catch (Exception ex)
        
            SimpleLog.Log(ex);
            return false;
        

        return true;
    

    private string Base64UrlEncode(string input)
    
        var inputBytes = System.Text.Encoding.UTF8.GetBytes(input);
        return Convert.ToBase64String(inputBytes)
          .Replace('+', '-')
          .Replace('/', '_')
          .Replace("=", "");
    

我确认我已使用正确的凭据连接到我的帐户。以前从来没有遇到过这个问题。

【问题讨论】:

【参考方案1】:

这是发送电子邮件的正确方法:

public bool SendTestEmail(string From, string Subject, string Body)

    try
    
        var mimeMessage = new MimeMessage();
        mimeMessage.From.Add(MailboxAddress.Parse(From));
        mimeMessage.ReplyTo.Add(MailboxAddress.Parse(From));
        mimeMessage.To.Add(MailboxAddress.Parse(From));
        mimeMessage.Subject = Subject;
        mimeMessage.Body = new TextPart("plain")
        
            Text = Body
        ;

        Message message = new Message();

        using (var memory = new MemoryStream())
        
            mimeMessage.WriteTo(memory);

            var buffer = memory.GetBuffer();
            int length = (int)memory.Length;

            message.Raw = Convert.ToBase64String(buffer, 0, length);
        

        var result = m_Service.Users.Messages.Send(message, "me").Execute();
    
    catch (Exception ex)
    
        SimpleLog.Log(ex);
        return false;
    

    return true;

MimeKit作者在他们的 GitHub 网站上向我提出了代码,他们提供了解释:

MimeMessage.ToString() 的问题在于它通常是不可能的 以 1 文本编码完全表示 MIME 消息,因此 MimeKit 为了保持一致,别无选择,只能使用 ISO-8859-1。

在内部,ToString() 所做的是 message.WriteTo (memoryStream) 和 然后使用 ISO-8859-1 文本编码。

如果您的文件中有任何非 ASCII(和非 ISO-8859-1)字符 消息,它可能会破坏事情。

MimeKit,一直到2.14左右,用于添加警告头 “X-MimeKit-警告:不要使用ToString()!改用WriteTo()!” 如果您使用了ToString(),则位于每条消息的顶部。

【讨论】:

以上是关于Google 电子邮件 API 引发 400 错误。需要收件人地址 (c#)的主要内容,如果未能解决你的问题,请参考以下文章

收件人地址需要代码”:400 在 Laravel PHP 中使用 Gmail API 发送电子邮件

错误 400:使用 gmail api (.net) 时的 redirect_uri_mismatch

Google API (Gmail) 因失败的前提条件 400 而失败

Gmail REST API:400错误请求+失败的前提条件

Google Drive API 推送通知订阅 400“解析错误”

Google API 错误 400:“找不到客户端项目”