在业务开发中,自动发送通知邮件、验证码邮件是常见需求,Python调用邮件API接口实现邮件发送,比直接配置SMTP服务器更稳定高效,适配各类业务场景。目前主流的邮件服务提供商都开放了对应的API接口,开发者只需要按照接口规范传入参数即可完成发送。

前期准备工作
在编写代码前,需要先完成以下准备步骤:
- 注册对应邮件服务商的账号,申请API调用权限,获取专属的API密钥或者访问令牌
- 确认邮件API的接口地址、请求方式、必填参数格式,不同服务商的接口规范略有差异
- 安装Python的HTTP请求库,常用的有requests库,可通过pip命令安装
核心实现步骤
1. 安装依赖库
如果本地没有安装requests库,先执行以下命令安装:
pip install requests
2. 编写邮件发送函数
以下以调用通用邮件API接口为例,实现邮件发送功能,代码中已添加详细注释:
import requests
import json
def send_email_by_api(api_url, api_key, sender, receiver, subject, content):
<!-- 构造请求头,通常API密钥放在Authorization头中 -->
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {api_key}"
}
<!-- 构造请求体,包含邮件的核心参数 -->
payload = {
"from": sender,
"to": [receiver],
"subject": subject,
"html": content
}
try:
<!-- 发送POST请求调用邮件API -->
response = requests.post(api_url, headers=headers, data=json.dumps(payload))
<!-- 判断请求是否成功 -->
if response.status_code == 200:
result = response.json()
if result.get("code") == 0:
print("邮件发送成功")
return True
else:
print(f"邮件发送失败,错误信息:{result.get('message')}")
return False
else:
print(f"请求接口失败,状态码:{response.status_code}")
return False
except Exception as e:
print(f"调用接口出现异常:{str(e)}")
return False
<!-- 测试调用示例 -->
if __name__ == "__main__":
<!-- 替换为实际的API地址、API密钥、发件人、收件人信息 -->
test_api_url = "https://api.ipipp.com/v1/mail/send"
test_api_key = "your_api_key_here"
test_sender = "service@ipipp.com"
test_receiver = "user@ipipp.com"
test_subject = "Python调用邮件API测试"
test_content = "<h1>这是一封测试邮件</h1><p>通过Python调用邮件API接口发送成功</p>"
send_email_by_api(test_api_url, test_api_key, test_sender, test_receiver, test_subject, test_content)
3. 参数说明
上述代码中的核心参数含义如下:
| 参数名 | 含义 | 注意事项 |
|---|---|---|
| api_url | 邮件API的接口地址 | 需替换为服务商提供的实际地址 |
| api_key | 接口调用密钥 | 不要硬编码在代码中,建议放在环境变量中 |
| sender | 发件人邮箱地址 | 需要是服务商已验证的邮箱 |
| receiver | 收件人邮箱地址 | 支持传入多个地址,格式为数组 |
| subject | 邮件主题 | 避免包含敏感词汇,防止被判定为垃圾邮件 |
| content | 邮件内容 | 支持HTML格式,可实现富文本效果 |
常见问题排查
- 如果返回401错误,通常是API密钥无效或者过期,需要重新生成密钥
- 如果邮件被收件方判定为垃圾邮件,可检查发件人是否完成域名验证,邮件内容是否包含过多营销类词汇
- 如果出现超时错误,可检查网络连通性,或者适当增加请求的超时时间
注意:实际调用时需要根据对应邮件服务商的接口文档调整请求头和请求体的格式,不同服务商的参数命名可能存在差异。