如何在不开启2FA与低安全应用时用Python发送自定义域名Gmail
自定义域名Gmail账号发邮件的合规实现方案(无2FA/低安全应用)
最佳方案:Google Workspace服务账号+域范围委派
你的账号属于Google Workspace(自定义域名绑定的Gmail),官方唯一合规且满足你要求的方案是服务账号+域范围委派——无需开启2FA,也不用已被谷歌逐步停用的低安全应用选项。
获取credential.json的完整步骤
- 登录Google Cloud控制台,新建项目(若已有可用项目可跳过)。
- 在项目内搜索并启用Gmail API。
- 进入「IAM与管理」→「服务账号」,点击「创建服务账号」,完成名称填写后创建。
- 选中刚创建的服务账号,进入「密钥」标签页,点击「添加密钥」→「创建新密钥」,选择JSON格式,下载的文件即为
credential.json。 - 登录Google Workspace管理后台(admin.google.com),依次进入「安全性」→「API控制」→「域范围委派」,点击「添加新的客户端ID」,输入服务账号的
client_id(在credential.json中可找到),添加权限范围https://www.googleapis.com/auth/gmail.send后保存。
替代SMTP密码登录的代码示例
原代码使用的SMTP密码登录不符合要求,改用服务账号OAuth2认证后的代码如下:
先安装依赖包:
pip install google-auth google-auth-httplib2 google-api-python-client
完整代码:
import logging from google.oauth2 import service_account from googleapiclient.discovery import build from email.mime.text import MIMEText import base64 # 配置项 SENDER = 'person1@companyname.com' RECIPIENTS = ['person2@companyname.com', 'testemail@gmail.com'] SUBJECT = 'blablba' BODY_CONTENT = 'blabla' CREDS_FILE = './credential.json' # 替换为你的凭证文件路径 def send_gmail(): try: # 加载服务账号凭证,指定要模拟的发件人 creds = service_account.Credentials.from_service_account_file( CREDS_FILE, scopes=['https://www.googleapis.com/auth/gmail.send'], subject=SENDER ) # 构建Gmail API客户端 gmail_service = build('gmail', 'v1', credentials=creds) # 构造邮件 msg = MIMEText(BODY_CONTENT) msg['From'] = SENDER msg['To'] = ', '.join(RECIPIENTS) msg['Subject'] = SUBJECT # 编码为Gmail API要求的base64格式 raw_msg = base64.urlsafe_b64encode(msg.as_bytes()).decode() request_body = {'raw': raw_msg} # 发送邮件 gmail_service.users().messages().send(userId='me', body=request_body).execute() logging.info('邮件发送成功') except Exception as e: error_msg = f'邮件发送失败: {str(e)}' logging.warning(error_msg) if __name__ == '__main__': send_gmail()
重要提示
- 服务账号本身无邮箱权限,通过域范围委派才能模拟指定的自定义域名账号发件,完全符合安全要求。
- 权限仅需
gmail.send,遵循最小权限原则,避免过度授权。 credential.json包含敏感信息,需限制文件访问权限(如仅当前用户可读),切勿泄露。
内容的提问来源于stack exchange,提问作者doubting
相关产品推荐
相关产品推荐

