Мы знаем, что модуль smtplib в python используется для почтовых функций, а django инкапсулирует этот модуль, что делает его очень простым в использовании. django.core.mail — это основной модуль почты django.
Две общие функции
Он предоставляет две функции, которые очень просты в использовании:
def send_mail(subject, message, from_email, recipient_list,
fail_silently=False, auth_user=None, auth_password=None,
connection=None, html_message=None):
pass
def send_mass_mail(datatuple, fail_silently=False, auth_user=None,
auth_password=None, connection=None):
pass
# 参数介绍
# subject: 邮件主题
# message: 邮件内容
# from_email: 发件人
# recipient_list: 收件人,这是一个列表,可以有多个收件人
# 以上4个在参数 在send_mass_mail中,会写在datatuple这个元组中
# fail_silently: 是否报错,True的话表忽略异常
# auth_user&auth_password:账号密码
# connection: 表示这个的链接对象,后续会提到
# html_message: send_mail方法独有,可以比较简单地实现一个html文本的传输,具体我也没使用过,不是很了解。
В обычных условиях нам нужно настроить в настройках.Помимо хоста и порта, которые должны быть настроены, обычно мы также пишем здесь пароль учетной записи, чтобы каждый раз при вызове функции эти два параметра не нужно было передано.Когда два значения не переданы, они будут читать значение в настройке по умолчанию
Возвращаемое значение состоит в том, что несколько сообщений были успешно отправлены, а не количество лиц. Обычно используется send_mail, который возвращает 1.
# settings.py
# 我使用的是新浪的,host可以在对应邮箱的设置中找到
EMAIL_HOST = 'smtp.sina.com'
EMAIL_PORT = 25
# 你的邮箱账号与密码
EMAIL_HOST_USER = 'viptestfordjango@sina.com'
EMAIL_HOST_PASSWORD = '******'
# 由于使用25端口,一般都不使用TLS机密,SSL和TSL只需要设置一个,他们同时为True或False
EMAIL_USE_TLS = False
# 发件人,只有这个变量名可以自己自定义,设置在这里是为了减少每次去写
EMAIL_FROM = 'viptestfordjango@sina.com'
пример
from django.core.mail import send_mail, send_mass_mail
from string import lowercase,uppercase,digits
from random import randint
from project.settings import EMAIL_FROM
def send_code_email(email):
"""
发送验证码
"""
# 0-9 a-z A-z
code = ''
seeds= lowercase+uppercase+digits
length = len(seeds)
# 生成4位验证码
for i in range(4):
code += seeds[randint(0, length-1)]
send_title = '重置密码'
send_message = '你的验证码是:{0}。'.format(code)
send_status = send_mail(email_title, email_body, EMAIL_FROM, [email])
def send_hello_email(email1, email2):
"""
给email1发送 新年好
给email2发送 Happy New Year
"""
# message格式(subject, message, from_email, recipient_list)
message1 = ('新年好', '新年好', 'EMAIL_FROM', [email])
message2 = ('Happy New Year', 'Happy New Year', EMAIL_FROM, [email2])
send_status=send_mass_mail((message1, message2), fail_silently=False)
Разница между двумя функциями очевидна: send_mail отправляет одно сообщение за раз (нескольким людям), а send_mass_mail может отправлять разные сообщения (нескольким людям) одновременно.
Для более глубокого понимания предыдущее значение параметра connection увеличено в сочетании с этим параметром, фактически каждый раз, когда устанавливается соединение, send_mail отправляет только одно сообщение, а send_mass_mail устанавливает соединение, которое может отправлять несколько сообщений. , эффективность значительно выше.
Расширенные возможности
Первые две функции фактически инкапсулируют класс EmailMessage, что делает их довольно простыми в использовании, но их функции очень ограничены, например, они не могут копировать (cc) или отправлять конфиденциально (bcc) и не могут добавлять вложения (attachments)
Если вы хотите использовать только что упомянутую функцию, вы должны использовать класс EmailMessage напрямую.
EmailMessage
# 类定义
class EmailMessage(object):
def __init__(self, subject='', body='', from_email=None, to=None, bcc=None,
connection=None, attachments=None, headers=None, cc=None,
reply_to=None):
pass
# 使用
from django.core.mail import EmailMessage
email = EmailMessage(
'Hello',
'Body goes here',
'from@example.com',
['to1@example.com', 'to2@example.com'],
['bcc@example.com'],
reply_to=['another@example.com'],
headers={'Message-ID': 'foo'},
)
В этом параметре класса «cc cc», «private send bcc» и «answer_to» — все это список.
Стоит упомянуть вложения, это тоже список, элементы которого начинаются с: объекта MIMEBase или (filename, content, mimetype) этого кортежа, то есть включающего в себя отображаемое имя файла, данные файла и тип файла.
Он также предоставляет некоторые методы, в основном упоминая 2: send() для отправки электронных писем и attach() для добавления вложений.
Использовать Backend напрямую
Если мы вызовем EmailMessage.send() напрямую, как указано выше, после установления соединения будет отправлено только одно сообщение, так что, если я хочу отправить несколько сообщений?
В настоящее время нам нужно понять бэкэнд
На самом деле функция django send_email управляется бэкендом, этот класс предоставляет несколько методов:
open(): открыть соединение
close(): закрыть это соединение
send_messages (email_messages): EmailMessage, чтобы принять список объектов, а затем отправить дополнительную информацию, и EmailMessage метод send () должен вызвать этот метод, переданный параметр просто [я], есть только один объект.
Итак, на самом деле, если мы можем управлять переключением соединения, то мы можем понять, что в электронном письме отправляется несколько объектов EmailMessage.В настоящее время мы рассматриваем способ автоматического управления операциями открытия и закрытия через контекст:
from django.core import mail
with mail.get_connection() as connection:
mail.EmailMessage(
subject1, body1, from1, [to1],
connection=connection,
).send()
mail.EmailMessage(
subject2, body2, from2, [to2],
connection=connection,
).send()
Этот подход немного громоздкий, и мы определенно хотим иметь возможность использовать send_messages(), передавая ему список объектов EmailMessage напрямую. Мы заметили, что функция get_connection() в приведенном выше коде, на самом деле, может напрямую получить внутренний объект, а затем напрямую вызвать метод send_messages().
from django.core import mail
connection = mail.get_connection()
# get_EmailMessage_list返回一个EmailMessage对象的列表
messages = get_EmailMessage_list()
connection.send_messages(messages)
Это напрямую вызывает send_messages(messages), если в это время нет открытой ссылки, сначала откроется соединение, а выполнение автоматически завершится.
Это кажется немного негибким, поэтому вы также можете контролировать открытие и закрытие себя!
from django.core import mail
connection = mail.get_connection()
connection.open()
email1 = mail.EmailMessage(
'Hello',
'Body goes here',
'from@example.com',
['to1@example.com'],
connection=connection,
)
email1.send()
email2 = mail.EmailMessage(
'Hello',
'Body goes here',
'from@example.com',
['to2@example.com'],
)
email3 = mail.EmailMessage(
'Hello',
'Body goes here',
'from@example.com',
['to3@example.com'],
)
connection.send_messages([email2, email3])
connection.close()
В этом примере используется использование EmailMessage.send() и connection.send_messages(), это просто для демонстрации, и нет необходимости использовать оба одновременно.
тип бэкэнда и его настройка
Сказав так много бэкэндов, что это такое?
# 在django.core.mail。backends.smtp.下
class EmailBackend(BaseEmailBackend):
def __init__(self, host=None, port=None, username=None, password=None,
use_tls=None, fail_silently=False, use_ssl=None, timeout=None,
ssl_keyfile=None, ssl_certfile=None,**kwargs):
pass
Именно этот класс наследует BaseEmailBackend и является бэкендом по умолчанию, который управляет всем процессом отправки почты.Конечно, django также предоставляет и другие бэкенды, но эффект не очень большой.
Серверная часть консоли: пишите почту прямо на стандартный вывод.
Фиктивный бэкэнд: никакого реального эффекта.
Вам просто нужно указать свой бэкэнд в настройках:
EMAIL_BACKEND = 'django.core.mail.backends.dummy.EmailBackend'
Конечно, можно настроить и бэкенд, нужно наследовать BaseEmailBackend, и реализовать методы send_messages(email_messages), open, close, но я не думаю, что это нужно, все-таки smtp.EmailBackend предоставляет более полные функции.
послесловие
Содержание этой статьи в основном из официального документа django1.11.Текстовая часть основана на документе и вашем собственном понимании.Могут быть недоразумения.Вы можете указать.
Справочная статья:
Электронная почта с официальной документацией django1.11