- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
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()
当然,我会打开“访问安全性较低的应用程序”,但如果有人想出用什么替换此代码,我将不胜感激。
最佳答案
这很痛苦,但我现在似乎有什么事情发生了......
我认为这不会太难实现,因为我在转换包时磕磕绊绊而没有遇到任何大问题:只是通常的 2to3 东西。然而,几个小时后,我厌倦了逆流而上。在撰写本文时,我找不到公开的 Python 3 软件包。python 2 的体验是直截了当的(相比之下)。
毫无疑问,随着时间的推移,这种情况会发生变化。最终你需要下载一个 client_secret.json
文件。您只能(可能)通过网络浏览器进行此设置:
API 和 Auth
-> Credentials
OAuth
下选择 Create New Client ID
Installed Application
作为应用程序类型和Other下载 JSON
。去做。这是你的 client_secret.json
——可以说是密码但等等,这还不是全部!
您必须为您的应用程序提供一个“产品名称”以避免出现一些奇怪的错误。 (看看我受了多少苦才给你这个 ;-)
API's & auth
-> 同意屏幕
快讯!哇。现在还有更多!
是的。现在我们可以更新电子邮件脚本了。
您需要第一次以交互方式运行脚本。它将在您的机器上打开一个网络浏览器,您将授予权限(点击一个按钮)。此练习会将包含可重复使用 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/
我是一名优秀的程序员,十分优秀!