从入门到精通:SendGrid Python API库全方位实战指南

从入门到精通:SendGrid Python API库全方位实战指南

【免费下载链接】sendgrid-python The Official Twilio SendGrid Python API Library 【免费下载链接】sendgrid-python 项目地址: https://gitcode.com/gh_mirrors/se/sendgrid-python

引言:告别邮件发送的痛点

你是否还在为Python项目中的邮件发送功能烦恼?手动配置SMTP服务器、处理复杂的邮件格式、确保送达率和跟踪统计,这些繁琐的工作消耗了大量开发时间。现在,有了Twilio SendGrid Python API库(以下简称SendGrid Python库),这一切都将变得简单高效。本文将带你全面掌握这个强大工具,从基础安装到高级功能,让你在30分钟内从零构建企业级邮件系统。

读完本文,你将能够:

  • 快速集成SendGrid到Python项目
  • 发送各种类型的邮件(文本、HTML、带附件、模板邮件等)
  • 实现邮件跟踪、统计分析和错误处理
  • 掌握批量发送和个性化邮件的技巧
  • 解决常见的邮件发送问题和优化性能

1. SendGrid Python库简介

SendGrid Python库是Twilio SendGrid官方提供的Python API客户端,它封装了SendGrid Web API v3的所有功能,提供了简洁易用的接口,帮助开发者轻松实现邮件发送功能。该库支持Python 2.7+版本,遵循MIT开源许可协议,目前在GitHub上拥有超过7000星标,是Python生态中最受欢迎的邮件发送库之一。

1.1 核心优势

SendGrid Python库相比传统的SMTP方式和其他邮件库,具有以下显著优势:

特性SendGrid Python库传统SMTP其他邮件库
易用性高(封装完整API)低(需手动配置)中(部分封装)
功能完整性完整支持Web API v3基础邮件发送有限功能
可靠性高(基于云服务)依赖自建服务器依赖第三方服务
扩展性强(支持批量、模板等高级功能)
统计分析内置详细统计有限或需额外集成
安全特性支持TLS、API密钥等基础TLS部分支持
维护更新官方维护,频繁更新依赖社区

1.2 应用场景

SendGrid Python库适用于各种邮件发送场景,包括但不限于:

  • transactional emails(交易邮件):如注册确认、密码重置、订单通知等
  • marketing emails(营销邮件):如促销活动、新闻通讯、产品更新等
  • notification emails(通知邮件):如系统告警、状态更新、事件提醒等
  • bulk emails(批量邮件):如会员邮件、批量通知等
  • personalized emails(个性化邮件):根据用户属性动态生成内容

2. 环境准备与安装

2.1 前提条件

在开始使用SendGrid Python库之前,你需要准备:

  • Python 2.7或更高版本的环境
  • SendGrid账户(免费账户即可开始使用,注册地址:https://sendgrid.com/free)
  • SendGrid API密钥(在SendGrid控制台创建,需要"Mail Send"权限)

2.2 获取SendGrid API密钥

  1. 登录SendGrid账户,进入"Settings > API Keys"页面
  2. 点击"Create API Key"按钮
  3. 输入API密钥名称(如"Python-App")
  4. 选择权限级别,对于邮件发送,至少需要"Mail Send"权限
  5. 点击"Create & View"按钮,保存生成的API密钥(仅显示一次)

2.3 安装SendGrid Python库

2.3.1 使用pip安装(推荐)
pip install sendgrid
2.3.2 从源码安装

如果你需要最新的开发版本,可以从Git仓库克隆并安装:

git clone https://gitcode.com/gh_mirrors/se/sendgrid-python.git
cd sendgrid-python
python setup.py install
2.3.3 验证安装

安装完成后,可以通过以下命令验证:

python -c "import sendgrid; print('SendGrid Python library version:', sendgrid.__version__)"

如果输出类似SendGrid Python library version: 6.9.7的信息,则表示安装成功。

2.4 配置API密钥

SendGrid Python库需要使用API密钥进行身份验证。推荐的做法是通过环境变量设置API密钥,而不是硬编码在代码中。

2.4.1 在Linux/Mac系统中设置
# 临时设置(当前终端会话有效)
export SENDGRID_API_KEY='你的API密钥'

# 永久设置(推荐)
echo "export SENDGRID_API_KEY='你的API密钥'" >> ~/.bashrc
source ~/.bashrc

# 或者使用.env文件
echo "SENDGRID_API_KEY='你的API密钥'" > .env
2.4.2 在Windows系统中设置
:: 临时设置(当前命令提示符会话有效)
set SENDGRID_API_KEY=你的API密钥

:: 永久设置(推荐)
setx SENDGRID_API_KEY "你的API密钥"

3. 快速入门:发送第一封邮件

3.1 最简单的邮件发送示例

下面是使用SendGrid Python库发送邮件的最基本示例:

import os
from sendgrid import SendGridAPIClient
from sendgrid.helpers.mail import Mail

def send_simple_email():
    message = Mail(
        from_email='from@example.com',  # 发件人邮箱(需在SendGrid验证)
        to_emails='to@example.com',    # 收件人邮箱
        subject='使用SendGrid Python库发送的第一封邮件',  # 邮件主题
        html_content='<strong>Hello World!</strong> 这是使用SendGrid Python库发送的测试邮件。')  # HTML内容
    
    try:
        sg = SendGridAPIClient(os.environ.get('SENDGRID_API_KEY'))
        response = sg.send(message)
        print(f"邮件发送成功!状态码: {response.status_code}")
        print(f"响应体: {response.body}")
        print(f"响应头: {response.headers}")
        return True
    except Exception as e:
        print(f"邮件发送失败: {str(e)}")
        return False

if __name__ == "__main__":
    send_simple_email()

3.2 代码解析

上面的代码主要包含以下几个步骤:

  1. 导入必要的模块:SendGridAPIClient用于与API交互,Mail用于构建邮件内容
  2. 创建Mail对象,设置发件人、收件人、主题和内容
  3. 创建SendGridAPIClient实例,传入API密钥(从环境变量获取)
  4. 调用send方法发送邮件,获取响应
  5. 处理响应或捕获异常

3.3 运行结果

如果一切正常,你将看到类似以下的输出:

邮件发送成功!状态码: 202
响应体: b''
响应头: Server: nginx
Date: Wed, 09 Sep 2025 08:19:06 GMT
Content-Type: application/json
Content-Length: 0
Connection: keep-alive
X-Message-Id: abc123def456ghi789jkl012mno345pqr678stu901vwx234yz
Access-Control-Allow-Origin: https://sendgrid.api-docs.io
Access-Control-Allow-Methods: POST
Access-Control-Allow-Headers: Authorization, Content-Type, On-behalf-of, x-sg-elas-acl
Access-Control-Max-Age: 600
X-No-CORS-Reason: https://sendgrid.com/docs/Classroom/Basics/API/cors.html

状态码202表示请求已被接受,邮件将在后台处理发送。此时,收件人应该能收到邮件。

4. 核心功能详解

4.1 邮件内容构建

SendGrid Python库提供了灵活的方式来构建邮件内容,支持文本、HTML、附件等多种形式。

4.1.1 文本和HTML内容

邮件可以同时包含文本和HTML内容,收件人邮箱客户端会根据设置显示相应的内容:

from sendgrid.helpers.mail import Mail, Content

# 文本内容
text_content = Content("text/plain", "这是纯文本内容")
# HTML内容
html_content = Content("text/html", "<strong>这是HTML内容</strong>")

# 创建邮件对象,同时设置文本和HTML内容
message = Mail(
    from_email='from@example.com',
    to_emails='to@example.com',
    subject='包含文本和HTML内容的邮件',
)
message.add_content(text_content)
message.add_content(html_content)
4.1.2 添加附件

SendGrid Python库支持添加多种类型的附件,可以是本地文件或内存中的数据:

import base64
from sendgrid.helpers.mail import Attachment, FileContent, FileName, FileType, Disposition

def add_attachment_to_email(message, file_path, file_name=None, file_type=None):
    """
    向邮件添加附件
    
    :param message: Mail对象
    :param file_path: 本地文件路径
    :param file_name: 附件显示名称(默认使用文件名)
    :param file_type: 文件MIME类型(默认自动推断)
    :return: 添加了附件的Mail对象
    """
    # 读取文件内容并进行base64编码
    with open(file_path, 'rb') as f:
        data = f.read()
        encoded = base64.b64encode(data).decode()
    
    # 设置附件内容
    file_content = FileContent(encoded)
    # 设置附件名称
    if not file_name:
        file_name = os.path.basename(file_path)
    file_name = FileName(file_name)
    # 设置文件类型
    if not file_type:
        # 简单推断常见文件类型
        ext = os.path.splitext(file_path)[1].lower()
        mime_types = {
            '.txt': 'text/plain',
            '.pdf': 'application/pdf',
            '.jpg': 'image/jpeg',
            '.jpeg': 'image/jpeg',
            '.png': 'image/png',
            '.gif': 'image/gif',
            '.doc': 'application/msword',
            '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            '.xls': 'application/vnd.ms-excel',
            '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            '.zip': 'application/zip',
        }
        file_type = mime_types.get(ext, 'application/octet-stream')
    file_type = FileType(file_type)
    # 设置附件处置方式(attachment表示作为附件,inline表示内联)
    disposition = Disposition('attachment')
    
    # 创建附件对象
    attachment = Attachment()
    attachment.file_content = file_content
    attachment.file_name = file_name
    attachment.file_type = file_type
    attachment.disposition = disposition
    
    # 添加附件到邮件
    message.attachment = attachment
    return message

# 使用示例
message = Mail(
    from_email='from@example.com',
    to_emails='to@example.com',
    subject='包含附件的邮件',
    html_content='<strong>这封邮件包含一个PDF附件</strong>'
)
add_attachment_to_email(message, 'document.pdf')

4.2 多收件人和抄送

SendGrid Python库支持向多个收件人发送邮件,包括抄送(CC)和密送(BCC):

from sendgrid.helpers.mail import To, Cc, Bcc

# 基本用法:多个收件人(字符串,用逗号分隔)
message = Mail(
    from_email='from@example.com',
    to_emails='to1@example.com,to2@example.com',
    subject='发送给多个收件人的邮件',
    html_content='<strong>这封邮件发送给多个收件人</strong>'
)

# 高级用法:使用To、Cc、Bcc对象,可以设置名称
to_email1 = To(email='to1@example.com', name='收件人1')
to_email2 = To(email='to2@example.com', name='收件人2')
cc_email = Cc(email='cc@example.com', name='抄送人')
bcc_email = Bcc(email='bcc@example.com', name='密送人')

# 创建邮件对象
message = Mail(
    from_email='from@example.com',
    subject='使用To、Cc、Bcc对象的邮件',
    html_content='<strong>这封邮件使用了To、Cc、Bcc对象</strong>'
)
# 添加收件人
message.to = [to_email1, to_email2]
# 添加抄送
message.cc = [cc_email]
# 添加密送
message.bcc = [bcc_email]

4.3 个性化邮件

SendGrid支持为不同收件人定制个性化内容,包括主题、内容、替换标签等:

from sendgrid.helpers.mail import Personalization, Subject, Substitution

def create_personalized_email():
    # 创建基本邮件对象(不包含to_emails和subject)
    message = Mail(
        from_email='from@example.com',
        html_content='<p>Hello {{name}},</p><p>你的验证码是:{{code}}</p>'
    )
    
    # 创建第一个个性化设置
    personalization1 = Personalization()
    personalization1.add_to(To('user1@example.com', '用户1'))
    personalization1.subject = Subject('用户1的个性化邮件')
    personalization1.add_substitution(Substitution('{{name}}', '用户1'))
    personalization1.add_substitution(Substitution('{{code}}', '123456'))
    
    # 创建第二个个性化设置
    personalization2 = Personalization()
    personalization2.add_to(To('user2@example.com', '用户2'))
    personalization2.subject = Subject('用户2的个性化邮件')
    personalization2.add_substitution(Substitution('{{name}}', '用户2'))
    personalization2.add_substitution(Substitution('{{code}}', '654321'))
    
    # 添加个性化设置到邮件
    message.add_personalization(personalization1)
    message.add_personalization(personalization2)
    
    return message

4.4 模板邮件

SendGrid提供了 transactional templates(交易模板)功能,可以在控制台创建和管理邮件模板,然后通过API使用模板发送邮件:

from sendgrid.helpers.mail import Mail, From, To, Subject, DynamicTemplateData

def send_template_email(template_id, to_email, dynamic_data):
    """
    使用模板发送邮件
    
    :param template_id: 模板ID(在SendGrid控制台获取)
    :param to_email: 收件人邮箱
    :param dynamic_data: 动态模板数据(字典)
    :return: 发送结果
    """
    message = Mail(
        from_email=From('from@example.com', '发件人名称'),
        to_emails=To(to_email)
    )
    # 设置模板ID
    message.template_id = template_id
    # 设置动态模板数据
    message.dynamic_template_data = DynamicTemplateData(dynamic_data)
    
    try:
        sg = SendGridAPIClient(os.environ.get('SENDGRID_API_KEY'))
        response = sg.send(message)
        print(f"模板邮件发送成功,状态码: {response.status_code}")
        return True
    except Exception as e:
        print(f"模板邮件发送失败: {str(e)}")
        return False

# 使用示例
template_id = 'd-1234567890abcdef1234567890abcdef'  # 替换为你的模板ID
dynamic_data = {
    'name': '用户',
    'order_number': 'ORD123456',
    'product': 'SendGrid Python库',
    'amount': '¥99.00'
}
send_template_email(template_id, 'user@example.com', dynamic_data)

4.5 邮件跟踪与统计

SendGrid提供了丰富的邮件跟踪功能,包括打开跟踪、点击跟踪、退订跟踪等:

from sendgrid.helpers.mail import TrackingSettings, ClickTracking, OpenTracking

def enable_tracking_for_email(message):
    """启用邮件跟踪功能"""
    # 创建跟踪设置对象
    tracking_settings = TrackingSettings()
    
    # 启用点击跟踪
    click_tracking = ClickTracking(enable=True, enable_text=True)
    tracking_settings.click_tracking = click_tracking
    
    # 启用打开跟踪
    open_tracking = OpenTracking(enable=True)
    # 可选:自定义替换标签
    # open_tracking.substitution_tag = "%open-track%"
    tracking_settings.open_tracking = open_tracking
    
    # 将跟踪设置添加到邮件
    message.tracking_settings = tracking_settings
    return message

# 使用示例
message = Mail(
    from_email='from@example.com',
    to_emails='to@example.com',
    subject='启用跟踪功能的邮件',
    html_content='<p>这封邮件启用了打开跟踪和点击跟踪</p><a href="https://example.com">点击这里</a>'
)
enable_tracking_for_email(message)

启用跟踪后,可以在SendGrid控制台查看详细的统计数据,包括:

  • 发送量、送达率、打开率、点击率
  • 退信、投诉、退订数量
  • 地理分布、设备类型、邮箱客户端等

5. 高级功能与最佳实践

5.1 批量发送邮件

对于需要发送大量邮件的场景,SendGrid提供了高效的批量发送功能,可以显著提高发送效率:

import os
from sendgrid import SendGridAPIClient
from sendgrid.helpers.mail import Mail, Personalization, To, Subject, Substitution

def send_batch_emails(recipients, template_content, subject_template):
    """
    批量发送个性化邮件
    
    :param recipients: 收件人列表,每个元素是包含email、name、data的字典
    :param template_content: 邮件内容模板,包含替换标签
    :param subject_template: 邮件主题模板,包含替换标签
    :return: 发送结果
    """
    # 创建基本邮件对象
    message = Mail(
        from_email='from@example.com',
        html_content=template_content
    )
    
    # 为每个收件人创建个性化设置
    for recipient in recipients:
        personalization = Personalization()
        personalization.add_to(To(recipient['email'], recipient['name']))
        personalization.subject = Subject(subject_template)
        
        # 添加替换标签
        for key, value in recipient['data'].items():
            personalization.add_substitution(Substitution(f'{{{{{key}}}}}', value))
        
        message.add_personalization(personalization)
    
    try:
        sg = SendGridAPIClient(os.environ.get('SENDGRID_API_KEY'))
        response = sg.send(message)
        print(f"批量邮件发送成功,状态码: {response.status_code}")
        return True
    except Exception as e:
        print(f"批量邮件发送失败: {str(e)}")
        return False

# 使用示例
recipients = [
    {
        'email': 'user1@example.com',
        'name': '用户1',
        'data': {'name': '用户1', 'code': '123456', 'product': '产品A'}
    },
    {
        'email': 'user2@example.com',
        'name': '用户2',
        'data': {'name': '用户2', 'code': '654321', 'product': '产品B'}
    },
    # 可以添加更多收件人...
]

template_content = '''
<p>Hello {{name}},</p>
<p>感谢您购买{{product}},您的验证码是:{{code}}</p>
<p>祝您使用愉快!</p>
'''

subject_template = '您的{{product}}购买确认'

send_batch_emails(recipients, template_content, subject_template)

注意:SendGrid API对单次请求的个性化设置数量有限制(免费账户通常为1000个),如果需要发送更多邮件,请分批发送。

5.2 异步发送与任务队列

对于大量邮件发送或需要不阻塞主程序的场景,可以使用异步发送或结合任务队列(如Celery)来处理:

import asyncio
from sendgrid import SendGridAPIClient
from sendgrid.helpers.mail import Mail

async def send_email_async(message):
    """异步发送邮件"""
    loop = asyncio.get_event_loop()
    # 使用run_in_executor在后台线程执行发送任务
    future = loop.run_in_executor(
        None,  # 使用默认的线程池
        lambda: SendGridAPIClient(os.environ.get('SENDGRID_API_KEY')).send(message)
    )
    try:
        response = await future
        print(f"异步邮件发送成功,状态码: {response.status_code}")
        return True
    except Exception as e:
        print(f"异步邮件发送失败: {str(e)}")
        return False

# 使用示例
async def main():
    message = Mail(
        from_email='from@example.com',
        to_emails='to@example.com',
        subject='异步发送的邮件',
        html_content='<p>这是一封异步发送的邮件</p>'
    )
    await send_email_async(message)

# 运行异步函数
asyncio.run(main())

5.3 错误处理与重试机制

为了提高邮件发送的可靠性,需要实现完善的错误处理和重试机制:

import time
from sendgrid import SendGridAPIClient
from sendgrid.helpers.mail import Mail
from sendgrid.exceptions import SendGridException

def send_email_with_retry(message, max_retries=3, retry_delay=5):
    """
    带重试机制的邮件发送
    
    :param message: Mail对象
    :param max_retries: 最大重试次数
    :param retry_delay: 重试间隔(秒)
    :return: 发送结果(成功/失败)
    """
    sg = SendGridAPIClient(os.environ.get('SENDGRID_API_KEY'))
    
    for attempt in range(max_retries + 1):
        try:
            response = sg.send(message)
            # 检查状态码,2xx表示成功
            if 200 <= response.status_code < 300:
                print(f"邮件发送成功,状态码: {response.status_code}")
                return True
            else:
                print(f"邮件发送失败,状态码: {response.status_code},响应体: {response.body}")
        except SendGridException as e:
            print(f"SendGrid异常 (尝试 {attempt + 1}/{max_retries + 1}): {str(e)}")
        except Exception as e:
            print(f"其他异常 (尝试 {attempt + 1}/{max_retries + 1}): {str(e)}")
        
        # 如果不是最后一次尝试,等待后重试
        if attempt < max_retries:
            print(f"将在 {retry_delay} 秒后重试...")
            time.sleep(retry_delay)
            # 指数退避:每次重试间隔加倍
            retry_delay *= 2
    
    print(f"已达到最大重试次数 ({max_retries}),邮件发送失败")
    return False

# 使用示例
message = Mail(
    from_email='from@example.com',
    to_emails='to@example.com',
    subject='带重试机制的邮件',
    html_content='<p>这是一封带重试机制的邮件</p>'
)
send_email_with_retry(message, max_retries=3, retry_delay=5)

5.4 性能优化建议

为了提高邮件发送的性能和效率,可以参考以下建议:

  1. 批量发送:尽量使用批量发送功能,减少API调用次数
  2. 异步发送:对于Web应用,使用异步发送避免阻塞请求处理
  3. 连接池:如果频繁发送邮件,可以复用HTTP连接
  4. 合理设置超时:根据网络情况合理设置API调用超时时间
  5. 监控与报警:实现邮件发送监控,及时发现和解决问题
  6. 避免峰值发送:尽量避开邮件发送高峰期,如早晨8-10点
  7. 合理设置并发:控制并发发送数量,避免触发API速率限制

6. 常见问题与解决方案

6.1 认证失败

问题:发送邮件时提示认证失败,状态码401。

可能原因

  • API密钥无效或已过期
  • API密钥权限不足
  • 环境变量未正确设置
  • API密钥包含空格或特殊字符

解决方案

  1. 检查API密钥是否正确,尝试重新生成
  2. 确保API密钥具有"Mail Send"权限
  3. 验证环境变量是否正确设置:echo $SENDGRID_API_KEY(Linux/Mac)或echo %SENDGRID_API_KEY%(Windows)
  4. 如果API密钥包含特殊字符,尝试用引号包裹

6.2 邮件被标记为垃圾邮件

问题:邮件成功发送,但被收件人邮箱标记为垃圾邮件。

可能原因

  • 发件人邮箱未经过验证
  • 邮件内容包含垃圾邮件特征词
  • 发送频率过高
  • IP地址或域名信誉度低
  • 缺乏正确的取消订阅机制

解决方案

  1. 在SendGrid控制台完成发件人邮箱验证
  2. 使用SendGrid的域名认证功能(Domain Authentication)
  3. 优化邮件内容,避免使用垃圾邮件特征词
  4. 控制发送频率,避免短期内大量发送
  5. 添加明显的取消订阅链接
  6. 监控垃圾邮件投诉率,保持在0.1%以下

6.3 邮件发送限制

问题:发送大量邮件时收到429 Too Many Requests错误。

可能原因

  • 超出了SendGrid账户的发送速率限制
  • 单次API调用包含的收件人过多

解决方案

  1. 了解你的SendGrid账户的发送限制(免费账户通常为每天100封)
  2. 实现速率限制,控制发送频率
  3. 将大量收件人拆分为多个API调用
  4. 使用批量发送功能,而不是多次调用单个发送
  5. 考虑升级账户以提高发送限额

6.4 附件大小限制

问题:添加大附件时发送失败。

可能原因

  • 单个附件大小超过限制(通常为30MB)
  • 所有附件总大小超过限制

解决方案

  1. 减小附件大小,或使用文件压缩
  2. 考虑使用文件共享链接代替直接附件
  3. 对于超大文件,实现分块上传(需要调用底层API)

7. 总结与展望

SendGrid Python库是一个功能强大、易于使用的邮件发送工具,它封装了SendGrid Web API v3的所有功能,为Python开发者提供了简洁高效的邮件发送解决方案。通过本文的介绍,你已经掌握了SendGrid Python库的基本使用方法和高级功能,包括:

  • 环境准备与安装配置
  • 基本邮件发送
  • 邮件内容构建(文本、HTML、附件)
  • 多收件人和个性化邮件
  • 模板邮件和批量发送
  • 邮件跟踪与统计
  • 错误处理与重试机制
  • 性能优化和常见问题解决

随着业务需求的不断变化,SendGrid也在持续更新其API和功能。未来,SendGrid Python库可能会增加更多高级功能,如AI驱动的邮件内容优化、更精细的发送控制、更丰富的统计分析等。建议开发者保持关注SendGrid的官方文档和更新日志,及时了解新功能和最佳实践。

最后,邮件发送是许多应用的关键功能,选择合适的工具和服务至关重要。SendGrid Python库凭借其强大的功能、可靠的性能和活跃的社区支持,无疑是Python开发者的理想选择。希望本文能够帮助你更好地理解和使用SendGrid Python库,构建更稳定、高效的邮件发送系统。

附录:参考资源

  • SendGrid Python库官方文档:https://sendgrid.com/docs/API_Reference/SMTP_API/index.html
  • SendGrid Web API v3文档:https://sendgrid.com/docs/API_Reference/Web_API_v3/index.html
  • SendGrid Python库GitHub仓库:https://gitcode.com/gh_mirrors/se/sendgrid-python
  • SendGrid控制台:https://app.sendgrid.com/
  • SendGrid帮助中心:https://support.sendgrid.com/

如果你觉得本文对你有帮助,请点赞、收藏并关注作者,获取更多Python开发和邮件发送相关的技术文章。下一篇文章我们将介绍如何使用SendGrid构建完整的邮件营销系统,敬请期待!

【免费下载链接】sendgrid-python The Official Twilio SendGrid Python API Library 【免费下载链接】sendgrid-python 项目地址: https://gitcode.com/gh_mirrors/se/sendgrid-python

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值