【问题标题】:googleapi: Error 400: Recipient address required, invalidArgumentgoogleapi:错误 400:需要收件人地址,invalidArgument
【发布时间】:2020-10-10 19:26:15
【问题描述】:

我正在运行以下脚本来发送电子邮件。 From 和 To 地址被发送者和接收者替换。

func SendMail() {

b, err := ioutil.ReadFile("credentials.json")
if err != nil {
    log.Fatalf("Unable to read client secret file: %v", err)
}

config, err := google.ConfigFromJSON(b, gmail.MailGoogleComScope)
if err != nil {
    log.Fatalf("Unable to parse client secret file to config: %v", 
err)
}
client := getClient(config)

srv, err := gmail.New(client)
if err != nil {
    log.Fatalf("Unable to retrieve Gmail client: %v", err)
}

user := "me"
mailtext := `From: sender@gmail.com
To: receiver@gmail.com
Subject: Saying Hello
Date: Thu, 8 Oct 2020 09:55:06 -0600
Message-ID: <1234@local.machine.example>

This is a message just to say hello.
So, "Hello".
`
raw := base64.URLEncoding.EncodeToString([]byte(mailtext))

var message gmail.Message
message.Id = "Msg 2"
message.LabelIds = []string{"SENT"}
message.Raw = raw

doFunc := srv.Users.Messages.Send(user, &message)
m, err := doFunc.Do()
if err != nil {
    println(err.Error())
    println("Message not sent")
} else {
    fmt.Printf("%+v", m)
}

脚本报如下错误:

googleapi: Error 400: Recipient address required, invalidArgument

环境:macOS Catalina 10.15.7 go1.15.2 darwin/amd64

谢谢你的帮助!!!

【问题讨论】:

  • 我必须为我糟糕的英语水平道歉。不幸的是,从您的脚本中,我无法理解您的目标。您想发送现有的草稿消息吗?或者您想通过更新草稿消息来发送现有草稿消息?或者您想创建一个草稿消息并发送它?或者您只想发送一封电子邮件?
  • 我只想撰写新邮件并发送。我修改了代码并删除了草稿消息,只是创建了一条消息并尝试发送它。现在我看到收件人地址需要错误。
  • 感谢您的回复。从您的回复和更新脚本中,我提出了一个修改后的脚本作为答案。你能确认一下吗?
  • 您是否尝试过使用 Gmail API 浏览器发送邮件?它应该显示相同的错误,也许更详细一点。
  • 我的系统上有 credentials.json 和 access.json。我可以在 go 中创建一个发布请求并使用您建议的 REST API,但我不知道如何使用 json 文件来保证安全

标签: go gmail-api


【解决方案1】:

我相信你的目标如下。

  • 您想使用 googleapis for golang 发送电子邮件。
  • 您已经能够使用 Gmail API 接收和发送电子邮件。

修改点:

  • 在你的脚本中,我认为mailtext是需要修改的。在这种情况下,换行符和空格很重要。
  • 虽然raw 已创建,但并未放入请求正文中。

当以上几点反映到你的脚本中时,它变成如下。

修改后的脚本:

从:
    mailtext := `
    From: sender@gmail.com
    To: receiver@gmail.com
    Subject: Saying Hello
    Date: Thu, 8 Oct 2020 09:55:06 -0600
    Message-ID: <1234@local.machine.example>

    This is a message just to say hello.
    So, "Hello".
    `
    raw :=  base64.URLEncoding.EncodeToString([]byte(mailtext))

     // create gmail.Message

     var message gmail.Message
     message.Id = "Msg 1"
     message.LabelIds = []string{"SENT"}
至:
    user := "me"
    // Modified
    mailtext := `From: sender@gmail.com
To: receiver@gmail.com
Subject: Saying Hello
Date: Thu, 8 Oct 2020 09:55:06 -0600
Message-ID: <1234@local.machine.example>

This is a message just to say hello.
So, "Hello".`
    raw := base64.URLEncoding.EncodeToString([]byte(mailtext))

    // create gmail.Message

    var message gmail.Message
    message.Id = "Msg 1"
    message.LabelIds = []string{"SENT"}
    message.Raw = raw  // Added
  • 我认为在这种情况下,Date: 和 Message-ID: 可能会被替换为新值。

  • 或者,请修改mailtext如下。

      mailtext := "From: sender@gmail.com\nTo: receiver@gmail.com\nSubject: Saying Hello\nDate: Thu, 8 Oct 2020 09:55:06 -0600\nMessage-ID: <1234@local.machine.example>\n\nThis is a message just to say hello.\nSo, \"Hello\"."
    

参考:

【讨论】:

  • 进行了代码中建议的更改。但我仍然收到同样的错误:googleapi: Error 400: Recipient address required, invalidArgument.
  • @Tusshu 感谢您的回复。我带来的不便表示歉意。为了正确理解你目前的情况,你能提供你的整个脚本吗?因为在我的环境中,我可以确认修改后的脚本有效。我为此道歉。你能提供你的整个剧本吗?
  • 我已经用我在我的机器上运行的脚本副本替换了上面的原始脚本。唯一的变化是发件人和收件人的电子邮件地址。感谢您的帮助!还将错误的标题替换为我收到的实际错误。
  • @Tusshu 感谢您添加更多信息。不幸的是,当我通过替换电子邮件地址测试您的脚本时,我可以确认没有发生错误并且可以发送电子邮件。所以我无法复制您的googleapi: Error 400: Recipient address required, invalidArgument 问题。我为此道歉。那么比如mailtext是mailtext := "From: sender@gmail.com\nTo: receiver@gmail.com\nSubject: Saying Hello\nDate: Thu, 8 Oct 2020 09:55:06 -0600\nMessage-ID: &lt;1234@local.machine.example&gt;\n\nThis is a message just to say hello.\nSo, \"Hello\".",你会得到什么结果?
  • 问题是我的代码中最后 4 行邮件文本的开头有制表符。在查看您建议的修改后的脚本时,我错过了这一点。
猜你喜欢
  • 2018-08-14
  • 1970-01-01
  • 2021-10-23
  • 2019-09-21
  • 2019-10-30
  • 2017-04-30
  • 2020-08-23
  • 2015-10-31
  • 2021-06-16
相关资源
最近更新 更多