已完成django-amazon-ses配置,如何用AWS SES发邮件并接收信号?
别担心,其实django-amazon-ses本质上是替换了Django默认的邮件后端,所以发送邮件的方式和你用Django原生发邮件几乎一样,我给你一步步讲清楚:
一、发送邮件的具体方法
因为django-amazon-ses只是作为Django的邮件后端存在,你完全可以用Django自带的邮件发送API,不需要额外调用这个库的特殊方法:
- 用
send_mail快捷函数(最常用):
from django.core.mail import send_mail send_mail( '这是邮件主题', # 主题 '这是纯文本邮件正文', # 正文 'sender@example.com', # 发件人(需要在AWS SES里验证) ['recipient@example.com'], # 收件人列表 fail_silently=False, # 是否静默失败,建议设为False方便排查问题 )
- 用
EmailMessage类(更灵活,支持附件、密送等):
from django.core.mail import EmailMessage email = EmailMessage( '邮件主题', '纯文本正文', 'sender@example.com', ['recipient1@example.com', 'recipient2@example.com'], ['bcc@example.com'], # 密送地址 reply_to=['reply@example.com'], # 回复地址 ) email.send()
- 发送HTML格式邮件(用
EmailMultiAlternatives):
from django.core.mail import EmailMultiAlternatives subject = 'HTML邮件主题' text_content = '如果收件人邮箱不支持HTML,会显示这段纯文本内容' html_content = '<p>这是<b>HTML格式</b>的邮件正文,支持各种样式</p>' from_email = 'sender@example.com' to = ['recipient@example.com'] msg = EmailMultiAlternatives(subject, text_content, from_email, to) msg.attach_alternative(html_content, "text/html") # 添加HTML内容 msg.send()
二、接收pre_send和post_send信号
django-amazon-ses提供的这两个信号,分别在邮件发送前和发送后触发,你需要写信号接收器来捕获并处理它们:
- 先在你的app目录下创建
signals.py文件,编写接收器函数:
from django.dispatch import receiver from django_amazon_ses.signals import pre_send, post_send # 捕获pre_send信号:邮件即将发送时触发 @receiver(pre_send) def handle_pre_send(sender, message, **kwargs): # 这里可以做预处理,比如记录发送日志、修改邮件内容等 print(f"准备发送邮件到:{', '.join(message.to)}") print(f"邮件主题:{message.subject}") # 捕获post_send信号:邮件发送完成后触发 @receiver(post_send) def handle_post_send(sender, message, response, **kwargs): # response是AWS SES返回的响应数据,可用于判断发送状态 print(f"邮件发送结果:{response}") # 比如可以在这里记录发送成功/失败的日志,或者处理失败回调
- 让Django加载这个信号模块,修改app的
apps.py文件:
from django.apps import AppConfig class YourAppConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'your_app_name' # 替换成你的app名称 def ready(self): import your_app_name.signals # 导入信号模块
- 最后在
settings.py的INSTALLED_APPS里,把你的app替换成上面的配置类:
INSTALLED_APPS = [ # ... 其他app 'your_app_name.apps.YourAppConfig', # 替换原来的'your_app_name' # ... ]
三、主题、正文等内容的配置
这些内容不需要在django-amazon-ses的配置里单独设置,完全是在你调用Django邮件API的时候通过参数指定的,就像上面例子里的subject、message/body参数。
另外要注意两个关键点:
- 发件人邮箱必须是在AWS SES中验证过的(如果你的AWS账户还在沙盒模式);如果已经通过生产访问权限,就不需要单个验证邮箱
- 如果设置
fail_silently=False,发送失败时会抛出异常,你可以捕获这些异常来处理错误情况
内容的提问来源于stack exchange,提问作者Axil
相关产品推荐
相关产品推荐

