Django发送邮件


简介:

    虽然python提供了smtplib库,来完成email的发送功能,但是django对其进行了封装,使得发送邮件的接口变得更简单,更方便,django的封装位于django.core.mail


例子:
from django.core.mail import send_mail

send_mail('Subject here', 'Here is the message.', 'from@example.com',    ['to@example.com'], fail_silently=False)

    邮件的发送通过django的setting文件中设置的 <a href="http://docs.djangoproject.com/en/dev/ref/settings/#setting-EMAIL_HOSTEMAIL_HOST、 EMAIL_PORT EMAIL_HOST_USEREMAIL_HOST_PASSWORD来认证SMTP服务器、 EMAIL_USE_TLS用来说明发送的时候是否使用一个安全的连接来进行, DEFAULT_CHARSET用来指定发送邮件的字符集。


定义:

(1)    send_mail(subject, message, from_email, recipient_list, fail_silently=False, auth_user=None,auth_password=None)

        作用:发送一个邮件

        subject:邮件的标题
        message:邮件的内容
        from_email:发送邮件者
nbsp;       recipient_list:接受邮件者列表
        fail_silently:可选参数,默认是False,如果是False,则发送失败时候,会抛出smtplib.SMTPException异常,具体详细的异常,
        请参考 smtplib docs,这些异常都是SMTPException的子类。

        auth_user:可选的参数,如果有,那么认证SMTP Server时,使用该用户,否则使用 EMAIL_HOST_USER设置
        auth_password:可选参数,如果有,那么认证SMTP Server时,使用该密码,否则使用 、EMAIL_HOST_PASSWORD设置

(2)    send_mass_mail( datatuple, fail_silently=False, auth_user=None, auth_password=None)

        datatuple:是一个元组,其格式如下:
        (subject,message,from_email,recipient_list)
        作用:发送一组邮件
        fail_silently, auth_user and auth_password三个参数的意义同send_mail

send_mass_mail和send_mail的区别

send_mail每次发送邮件都打开一个新的连接来发送。
send_mass_mail每次发送邮件时仅仅打开一个连接,将这次元组中的所有邮件发送出去。

所以send_mass_mail更有效率。



两个给管理员发送邮件的快捷方式

mail_adminsem>subject, message, fail_silently=False)

mail_managersem>subject, message, fail_silently=False)

这两个方法在发送邮件时注意以下两点:
(1)邮件的标题前面django会自动加上 EMAIL_SUBJECT_PREFIX中设置的前缀,缺省是"[Django"。
(2)邮件的发送者将是由SERVER_EMAIL来设置
(3)邮件的接受者将是 MANAGERS ADMINS来设置


EmailMessage 和 SMTPConnection

上面提供的email函数,仅仅能够提供最基本的发送邮件的功能,其他的诸如:文件附件和多媒体email都需要EmailMessage类来提供。

EmailMessage构造函数的所有参数如下所示,所有参数都是可选的
subject:邮件的标题
body:邮件的正文,这个字段应该是纯文本文件
from_email:发送者的邮件地址,fred@example.com 和 Fred <fred@example.com>,这两种格式都是合法的,
          如果该字段没有设置的话,将使用setting中的 DEFAULT_FROM_EMAIL
to:所有接收人组成的一个元组
bcc:所有秘密抄送人组成的一个元组
connection:发送邮件是使用的SMTPConnection连接,如果不适用该字段,那么每次发送邮件时都会新建
                   一个SMTPConnection对象
attachments:附件列表,能是email.MIMEBase.MIMEBase实例,或者(filename, content, mimetype)元组

headers:邮件头字段,如果要增加额外的邮件头,请用该字段,关键字是key,值是value。
例如:
email = EmailMessage('Hello', 'Body goes here', 'from@example.com',
            ['to1@example.com', 'to2@example.com'], ['bcc@example.com'],
            headers = {'Reply-To': 'another@example.com'})
该类有下列方法可用:
        (1)send(fail_silently=False) 发送邮件,如果fail_silently=False时,出错将抛掷异常

        (2)message() 返回一个django.core.mail.SafeMIMEText类型的对象或者django.core.mail.SafeMIMEMultipart类型的对象。

        (3)recipients() 获取发送人列表,包括to和bcc的所有发送人

        (4)attach() 向邮件中增加附件,其参数可以是email.MIMEBase.MIMEBase的实例,或者是filename, content and mimetype,

                其中filename是附件中呈现的文件名,content是附件的数据,mimetype是附件的MIME类型

                例如:message.attach('design.png', img_data, 'image/png')

        (5)attach_file() 直接从文件系统中向邮件添加附件,如果mime类型没有填写,那么django会根据文件名推测出来。
例如:message.attach_file('/images/weather_map.png')



EmailMultiAlternatives

使用 EmailMessage中发送邮件的内容,只能是一种类型的"text/html"或者"text/plain"。但是实际应用中,
我们可能会一封邮件中既有 text/html的内容,又有text/plain的内容,这个时候可以使用EmailMultiAlternatives
类,他是EmailMessage的子类,他有一个方法attach_alternative() ,可以让邮件中包括多种形式的内容
例如:
from django.core.mail import EmailMultiAlternatives



subject, from_email, to = 'hello', 'from@example.com', 'to@example.com'

text_content = 'This is an important message.'

html_content = '<p>This is an <strong>important</strong> message.</p>'

msg = EmailMultiAlternatives(subject, text_content, from_email, [to])

msg.attach_alternative(html_content, "text/html")

msg.send()


EmailMessage的类型修改

EmailMessage的类型默认情况下是"text/plain",可以通过修改subtype属性,使得类型变成"text/html"
例如:

msg = EmailMessage(subject, html_content, from_email, [to])

msg.content_subtype = "html" # Main content is now text/html

msg.send()

SMTPConnection 对象

SMTPConnection初始化需要四个参数:连接SMTP服务器所需要的host, port, username and password,如果某个缺省了,那么就从setting文件中读取默认值,另外send_messages用来发送一个邮件列表
例如:
connection = SMTPConnection()   # Use default settings for connection
messages = get_notification_email() #get_notification_email假设是用户定义的一个函数,用来获取所有想发出去的邮件
connection.send_messages(messages)
### 在 Django 中实现发送邮件验证码的功能 要在 Django 项目中实现发送邮件验证码的功能,可以按照以下方法设计模型、视图以及配置电子邮件服务。 #### 数据库模型定义 为了存储生成的验证码及其相关信息,可以在 `models.py` 文件中定义一个名为 `Vaild_Code` 的数据表: ```python from django.db import models class Vaild_Code(models.Model): code_content = models.CharField(max_length=8, verbose_name="验证码") # 存储验证码内容 code_time = models.DateTimeField(auto_now=True, verbose_name="创建时间") # 自动生成当前时间 code_status = models.IntegerField(default=0, verbose_name="状态", help_text="1 表示已使用;0 表示未使用") # 定义验证码的状态 code_user = models.EmailField(verbose_name="邮箱") # 关联用户的邮箱地址 def __str__(self): return f"{self.code_user} - {self.code_content}" ``` 此部分的设计基于已有引用中的字段说明[^3]。 --- #### 配置邮件服务 在 Django 项目的 `settings.py` 文件中,需要设置用于发送邮件的相关参数。这些参数通常包括 SMTP 服务器地址、端口、用户名和密码等信息。 以下是典型的邮件配置代码片段: ```python EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'smtp.example.com' # 替换为实际使用的SMTP服务器域名 EMAIL_PORT = 587 # 常见的SMTP端口号 EMAIL_USE_TLS = True # 是否启用TLS加密传输 EMAIL_HOST_USER = 'your_email@example.com' # 发件人的邮箱账号 EMAIL_HOST_PASSWORD = 'password' # 对应发件人邮箱的授权码或密码 DEFAULT_FROM_EMAIL = EMAIL_HOST_USER # 默认发件人显示名称 ``` 上述配置来源于关于 Django 设置邮件功能的内容描述[^2]。 --- #### 创建并发送验证码逻辑 接下来,在视图函数中完成验证码的生成与发送操作。可以通过 Python 的内置模块 `random` 来随机生成指定长度的字符串作为验证码,并通过 Django 提供的 `send_mail()` 方法将其发送至目标邮箱。 下面是一段完整的视图处理流程: ```python import random from django.core.mail import send_mail from .models import Vaild_Code from django.conf import settings def generate_code(): """生成6位数的随机验证码""" chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' length = len(chars) result = ''.join(random.choice(chars) for _ in range(6)) return result def send_verification_code(request): email = request.POST.get('email') # 获取前端提交的目标邮箱地址 if not email: return {"status": "error", "message": "请输入有效的电子邮箱"} try: is_registered = UserProfile.objects.filter(email=email).exists() # 判断该邮箱是否已经注册过账户[^4] if not is_registered: return {"status": "error", "message": "该邮箱尚未注册"} verification_code = generate_code() valid_record = Vaild_Code(code_content=verification_code, code_user=email) # 将新生成的验证码保存到数据库 valid_record.save() subject = "您的验证码" message = f"您好,您正在尝试登录/找回密码,请输入以下验证码:{verification_code}\n有效期为5分钟。" from_email = settings.DEFAULT_FROM_EMAIL recipient_list = [email] send_result = send_mail(subject, message, from_email, recipient_list) if send_result > 0: return {"status": "success", "message": "验证码已成功发送,请查收邮件"} else: return {"status": "error", "message": "验证码发送失败,请稍后再试"} except Exception as e: return {"status": "error", "message": str(e)} ``` 以上代码实现了从接收请求到生成验证码再到最终发送的过程[^1]。 --- #### 验证验证码的有效性 当用户收到邮件后返回填写验证码时,需验证其有效性。这一步骤同样应在视图层实现,具体做法是从数据库查询对应记录并与用户提供值对比。 示例代码如下所示: ```python from datetime import timedelta, timezone from django.utils.timezone import now def verify_code(request): input_code = request.POST.get('code') user_email = request.POST.get('email') current_time = now() five_minutes_ago = current_time - timedelta(minutes=5) record = Vaild_Code.objects.filter( code_user=user_email, code_content=input_code, code_status=0, code_time__gte=five_minutes_ago ).first() if record: record.code_status = 1 # 更新状态为已使用 record.save(update_fields=['code_status']) return {"status": "success", "message": "验证码校验通过"} else: return {"status": "error", "message": "验证码错误或者已失效"} ``` 这里的时间范围判断依据是确保验证码仅限于最近五分钟内有效。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值