使用django发送邮件只需要两步简单操作即可:
1.配置settings.py文件
STATIC_URL = '/static/'
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_USE_SSL = True # SSL加密方式
#EMAIL_USE_TLS = True #TSL加密方式,企业邮箱使用,与ssl加密方式只能选一个
EMAIL_HOST = 'smtp.qq.com' # 发送邮件的邮箱 的 SMTP服务器
EMAIL_PORT = 465 # SMTP服务器端口
EMAIL_HOST_USER = '7xxxxx0@qq.com' # 发件人
EMAIL_HOST_PASSWORD = "ldfxxxxxxfbcid" # 密码(这里使用的是授权码)
EMAIL_FROM = '恨你<787618310@qq.com>' # 邮件显示的发件人
2.调用发送邮件方法
视图函数中调用send_email方法
send_mail(subject="垃圾邮件", # 标题
message="这是一封测试邮件", # 内容h
from_email="787618310@qq.com", # 发件人
recipient_list=["1769991248@qq.com"], # 收件人列表
fail_silently=False,
html_message=h) # 发送失败报错
return HttpResponse("邮件已发送")
如果想实现发送多个邮件,可以用send_mass_mail()函数
'''发送多个邮件'''
message1 = ('Subject 1',
'Here is the message',
'7876xxxx@qq.com', # 发件人
['xxxx@qq.com']) # 收件人,多个收件人逗号隔开
message2 = ('Another Subject2',
'Here is another message',
'78761xxxx10@qq.com',
['176xxxx249@qq.com'])
send_mass_mail((message1, message2),
fail_silently=False)
send_mail方法参数说明
subject: 字符串,邮件标题。
message: 字符串,邮件内容。
from_email: 字符串,发件邮箱。
recipient_list: list列表,列表中每个成员都是一个邮箱地址,而且每个收件人都会在 “收件人/To:” 栏看到出现在recipient_list 中的其他收件人。
fail_silently: (可选)布尔值。为False 时,send_mail 会抛出smtplib.SMTPException 异常。smtplib 文档列出了所有可能的异常。这些异常都是 SMTPException 的子类。
auth_user:(可选)SMTP服务器的认证用户名。没提供该参数的情况下,Django会使用EMAIL_HOST_USER 配置项的设置。
auth_password:(可选)SMTP服务器的认证密码,没提供该参数的情况下,Django会使用EMAIL_HOST_PASSWORD 配置项的设置。
connection: (可选)发送邮件的后端。没提供该参数的情况下,Django会使用默认后端的实例。
html_message: (可选) send_mail方法独有,可以比较简单地实现一个html文本的传输
def send_mass_mail(datatuple, fail_silently=False, auth_user=None,
auth_password=None, connection=None):
"""
给定tuple数据类型(subject,message,from_email,recipient_list),发送每封邮件到每个收件人列表。 返回发送的电子邮件数量。
如果from_email为None,请使用DEFAULT_FROM_EMAIL设置。
如果设置了auth_user和auth_password,请使用它们登录。
如果auth_user为None,请使用EMAIL_HOST_USER设置。
如果auth_password为None,请使用EMAIL_HOST_PASSWORD设置。
注意:此方法的API已冻结。 想要扩展的新代码功能应该直接使用EmailMessage类。
"""
connection = connection or get_connection(
username=auth_user,
password=auth_password,
fail_silently=fail_silently,
)
messages = [
EmailMessage(subject, message, sender, recipient, connection=connection)
for subject, message, sender, recipient in datatuple
]
return connection.send_messages(messages)
3.发送带html格式的邮件,可以将html当做字符串,赋值给html_message参数即可
4.发送带附件的邮件信息
可以使用EmailMessage类或EmailMultiAlternatives类
EmailMessage
EmailMessage 类使用下列参数初始化(除非使用位置参数,否则默认顺序如下)。所有参数均可选,均可在调用 send()方法之前的任何时间对其赋值。
subject: 邮件的标题行
body: 邮件的主体内容文本,须是纯文本信息。
from_email: 发送者的地址。 fred@example.com 或 Fred fred@example.com 格式都是合法的。如果忽略该参数,Django就会使用 DEFAULT_FROM_EMAIL 配置项。
to: 收件人地址列表或元组。
bcc: 发送邮件时用于”Bcc”头信息的一组列表或元组,也就是暗送的收件人
connection: 一个邮件后端实例。用同一个链接发送多封邮件就要用到该参数。忽略该参数时,会在调用 send() 时自动创建一个新链接。
attachments: 置于邮件报文内的附件列表。列表元素可以是 email.MIMEBase.MIMEBase 实例,也可以是(filename, content, mimetype) 三部分构成的元组。
headers: 置于邮件报文内的其他头信息(header)的字典。字典的key是头信息的名称,字典的value是头信息的值。 这样做能确保头信息的名称和对应值会以正确的格式保存于邮件报文中。
cc: 发送邮件时放于”Cc”头信息的一系列列表或元组。
reply_to:发送电子邮件时“回复”标题中使用的收件人地址列表或元组。
class EmailMessage:
"""A container for email information."""
content_subtype = 'plain'
mixed_subtype = 'mixed'
encoding = None # None => use settings default
def __init__(self, subject='', body='', from_email=None, to=None, bcc=None,
connection=None, attachments=None, headers=None, cc=None,
reply_to=None):
...省略
def send(self,fail_silently=False) :
"""
发送邮件报文。如果在构造邮件时如果指定了某个链接(connection),就会使用该链接发邮件。 否则,就会使用默认后端的实例发邮件。
如果关键字参数 fail_silently 为 True ,就会忽略邮件发送时抛出的异常。
"""
def recipients(self):
"""
返回邮件中所有收件人的列表,不管收件人是在 to 还是 bcc 属性中。
这是另一个经常被继承覆写的方法, 因为SMTP服务器在发送邮件报文时,要接收完整的收件人列表。
即使你自己的类使用其他方式来指定收件人,也仍然需要使用该方法返回收件人列表。
"""
def message(self) :
"""
构造了一个 django.core.mail.SafeMIMEText 对象 (Python的 email.MIMEText.MIMEText 类的子类) 或是 django.core.mail.SafeMIMEMultipart 对象(该对象保存即将发送出去邮件报文)。
如需扩展 EmailMessage类,一般情况下要覆写该方法,将你所需的内容添加到MIME对象中。
"""
def attach(self, filename=None, content=None, mimetype=None):
"""
传递一个单独的 email.MIMEBase.MIMEBase 实例做为参数。该实例会直接添加到最终的邮件报文中。
或者,给 attach() 传递三个参数: filename, content 和 mimetype. filename 是出现在邮件中的附件文件的名称, content 是附件的内容,而 mimetype 是附件所使用的MIME类型。
如果忽略 mimetype, Django会自动根据附件文件名来推测MIME内容类型。
例如:
message.attach('design.png', img_data, 'image/png')
"""
def attach_file(self, path, mimetype=None):
"""
使用当前文件系统下的某个文件做为附件。调用时,传入某个文件的完整路径,以及该附件的MIME类型(可选的)。
忽略MIME类型的话,Django会自动根据附件文件名来推测MIME类型。
最简单的用法如下:
message.attach_file('/images/weather_map.png')
"""
from django.http import HttpResponse
from django.core.mail import send_mail, send_mass_mail
from django.core.mail import EmailMessage
import os
def file_mail(request):
'''发送附件'''
email = EmailMessage(
'Hello',
'Body goes here',
'2833404xx@qq.com', # 发件人
['2833404xx@qq.com', 'to2@example.com'], # 收件人
['xxx@xx.com'], # cc抄送
reply_to=['another@example.com'], # “回复”标题中使用的收件人地址列表或元组
headers={'Message-ID': 'foo'},
)
cur = os.path.dirname(os.path.realpath(__file__))
# templates目录下有个a.png的图片
file1 = os.path.join(cur, "templates", "a.png")
# 方法1 attach_file
email.attach_file(file1, mimetype=None)
# 方法2 attach
file2 = os.path.join(cur, "templates", "b.png")
img_data = open(file2, "rb")
email.attach('b.png', img_data.read(), 'image/png')
email.send()
return HttpResponse('邮件发送成功,收不到就去垃圾箱找找吧!')