背景
gmail将全面禁用账号、密码登陆方式,官方相关文档,对于需要调用gmail相关的服务需要做出相应的调整。这里使用Google Cloud应用的形式来接入Gmail,类似的,也可以通过该方式来调用其他的Google Cloud服务。
创建项目及应用
创建项目
使用链接登陆到Google控制台,通过如下操作创建一个项目
填入项目名称,并创建项目
项目创建完成会有相应的通知(贴心)
切换到刚创建的项目下,开始创建应用
配置项目应用
点击【API和服务】
通过如下操作添加gmail
应用启用后,添加凭据,如下图所示
这里根据自己的应用选择
填入应用信息,这里如果有图标也需要填入,测试时可不使用
添加应用需要权限,这里如果你只需要发送邮件,则选择如下权限即可
类似的方式搜索添加如下权限(这里根据需要添加),这些权限在用户授权的时候会展示在用户界面
"https://www.googleapis.com/auth/userinfo.profile",
"https://www.googleapis.com/auth/userinfo.email",
"https://www.googleapis.com/auth/gmail.readonly",
"https://www.googleapis.com/auth/gmail.send",
添加后的结果如下
选择自己的应用类型,这里为Web应用,选择如下,然后填入【已获授权的重定向 URI】,该地址是用户授权后,google会调用的地址,
添加OAuth凭据
应用启用后,添加凭据,如下图所示
选择应用类型
完成OAuth客户端创建
创建完成后,会得到如下内容,该内容会用于运维/开发。
应用调试
安装依赖
pip install oauth2client
pip install google-auth
获取授权链接
from oauth2client.client import OAuth2WebServerFlow
SCOPES = [
"https://www.googleapis.com/auth/userinfo.profile",
"https://www.googleapis.com/auth/userinfo.email",
"https://www.googleapis.com/auth/gmail.readonly",
"https://www.googleapis.com/auth/gmail.send",
"https://www.googleapis.com/auth/calendar",
]
CLIENT_ID = '***' # 应用的client_id
CLIENT_SECRET = '***' # 应用的secret
auth_uri = "https://accounts.google.com/o/oauth2/auth"
REDIRECT_URI = "***" # 与控制台的会调url一致
oauth2_flow = OAuth2WebServerFlow(
CLIENT_ID,
CLIENT_SECRET,
SCOPES,
auth_uri=auth_uri,
)
oauth2_flow.redirect_uri = REDIRECT_URI
# 获取授权连接
auth_url = oauth2_flow.step1_get_authorize_url()
授权链接产生后,需要由用户打开并授权
用户授权回调
回调参数格式
code=4/0AeaYSHAPuZsf6Csifvsssq5vCbvA96ghhhlplL8stG_W5yNr0vkQfRVHJA-YobSyg&scope=email%20profile%20https://www.googleapis.com/auth/gmail.readonly%20https://www.googleapis.com/auth/gmail.send%20https://www.googleapis.com/auth/calendar%20openid%20https://www.googleapis.com/auth/userinfo.profile%20https://www.googleapis.com/auth/userinfo.email&authuser=1&prompt=consent
凭据获取
使用上述参数中的code进行获取(每次授权只能被调用一次)
code = callback_params.get("code")
credentials = oauth2_flow.step2_exchange(code)
credentials.to_json() # 凭据内容
根据凭据获取用户信息
from googleapiclient.discovery import build
user_info = build(
serviceName='oauth2', version='v2', credentials=credentials
).userinfo().get().execute()
收取邮件
# 收取邮件
from googleapiclient.discovery import build
def list_messages(service, user_id, query=''):
"""List all messages of the user's mailbox matching the query."""
try:
response = service.users().messages().list(userId=user_id, q=query).execute()
messages = []
if 'messages' in response:
messages.extend(response['messages'])
while 'nextPageToken' in response:
page_token = response['nextPageToken']
response = service.users().messages().list(
userId=user_id, q=query, pageToken=page_token
).execute()
messages.extend(response['messages'])
return messages
except Exception as e:
print('An error occurred: %s' % e)
return None
def get_message(service, user_id, msg_id):
"""Get a specific message."""
try:
message = service.users().messages().get(userId=user_id, id=msg_id).execute()
return message
except Exception as e:
print('An error occurred: %s' % e)
return None
service = build('gmail', 'v1', credentials=credentials)
# 查询条件,参考:https://support.google.com/mail/answer/7190?hl=zh-Hans
messages = list_messages(service, 'me', query='is:unread')
if messages:
for message in messages:
msg_id = message['id']
msg = get_message(service, 'me', msg_id)
print(msg)
发送邮件
# 发送邮件
import base64
from email.mime.text import MIMEText
from googleapiclient.discovery import build
def create_message(sender, to, subject, message_text):
"""Create a message for an email."""
message = MIMEText(message_text)
message['to'] = to
message['from'] = sender
message['subject'] = subject
raw_message = base64.urlsafe_b64encode(message.as_bytes())
raw_message = raw_message.decode()
return {'raw': raw_message}
def send_message(service, user_id, message):
"""Send an email message."""
try:
message = service.users().messages().send(userId=user_id, body=message).execute()
print('Message Id: %s' % message['id'])
return message
except Exception as e:
print('An error occurred: %s' % e)
return None
service = build('gmail', 'v1', credentials=credentials)
# 创建邮件消息
sender = '' # 发件人
to = '' # 收件箱
subject = 'Test Email'
message_text = 'This is a test email sent from Gmail API.'
message = create_message(sender, to, subject, message_text)
# 发送邮件
send_message(service, 'me', message)