要在Django项目中实现实际发送邮件功能,需要完成以下配置和代码调整:
1. 配置邮件发送参数(settings.py)
在项目设置中添加邮件服务器配置,以常用的SMTP服务为例:
# 邮件配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' # 默认后端
EMAIL_HOST = 'smtp.example.com' # 邮件服务器地址(如smtp.163.com、smtp.gmail.com)
EMAIL_PORT = 587 # 端口(通常587或465)
EMAIL_USE_TLS = True # 启用TLS加密(587端口常用)
# EMAIL_USE_SSL = True # 启用SSL加密(465端口常用,与TLS二选一)
EMAIL_HOST_USER = 'your-email@example.com' # 发送邮箱账号
EMAIL_HOST_PASSWORD = 'your-password' # 邮箱密码/授权码(非登录密码,需在邮箱设置中获取)
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER # 默认发件人
不同邮箱的SMTP配置参考:
- 163邮箱:EMAIL_HOST='smtp.163.com',端口587
- QQ邮箱:EMAIL_HOST='smtp.qq.com',端口587
- Gmail:EMAIL_HOST='smtp.gmail.com',端口587
2. 验证邮件发送功能
可以通过Django的命令行测试邮件发送是否正常:
python manage.py shell
在shell中执行:
from django.core.mail import send_mail
send_mail(
'测试邮件',
'这是一封测试邮件',
'your-email@example.com',
['recipient@example.com'], # 接收邮箱
fail_silently=False,
)
如果返回1表示发送成功,若失败会抛出具体错误(如认证失败、端口错误等)。
3. 优化提醒邮件发送代码(send_reminders.py)
基于现有代码,补充异常处理和日志记录:
from django.core.management.base import BaseCommand
from django.utils import timezone
from django.core.mail import send_mail
from django.conf import settings
from django.contrib.contenttypes.models import ContentType # 新增
from projects.models import Reminder, Milestone, Task
class Command(BaseCommand):
help = '发送已排期的里程碑和任务提醒'
def handle(self, *args, **options):
now = timezone.now()
# 查找当前时间前已排期且未发送的所有提醒
reminders = Reminder.objects.filter(
scheduled_date__lte=now,
is_sent=False
).select_related('user') # 优化查询
sent_count = 0
for reminder in reminders:
try:
# 获取关联对象信息
content_type = reminder.content_type
model_class = content_type.model_class()
# 验证关联对象是否存在
try:
related_obj = model_class.objects.get(id=reminder.object_id)
except model_class.DoesNotExist:
self.stdout.write(self.style.WARNING(f"关联对象不存在,跳过提醒 ID: {reminder.id}"))
reminder.is_sent = True # 标记为已发送避免重复处理
reminder.save()
continue
# 获取对象名称和类型
obj_name = related_obj.name if hasattr(related_obj, 'name') else related_obj.title
obj_type = "里程碑" if model_class == Milestone else "任务"
# 发送邮件提醒
send_mail(
subject=f"【项目提醒】{obj_type}:{obj_name}",
message=reminder.message,
from_email=settings.DEFAULT_FROM_EMAIL,
recipient_list=[reminder.user.email],
fail_silently=False,
)
# 更新提醒状态
reminder.is_sent = True
reminder.sent_at = now
reminder.save()
sent_count += 1
self.stdout.write(self.style.SUCCESS(
f"已向 {reminder.user.email} 发送{obj_type}提醒:{obj_name}"
))
except Exception as e:
self.stdout.write(self.style.ERROR(
f"发送提醒失败(ID: {reminder.id}):{str(e)}"
))
self.stdout.write(self.style.SUCCESS(f"成功发送 {sent_count} 条提醒"))
4. 设置定时任务自动发送提醒
为了让提醒功能自动运行,需要配置定时任务:
1.** 安装django-crontab **
pip install django-crontab
2.** 配置settings.py **
INSTALLED_APPS = [
# ...其他应用
'django_crontab',
]
# 定时任务配置(每天早上9点执行)
CRONJOBS = [
('0 9 * * *', 'projects.management.commands.send_reminders.Command', '>> /var/log/django/reminders.log 2>&1'),
]
3.** 启动定时任务 **
python manage.py crontab add # 添加任务
python manage.py crontab show # 查看任务
python manage.py crontab remove # 移除任务
5. 常见问题解决
- 发送失败 :检查邮箱SMTP服务是否开启、授权码是否正确、端口和加密方式是否匹配
- 批量发送 :若提醒数量大,建议使用django.core.mail.send_mass_mail或异步任务(如Celery)
- 本地测试 :开发环境可使用控制台输出代替实际发送:
python
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
通过以上配置,系统将能够按照预定时间自动发送里程碑和任务提醒邮件。
版权声明:如无特殊说明,文章均为本站原创,转载请注明出处
本文链接:http://jiangyudong.top/subject/article/DjangoEmail/
许可协议:署名-非商业性使用 4.0 国际许可协议