gpt4 book ai didi

python - 如何在不启用 'insecure access' 的情况下通过 gmail 发送电子邮件?

转载 作者:IT老高 更新时间:2023-10-28 22:24:43 26 4
gpt4 key购买 nike

Google 正在插入我们提高脚本访问其 gmail smtp 服务器的安全性。对于那件事我没有任何疑问。事实上,我很乐意提供帮助。

但他们并没有让事情变得容易。建议我们升级到使用最新安全措施的更安全的应用程序很好,但这并不能帮助我弄清楚如何升级看起来像这样的代码:

server = smtplib.SMTP("smtp.gmail.com", 587)
server.ehlo()
server.starttls()
server.login(GMAIL_USER, GMAIL_PASSWORD)
server.sendmail(FROM, TO, MESSAGE)
server.close()

当然,我会打开“访问安全性较低的应用程序”,但如果有人想出用什么替换此代码,我将不胜感激。

最佳答案

这很痛苦,但我现在似乎有什么事情发生了......

不支持 Python3(目前)

我认为这不会太难实现,因为我在转换包时磕磕绊绊而没有遇到任何大问题:只是通常的 2to3 东西。然而,几个小时后,我厌倦了逆流而上。在撰写本文时,我找不到公开的 Python 3 软件包。python 2 的体验是直截了当的(相比之下)。

浏览 Google 网站是成功的一半

毫无疑问,随着时间的推移,这种情况会发生变化。最终你需要下载一个 client_secret.json 文件。您只能(可能)通过网络浏览器进行此设置:

  1. 您需要一个 google 帐户 - google 应用程序或 gmail。所以,如果你还没有,那就去买一个吧。
  2. 访问 developers console
  3. 创建一个新项目,然后等待 4 或 400 秒以完成。
  4. 导航到 API 和 Auth -> Credentials
  5. OAuth 下选择 Create New Client ID
  6. 选择Installed Application作为应用程序类型和Other
  7. 您现在应该有一个按钮下载 JSON。去做。这是你的 client_secret.json——可以说是密码

但等等,这还不是全部!

您必须为您的应用程序提供一个“产品名称”以避免出现一些奇怪的错误。 (看看我受了多少苦才给你这个 ;-)

  1. 导航到 API's & auth -> 同意屏幕
  2. 选择您的电子邮件
  3. 输入产品名称。它是什么并不重要。 “Foobar”会很好。
  4. 保存

快讯!哇。现在还有更多!

  1. 导航到 API 和身份验证 -> API -> Gmail API
  2. 点击按钮启用 API

是的。现在我们可以更新电子邮件脚本了。

Python 2

您需要第一次以交互方式运行脚本。它将在您的机器上打开一个网络浏览器,您将授予权限(点击一个按钮)。此练习会将包含可重复使用 token 的文件保存到您的计算机 gmail.storage

[我没有运气将 token 转移到没有图形浏览器功能的机器上——返回一个 HTTPError。我试图通过 lynx 图形浏览器来解决它。那也失败了,因为谷歌已将最终的“接受”按钮设置为“禁用”!?我会提出另一个问题来跳过这个障碍(更多提示)]

首先你需要一些库:

pip install --upgrade google-api-python-client
pip install --upgrade python-gflags
  • 您需要更改收件地址和发件人地址
  • 确保您在 Storage 指令期望的任何地方都有 client_token.json 文件
  • 目录需要是可写的,这样才能保存 gmail.storage 文件

最后是一些代码:

import base64
import httplib2

from email.mime.text import MIMEText

from apiclient.discovery import build
from oauth2client.client import flow_from_clientsecrets
from oauth2client.file import Storage
from oauth2client.tools import run


# Path to the client_secret.json file downloaded from the Developer Console
CLIENT_SECRET_FILE = 'client_secret.json'

# Check https://developers.google.com/gmail/api/auth/scopes for all available scopes
OAUTH_SCOPE = 'https://www.googleapis.com/auth/gmail.compose'

# Location of the credentials storage file
STORAGE = Storage('gmail.storage')

# Start the OAuth flow to retrieve credentials
flow = flow_from_clientsecrets(CLIENT_SECRET_FILE, scope=OAUTH_SCOPE)
http = httplib2.Http()

# Try to retrieve credentials from storage or run the flow to generate them
credentials = STORAGE.get()
if credentials is None or credentials.invalid:
credentials = run(flow, STORAGE, http=http)

# Authorize the httplib2.Http object with our credentials
http = credentials.authorize(http)

# Build the Gmail service from discovery
gmail_service = build('gmail', 'v1', http=http)

# create a message to send
message = MIMEText("Message goes here.")
message['to'] = "yourvictim@goes.here"
message['from'] = "you@go.here"
message['subject'] = "your subject goes here"
body = {'raw': base64.b64encode(message.as_string())}

# send it
try:
message = (gmail_service.users().messages().send(userId="me", body=body).execute())
print('Message Id: %s' % message['id'])
print(message)
except Exception as error:
print('An error occurred: %s' % error)

希望这能让我们都开始。不像旧方法那么简单,但现在我可以亲眼看到它确实看起来不那么复杂。

关于python - 如何在不启用 'insecure access' 的情况下通过 gmail 发送电子邮件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25944883/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com