背景
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 oauth2clientpip install google-auth
获取授权链接
from oauth2client.client import OAuth2WebServerFlowSCOPES = [ "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_idCLIENT_SECRET = '***' # 应用的secretauth_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 builduser_info = build( serviceName='oauth2', version='v2', credentials=credentials).userinfo().get().execute()
收取邮件
# 收取邮件from googleapiclient.discovery import builddef 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 Noneservice = build('gmail', 'v1', credentials=credentials)# 查询条件,参考:https://support.google.com/mail/answer/7190?hl=zh-Hansmessages = 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 base64from email.mime.text import MIMETextfrom googleapiclient.discovery import builddef 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)