将“gmail.send”范围与 SMTP MSA 结合使用

Using `gmail.send` scope with SMTP MSA

范围 https://www.googleapis.com/auth/gmail.send 不允许我使用带有此日志的 GMail SMTP 发送电子邮件(我使用 PHPMail 发送邮件):

Connection: opening to smtp.gmail.com:587, timeout=300, options=array ()
Connection: opened
SERVER -> CLIENT: 220 smtp.gmail.com ESMTP za2sm18821308wjb.34 - gsmtp
CLIENT -> SERVER: EHLO example.com
SERVER -> CLIENT: 250-smtp.gmail.com at your service, [94.115.154.79]250-SIZE 35882577250-8BITMIME250-STARTTLS250-ENHANCEDSTATUSCODES250-PIPELINING250-CHUNKING250 SMTPUTF8
CLIENT -> SERVER: STARTTLS
SERVER -> CLIENT: 220 2.0.0 Ready to start TLS
CLIENT -> SERVER: EHLO example.com
SERVER -> CLIENT: 250-smtp.gmail.com at your service, [94.115.154.79]250-SIZE 35882577250-8BITMIME250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH250-ENHANCEDSTATUSCODES250-PIPELINING250-CHUNKING250 SMTPUTF8
CLIENT -> SERVER: AUTH XOAUTH2 dXNlcj1tYXJ0aW5AZHp1YmFrLnNrAWF1dGg9QmVhcmVyIHlhMjkuQ2k5TEE0REJCMDdxOGVBVkpGT3FQRGlyQVRhTlBJcWVPb3d5RjdmekY2QTZqcG9Za3hxQjZLZFVzSkVISTdXWjlnAQE=
SERVER -> CLIENT: 334 eyJzdGF0dXMiOiI0MDAiLCJzY2hlbWVzIjoiQmVhcmVyIiwic2NvcGUiOiJodHRwczovL21haWwuZ29vZ2xlLmNvbS8ifQ==
SMTP ERROR: AUTH command failed: 334 eyJzdGF0dXMiOiI0MDAiLCJzY2hlbWVzIjoiQmVhcmVyIiwic2NvcGUiOiJodHRwczovL21haWwuZ29vZ2xlLmNvbS8ifQ==
SMTP Error: Could not authenticate.
CLIENT -> SERVER: QUIT
SERVER -> CLIENT: 535-5.7.8 Username and Password not accepted. Learn more at535 5.7.8 https://support.google.com/mail/answer/14257 za2sm18821308wjb.34 - gsmtp
SMTP ERROR: QUIT command failed: 535-5.7.8 Username and Password not accepted. Learn more at535 5.7.8 https://support.google.com/mail/answer/14257 za2sm18821308wjb.34 - gsmtp
Connection: closed
SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

我尝试添加除完全访问范围之外的所有其他 gmail 范围,但仍然无效。但是,当我添加完全访问范围 https://mail.google.com/ 时,它将起作用。知道为什么吗?我不想让我的脚本完全访问 GMail...

发送范围仅记录在 Gmail API(HTTP REST 接口)上。如果你想使用 SMTP yes,它只接受完整的邮件范围。

有一个 Google API php 客户端库可以用来处理很多这样的逻辑。要在不使用客户端库的情况下执行此操作,请参阅this doc,如果您还没有看到它。

如果发送 < 5MB 可以发送到 POST https://www.googleapis.com/gmail/v1/users/userId/messages/send

您需要在您的请求中设置以下两个HTTP headers:

  • Authenication(oauth2 令牌)
  • Content-Type: "application/json"

你应该 POST 是一个 "message" 具有 base64url 编码的原始字段,类似于(请原谅 python pseudo-code):

message = {}
message['raw'] = base64.url_encode("To: you\r\nFrom: me\r\nSubject: test\r\n\r\nbody goes here")
httplib.POST(url, json.dumps(message), required_headers)`