谷歌正在推动我们提高对他们的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和Gmail当前API的更新示例如下。
请注意,要获得下面的credentials.json
文件,您需要在选择相关的GCP项目之后在这里创建一个Oauth客户端ID凭据。一旦您创建了它,您就会看到客户端密钥和客户端机密。关闭该提示,然后单击帐户旁边的向下箭头。这是你需要的文件。
import base64
import logging
import mimetypes
import os
import os.path
import pickle
from email.mime.text import MIMEText
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from googleapiclient import errors
from googleapiclient.discovery import build
def get_service():
"""Gets an authorized Gmail API service instance.
Returns:
An authorized Gmail API service instance..
"""
# If modifying these scopes, delete the file token.pickle.
SCOPES = [
'https://www.googleapis.com/auth/gmail.readonly',
'https://www.googleapis.com/auth/gmail.send',
]
creds = None
# The file token.pickle stores the user's access and refresh tokens, and is
# created automatically when the authorization flow completes for the first
# time.
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
# If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json', SCOPES)
creds = flow.run_local_server(port=0)
# Save the credentials for the next run
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
service = build('gmail', 'v1', credentials=creds)
return service
def send_message(service, sender, message):
"""Send an email message.
Args:
service: Authorized Gmail API service instance.
user_id: User's email address. The special value "me"
can be used to indicate the authenticated user.
message: Message to be sent.
Returns:
Sent Message.
"""
try:
sent_message = (service.users().messages().send(userId=sender, body=message)
.execute())
logging.info('Message Id: %s', sent_message['id'])
return sent_message
except errors.HttpError as error:
logging.error('An HTTP error occurred: %s', error)
def create_message(sender, to, subject, message_text):
"""Create a message for an email.
Args:
sender: Email address of the sender.
to: Email address of the receiver.
subject: The subject of the email message.
message_text: The text of the email message.
Returns:
An object containing a base64url encoded email object.
"""
message = MIMEText(message_text)
message['to'] = to
message['from'] = sender
message['subject'] = subject
s = message.as_string()
b = base64.urlsafe_b64encode(s.encode('utf-8'))
return {'raw': b.decode('utf-8')}
if __name__ == '__main__':
logging.basicConfig(
format="[%(levelname)s] %(message)s",
level=logging.INFO
)
try:
service = get_service()
message = create_message("from@gmail.com", "to@gmail.com", "Test subject", "Test body")
send_message(service, "from@gmail.com", message)
except Exception as e:
logging.error(e)
raise
以下代码https://stackoverflow.com/a/3649148一直有效,直到最近谷歌改变了他们的安全政策,它才被打破。 我收到了来自谷歌的邮件 你好,xxx,有人刚刚试图登录你的Google帐户xxx@gmail.com来自不符合现代安全标准的应用程序。 我们强烈建议您使用Gmail等安全应用程序访问您的帐户。Google制作的所有应用程序都符合这些安全标准。另一方面,使用不太安全
问题内容: 我正在尝试使用 Go通过gmail API 发送电子邮件,但我发现文档存在缺陷/令人困惑。有一次我没有看到收据字段或电子邮件正文。 我不需要上传任何内容,因此我发现简单上传,分段上传,可恢复的上传方法完全没有用。是否有任何清晰的演示(带有所需的数据/参数,例如cURL有效负载)? 顺便提一句,我不确定是否我是唯一一个想到这一点的人,但是除非有可用的库,否则Google api似乎在可用
我有一个代码,就像半年前一样工作。它基本上发送电子邮件。 这是例外 (534, b'5.7.14 5.7.14 KL7\u 2qGSLW9IBjP8dKKgP67bEgyKNc5ls76dnVDZcUlVQjJUQb0JX9BIVi\u Agb84vKNOKB 5.7.14fshB0ngZ_Tn8ocDpDHKavRKXmluVjHo5YM7ADKENtWn4aVTxyvaBlbXRGpA1EBh
我在ASP. Net Core中工作,并尝试从gmail使用smtp客户端发送电子邮件。有以下代码,但不起作用也看过以下帖子,但不起作用http://dotnetthoughts.net/how-to-send-emails-from-aspnet-core/ 它会跟踪错误 系统NotSupportedException:SMTP服务器不支持身份验证
问题内容: 在我的中,我具有以下内容: 我的电子邮件代码: 当然,如果通过设置调试服务器,则可以在终端中看到该电子邮件。 但是,我实际上如何不将电子邮件发送到调试服务器,而是发送到user@gmail.com? 阅读你的答案后,让我弄明白一点: 你不能使用localhost(简单的ubuntu pc)发送电子邮件吗? 我认为在django 1.3中已经过时了,取而代之的是? 问题答案: 将电子邮件
我用竹子来让我的网站访问者填写并发送一份联系表。 我创建了一个服务帐户 我授予它全域权限 我添加了以下范围:https://www.googleapis.com/auth/gmail.addons.current.action.compose https://www.googleapis.com/auth/gmail.addons.current.message.metadatahttps://w