Google Colab中Gmail API授权失败及安全发邮件方法问询
问题解答
一、授权重定向到localhost失败的原因
- Colab是云端运行环境,代码默认指向的
localhost是Colab服务器的本地端口,但你在本地Opera浏览器访问的是自己电脑的localhost,两者不属于同一环境,浏览器无法连接到Colab服务器的本地端口,导致授权回调失败。 - 官方People API快速启动代码采用桌面应用OAuth2授权流程,该流程依赖本地端口接收授权回调,天生不适合Colab这类云端无图形界面的环境。
二、Colab中无需降低Gmail安全等级的发邮件方法
方法1:个人Gmail账号(开启2FA+App Password)
先给你的Google账号开启两步验证(2FA),然后生成一个专门用于发邮件的App Password(无需开启“不太安全的应用访问”),之后用SMTP协议发送:
import smtplib from email.mime.text import MIMEText # 配置信息 sender_email = "your-gmail-account@gmail.com" app_password = "your-generated-app-password" receiver_email = "recipient@example.com" subject = "测试邮件" body = "这是来自Colab的测试邮件内容" # 构建邮件 msg = MIMEText(body) msg['Subject'] = subject msg['From'] = sender_email msg['To'] = receiver_email # 发送邮件 with smtplib.SMTP_SSL('smtp.gmail.com', 465) as server: server.login(sender_email, app_password) server.send_message(msg)
方法2:Google服务账号(适合Workspace/企业账号)
在Google Cloud控制台创建服务账号,下载密钥文件,通过域范围授权让服务账号代表指定用户发送邮件,全程无需降低安全等级:
from google.oauth2 import service_account from googleapiclient.discovery import build from email.mime.text import MIMEText import base64 # 加载服务账号密钥 credentials = service_account.Credentials.from_service_account_file( 'service-account-key.json', scopes=['https://www.googleapis.com/auth/gmail.send'], subject='your-workspace-account@your-domain.com' # 要代表发送的用户账号 ) # 初始化Gmail服务 service = build('gmail', 'v1', credentials=credentials) # 构建邮件内容 msg = MIMEText("这是通过服务账号发送的测试邮件") msg['Subject'] = "服务账号邮件测试" msg['From'] = "your-workspace-account@your-domain.com" msg['To'] = "recipient@example.com" # 编码邮件为Gmail API要求的格式 raw_message = base64.urlsafe_b64encode(msg.as_bytes()).decode() # 发送邮件 service.users().messages().send(userId='me', body={'raw': raw_message}).execute()
方法3:第三方SMTP服务(无需依赖Gmail)
使用SendGrid、Mailgun等第三方邮件服务,通过API或SMTP接口发送,安全便捷:
以SendGrid为例,先注册账号获取API密钥,再执行以下代码:
!pip install sendgrid import sendgrid from sendgrid.helpers.mail import Mail, From, To, Subject, PlainTextContent # 初始化客户端 sg = sendgrid.SendGridAPIClient(api_key='your-sendgrid-api-key') # 构建邮件 mail = Mail( From("your-sender-email@example.com"), To("recipient@example.com"), Subject("第三方邮件服务测试"), PlainTextContent("这是来自SendGrid的测试邮件") ) # 发送邮件 response = sg.send(mail)
内容的提问来源于stack exchange,提问作者Igor Rocha Amorim
相关产品推荐
相关产品推荐

