Skicka e-post¶
Även om Python tillhandahåller ett gränssnitt för e-post via modulen smtplib
, tillhandahåller Django ett par lätta omslag över det. Dessa omslag tillhandahålls för att göra det extra snabbt att skicka e-post, för att hjälpa till att testa e-postsändning under utveckling och för att ge stöd för plattformar som inte kan använda SMTP.
Koden finns i modulen django.core.mail
.
Snabba exempel¶
Använd send_mail()
för att skicka e-post på ett enkelt sätt. Till exempel, för att skicka ett vanligt textmeddelande:
from django.core.mail import send_mail
send_mail(
"Subject here",
"Here is the message.",
"from@example.com",
["to@example.com"],
fail_silently=False,
)
Om du behöver ytterligare funktioner för att skicka e-post använder du EmailMessage
eller EmailMultiAlternatives
. Om du t.ex. vill skicka ett flerdelat e-postmeddelande som innehåller både HTML- och klartextversioner med en specifik mall och anpassade rubriker kan du använda följande metod:
from django.core.mail import EmailMultiAlternatives
from django.template.loader import render_to_string
# First, render the plain text content.
text_content = render_to_string(
"templates/emails/my_email.txt",
context={"my_variable": 42},
)
# Secondly, render the HTML content.
html_content = render_to_string(
"templates/emails/my_email.html",
context={"my_variable": 42},
)
# Then, create a multipart email instance.
msg = EmailMultiAlternatives(
"Subject here",
text_content,
"from@example.com",
["to@example.com"],
headers={"List-Unsubscribe": "<mailto:unsub@example.com>"},
)
# Lastly, attach the HTML content to the email instance and send.
msg.attach_alternative(html_content, "text/html")
msg.send()
E-post skickas via den SMTP-värd och port som anges i inställningarna EMAIL_HOST
och EMAIL_PORT
. Inställningarna EMAIL_HOST_USER
och EMAIL_HOST_PASSWORD
, om de är angivna, används för att autentisera SMTP-servern och inställningarna EMAIL_USE_TLS
och EMAIL_USE_SSL
kontrollerar om en säker anslutning används.
Observera
Teckenuppsättningen för e-post som skickas med django.core.mail
kommer att ställas in till värdet för din DEFAULT_CHARSET
-inställning.
`sänd_mail()`
¶
- send_mail(subject, message, from_email, recipient_list, fail_silently=False, auth_user=None, auth_password=None, connection=None, html_message=None)[source]¶
I de flesta fall kan du skicka e-post med hjälp av django.core.mail.send_mail()
.
Parametrarna `subject
, message
, from_email
och recipient_list
är obligatoriska.
subject
: En sträng.meddelande
: En sträng.from_email
: En sträng. OmNone
, kommer Django att använda värdet av inställningenDEFAULT_FROM_EMAIL
.mottagare_lista
: En lista med strängar, var och en en e-postadress. Varje medlem irecipient_list
kommer att se de andra mottagarna i fältet ”To:” i e-postmeddelandet.fail_silently
: En boolean. När den ärFalse
kommer`send_mail()
att ge upphov till ettsmtplib.SMTPException
om ett fel uppstår. Sesmtplib
-dokumenten för en lista över möjliga undantag, som alla är underklasser tillSMTPException
.auth_user
: Det valfria användarnamnet som ska användas för att autentisera sig mot SMTP-servern. Om detta inte anges kommer Django att använda värdet för inställningenEMAIL_HOST_USER
.auth_password
: Det valfria lösenordet som ska användas för att autentisera sig mot SMTP-servern. Om detta inte anges kommer Django att använda värdet för inställningenEMAIL_HOST_PASSWORD
.anslutning
: Den valfria e-postbackend som ska användas för att skicka e-post. Om inget anges kommer en instans av standardbackend att användas. Se dokumentationen på Email backends för mer information.html_message
: Omhtml_message
anges kommer det resulterande e-postmeddelandet att vara ett e-postmeddelande av typen multipart/alternative medmessage
som innehållstyp av typen text/plain ochhtml_message
som innehållstyp av typen text/html.
Returvärdet är antalet framgångsrikt levererade meddelanden (som kan vara 0
eller 1
eftersom det bara kan skicka ett meddelande).
sänd_mass_mail()
¶
- send_mass_mail(datatuple, fail_silently=False, auth_user=None, auth_password=None, connection=None)[source]¶
django.core.mail.send_mass_mail()
är avsedd att hantera massutskick av e-post.
datatuple
är en tupel där varje element är i detta format:
(subject, message, from_email, recipient_list)
fail_silently
, auth_user
and auth_password
have the same functions
as in send_mail()
.
Each separate element of datatuple
results in a separate email message.
As in send_mail()
, recipients in the same
recipient_list
will all see the other addresses in the email messages’
”To:” field.
Exempelvis skulle följande kod skicka två olika meddelanden till två olika uppsättningar mottagare, men endast en anslutning till e-postservern skulle öppnas:
message1 = (
"Subject here",
"Here is the message",
"from@example.com",
["first@example.com", "other@example.com"],
)
message2 = (
"Another Subject",
"Here is another message",
"from@example.com",
["second@test.com"],
)
send_mass_mail((message1, message2), fail_silently=False)
Returvärdet är antalet framgångsrikt levererade meddelanden.
`send_mass_mail()
vs. send_mail()
¶
The main difference between send_mass_mail()
and
send_mail()
is that
send_mail()
opens a connection to the mail server
each time it’s executed, while send_mass_mail()
uses
a single connection for all of its messages. This makes
send_mass_mail()
slightly more efficient.
mail_admins()
¶
django.core.mail.mail_admins()
är en genväg för att skicka ett e-postmeddelande till webbplatsadministratörerna, enligt definitionen i inställningen ADMINS
.
mail_admins()
prefixar ämnet med värdet på inställningen EMAIL_SUBJECT_PREFIX
, som är "[Django]"
som standard.
”From:”-rubriken i e-postmeddelandet kommer att vara värdet för inställningen SERVER_EMAIL
.
Denna metod finns för enkelhetens och läsbarhetens skull.
Om html_message
anges kommer det resulterande e-postmeddelandet att vara ett multipart/alternative e-postmeddelande med message
som innehållstyp text/plain och html_message
som innehållstyp text/html.
mail_managers()`
¶
django.core.mail.mail_managers()
är precis som mail_admins()
, förutom att den skickar ett e-postmeddelande till webbplatsansvariga, enligt definitionen i inställningen MANAGERS
.
Exempel¶
Detta skickar ett enda e-postmeddelande till john@example.com och jane@example.com, där de båda visas i ”Till:”:
send_mail(
"Subject",
"Message.",
"from@example.com",
["john@example.com", "jane@example.com"],
)
Detta skickar ett meddelande till john@example.com och jane@example.com, och de får båda ett separat e-postmeddelande:
datatuple = (
("Subject", "Message.", "from@example.com", ["john@example.com"]),
("Subject", "Message.", "from@example.com", ["jane@example.com"]),
)
send_mass_mail(datatuple)
Förhindra injektion av rubrik¶
Header injection är en säkerhetsbrist som innebär att en angripare infogar extra e-postrubriker för att styra ”To:” och ”From:” i e-postmeddelanden som dina skript genererar.
The Django email functions outlined above all protect against header injection
by forbidding newlines in header values. If any subject
, from_email
or
recipient_list
contains a newline (in either Unix, Windows or Mac style),
the email function (e.g. send_mail()
) will raise
django.core.mail.BadHeaderError
(a subclass of ValueError
) and, hence,
will not send the email. It’s your responsibility to validate all data before
passing it to the email functions.
Om ett message
innehåller rubriker i början av strängen skrivs rubrikerna ut som första bit i e-postmeddelandet.
Här är ett exempel på en vy som tar ett ”subject”, ”message” och ”from_email” från POST-data, skickar det till admin@example.com och omdirigerar till ”/contact/thanks/” när det är klart:
from django.core.mail import BadHeaderError, send_mail
from django.http import HttpResponse, HttpResponseRedirect
def send_email(request):
subject = request.POST.get("subject", "")
message = request.POST.get("message", "")
from_email = request.POST.get("from_email", "")
if subject and message and from_email:
try:
send_mail(subject, message, from_email, ["admin@example.com"])
except BadHeaderError:
return HttpResponse("Invalid header found.")
return HttpResponseRedirect("/contact/thanks/")
else:
# In reality we'd use a form class
# to get proper validation errors.
return HttpResponse("Make sure all fields are entered and valid.")
Klassen ”E-postmeddelande¶
Django’s send_mail()
and
send_mass_mail()
functions are actually thin
wrappers that make use of the EmailMessage
class.
Not all features of the EmailMessage
class are
available through the send_mail()
and related
wrapper functions. If you wish to use advanced features, such as BCC’ed
recipients, file attachments, or multi-part email, you’ll need to create
EmailMessage
instances directly.
Observera
This is a design feature. send_mail()
and
related functions were originally the only interface Django provided.
However, the list of parameters they accepted was slowly growing over
time. It made sense to move to a more object-oriented design for email
messages and retain the original functions only for backwards
compatibility.
EmailMessage
är ansvarig för att skapa själva e-postmeddelandet. :ref:email backend <topic-email-backends>
är sedan ansvarig för att skicka e-postmeddelandet.
För enkelhetens skull tillhandahåller EmailMessage
en send()
-metod för att skicka ett enda e-postmeddelande. Om du behöver skicka flera meddelanden tillhandahåller API:et för e-postbackend :ref:` ett alternativ <topics-sending-multiple-emails>`.
objekten EmailMessage
¶
Klassen EmailMessage
initialiseras med följande parametrar (i angiven ordning, om positionella argument används). Alla parametrar är valfria och kan ställas in när som helst innan du anropar metoden send()
.
subject
: Ämnesraden för e-postmeddelandet.kropp
: Texten i brödtexten. Detta bör vara ett vanligt textmeddelande.from_email
: Avsändarens adress. Bådefred@example.com
och"Fred" <fred@example.com>
är lagliga former. Om den utelämnas används inställningenDEFAULT_FROM_EMAIL
.till
: En lista eller tupel av mottagaradresser.bcc
: En lista eller tupel av adresser som används i ”Bcc”-rubriken när e-postmeddelandet skickas.anslutning
: En :ref:email backend <topic-email-backends>
instans. Använd denna parameter om du skickarEmailMessage
viasend()
och du vill använda samma anslutning för flera meddelanden. Om den utelämnas skapas en ny anslutning närsend()
anropas. Denna parameter ignoreras när du använder send_messages().attachments
: En lista med bilagor som ska läggas till meddelandet. Dessa kan vara instanser avMIMEBase
ellerEmailAttachment
, eller en tupel med attributen(filnamn, innehåll, mimetype)
.Changed in Django 5.2:Stöd för
EmailAttachment
-objekt iattachments
har lagts till.headers
: En ordbok med extra rubriker som ska läggas till meddelandet. Nycklarna är rubriknamnet, värdena är rubrikvärdena. Det är upp till den som anropar att se till att rubriknamn och värden är i rätt format för ett e-postmeddelande. Motsvarande attribut ärextra_headers
.cc
: En lista eller tupel av mottagaradresser som används i ”Cc”-rubriken när e-postmeddelandet skickas.reply_to
: En lista eller tupel av mottagaradresser som används i ”Reply-To”-rubriken när e-postmeddelandet skickas.
Till exempel:
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"},
)
Klassen har följande metoder:
send(fail_silently=False)
skickar meddelandet. Om en anslutning angavs när e-postmeddelandet konstruerades kommer den anslutningen att användas. Annars kommer en instans av standardbackend att instansieras och användas. Om nyckelordsargumentetfail_silently
ärTrue
, kommer undantag som uppkommer när meddelandet skickas att kväsas. En tom lista över mottagare kommer inte att ge upphov till något undantag. Det kommer att returnera1
om meddelandet skickades framgångsrikt, annars0
.message()
konstruerar ettdjango.core.mail.SafeMIMEText
-objekt (en underklass av PythonsMIMEText
-klass) eller ettdjango.core.mail.SafeMIMEMultipart
-objekt som innehåller det meddelande som ska skickas. Om du någonsin behöver utökaEmailMessage
-klassen, kommer du förmodligen att vilja åsidosätta den här metoden för att lägga in det innehåll du vill ha i MIME-objektet.recipients()
returnerar en lista över alla mottagare av meddelandet, oavsett om de är registrerade i attributento
,cc
ellerbcc
. Detta är en annan metod som du kan behöva åsidosätta när du underklassar, eftersom SMTP-servern måste få veta hela listan över mottagare när meddelandet skickas. Om du lägger till ett annat sätt att ange mottagare i din klass, måste de också returneras från den här metoden.attach()
skapar en ny filbilaga och lägger till den i meddelandet. Det finns två sätt att anropaattach()
:Du kan skicka ett enda argument till den som är en
MIMEBase
-instans. Denna kommer att infogas direkt i det resulterande meddelandet.Alternativt kan du skicka tre argument till
attach()
:filnamn
,innehåll
ochmimetype
.filnamn
är namnet på den bifogade filen som den kommer att visas i e-postmeddelandet,innehåll
är de data som kommer att finnas i den bifogade filen ochmimetype
är den valfria MIME-typen för den bifogade filen. Om du utelämnarmimetype
kommer MIME-innehållstypen att gissas från filnamnet på bilagan.Till exempel:
message.attach("design.png", img_data, "image/png")
Om du anger en
mimetype
av message/rfc822, kommer den också att accepteradjango.core.mail.EmailMessage
ochemail.message.Message
.För en
mimetype
som börjar med text/ förväntas innehållet vara en sträng. Binära data kommer att avkodas med UTF-8, och om det misslyckas kommer MIME-typen att ändras till application/octet-stream och data kommer att bifogas oförändrat.Dessutom kommer message/rfc822 bilagor inte längre att base64-kodas i strid med RFC 2046 Section 5.2.1, vilket kan orsaka problem med att visa bilagorna i Evolution och Thunderbird.
attach_file()
skapar en ny bilaga med hjälp av en fil från ditt filsystem. Anropa den med sökvägen till filen som ska bifogas och, eventuellt, MIME-typen som ska användas för bilagan. Om MIME-typen utelämnas kommer den att gissas från filnamnet. Du kan använda den så här:message.attach_file("/images/weather_map.png")
För MIME-typer som börjar med text/ hanteras binära data på samma sätt som i
attach()
.
- class EmailAttachment¶
- New in Django 5.2.
En namngiven tupel för att lagra bilagor till ett e-postmeddelande.
Den namngivna tupeln har följande index:
filnamn
innehåll
mimetype
Skicka alternativa innehållstyper¶
Skicka flera versioner av innehållet¶
Det kan vara användbart att inkludera flera versioner av innehållet i ett e-postmeddelande; det klassiska exemplet är att skicka både text- och HTML-versioner av ett meddelande. Med Djangos e-postbibliotek kan du göra detta med hjälp av klassen EmailMultiAlternatives
.
- class EmailMultiAlternatives[source]¶
En underklass till
EmailMessage
som tillåter ytterligare versioner av meddelandetexten i e-postmeddelandet via metodenattach_alternative()
. Denna ärver direkt alla metoder (inklusive klassinitialiseringen) frånEmailMessage
.- alternatives¶
En lista med
EmailAlternative
namngivna tuples. Detta är särskilt användbart i tester:self.assertEqual(len(msg.alternatives), 1) self.assertEqual(msg.alternatives[0].content, html_content) self.assertEqual(msg.alternatives[0].mimetype, "text/html")
Alternativ bör endast läggas till med hjälp av metoden
attach_alternative()
eller skickas till konstruktören.Changed in Django 5.2:I äldre versioner var
alternatives
en lista med vanliga tupler, till skillnad frånEmailAlternative
namngivna tupler.
- attach_alternative(content, mimetype)[source]¶
Bifoga en alternativ representation av meddelandetexten i e-postmeddelandet.
Om du t.ex. vill skicka en kombination av text och HTML kan du skriva:
from django.core.mail import EmailMultiAlternatives subject = "hello" from_email = "from@example.com" to = "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()
- body_contains(text)[source]¶
- New in Django 5.2.
Returnerar ett booleskt värde som anger om den angivna
texten
finns med i e-postmeddelandetsbody
och i alla bifogade alternativ av MIME-typentext/*
.Detta kan vara användbart när du testar e-postmeddelanden. Till exempel:
def test_contains_email_content(self): subject = "Hello World" from_email = "from@example.com" to = "to@example.com" msg = EmailMultiAlternatives(subject, "I am content.", from_email, [to]) msg.attach_alternative("<p>I am content.</p>", "text/html") self.assertIs(msg.body_contains("I am content"), True) self.assertIs(msg.body_contains("<p>I am content.</p>"), False)
- class EmailAlternative¶
- New in Django 5.2.
En namngiven tupel för att lagra alternativa versioner av e-postinnehåll.
Den namngivna tupeln har följande index:
innehåll
mimetype
Uppdatering av standardinnehållstypen¶
Som standard är MIME-typen för parametern body
i ett EmailMessage
"text/plain"
. Det är god praxis att låta detta vara, eftersom det garanterar att alla mottagare kommer att kunna läsa e-postmeddelandet, oavsett deras e-postklient. Men om du är säker på att dina mottagare kan hantera en alternativ innehållstyp kan du använda attributet content_subtype
på EmailMessage
-klassen för att ändra huvudinnehållstypen. Huvudtypen kommer alltid att vara "text"
, men du kan ändra subtypen. Till exempel:
msg = EmailMessage(subject, html_content, from_email, [to])
msg.content_subtype = "html" # Main content is now text/html
msg.send()
Backend för e-post¶
Själva sändningen av ett e-postmeddelande hanteras av e-postbackend.
Klassen för e-postbackend har följande metoder:
open()
instansierar en långlivad anslutning för e-postsändning.close()
stänger den aktuella anslutningen för e-postsändning.`send_messages(email_messages)
skickar en lista medEmailMessage
-objekt. Om anslutningen inte är öppen kommer detta anrop att implicit öppna anslutningen och stänga anslutningen efteråt. Om anslutningen redan är öppen kommer den att lämnas öppen efter att mailet har skickats.
Den kan också användas som en kontexthanterare, som automatiskt anropar open()
och close()
efter behov:
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()
Hämta en instans av en e-postbackend¶
The get_connection()
function in django.core.mail
returns an
instance of the email backend that you can use.
Som standard kommer ett anrop till get_connection()
att returnera en instans av den e-postbackend som anges i EMAIL_BACKEND
. Om du anger argumentet backend
kommer en instans av den backend att instansieras.
Argumentet fail_silently
styr hur backend ska hantera fel. Om fail_silently
är True, kommer undantag under e-postsändningsprocessen att ignoreras tyst.
Alla andra nyckelordsargument skickas direkt till konstruktören för e-postbackend.
Django levereras med flera backends för att skicka e-post. Med undantag för SMTP-backend (som är standard) är dessa backends endast användbara under testning och utveckling. Om du har speciella krav på att skicka e-post kan du skriva din egen e-postbackend.
SMTP-backend¶
- class backends.smtp.EmailBackend(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)¶
Detta är standardbackend. E-post kommer att skickas via en SMTP-server.
Värdet för varje argument hämtas från den matchande inställningen om argumentet är
None
:username
: :inställning:`EMAIL_HOST_USER`password
: :inställning:`EMAIL_HOST_PASSWORD`use_tls
: :inställning:`EMAIL_USE_TLS``use_ssl
: :inställning:`EMAIL_USE_SSL``timeout
: :inställning:`EMAIL_TIMEOUT``ssl_keyfile
: :inställning:`EMAIL_SSL_KEYFILE`ssl_certfile
: :inställning:`EMAIL_SSL_CERTFILE``
SMTP-backend är standardkonfigurationen som ärvs av Django. Om du vill ange det uttryckligen lägger du till följande i dina inställningar:
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
Om inget anges kommer standard
timeout
att vara den som tillhandahålls avsocket.getdefaulttimeout()
, som har standardvärdetNone
(ingen timeout).
Backend för konsol¶
Istället för att skicka ut riktiga e-postmeddelanden skriver konsolbackend bara de e-postmeddelanden som skulle skickas till standardutmatningen. Som standard skriver konsolbackend till stdout
. Du kan använda ett annat strömliknande objekt genom att ange nyckelordsargumentet stream
när du konstruerar anslutningen.
För att ange denna backend, lägg till följande i dina inställningar:
EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"
Denna backend är inte avsedd att användas i produktion - den tillhandahålls som en bekvämlighet som kan användas under utveckling.
Backend för filer¶
The file backend writes emails to a file. A new file is created for each new
session that is opened on this backend. The directory to which the files are
written is either taken from the EMAIL_FILE_PATH
setting or from
the file_path
keyword when creating a connection with
get_connection()
.
För att ange denna backend, lägg till följande i dina inställningar:
EMAIL_BACKEND = "django.core.mail.backends.filebased.EmailBackend"
EMAIL_FILE_PATH = "/tmp/app-messages" # change this to a proper location
Denna backend är inte avsedd att användas i produktion - den tillhandahålls som en bekvämlighet som kan användas under utveckling.
Backend i minnet¶
Backend 'locmem
lagrar meddelanden i ett speciellt attribut i modulen django.core.mail
. Attributet outbox
skapas när det första meddelandet skickas. Det är en lista med en EmailMessage
-instans för varje meddelande som skulle skickas.
För att ange denna backend, lägg till följande i dina inställningar:
EMAIL_BACKEND = "django.core.mail.backends.locmem.EmailBackend"
Denna backend är inte avsedd att användas i produktion - den tillhandahålls som en bekvämlighet som kan användas under utveckling och testning.
Djangos testlöpare använder automatiskt denna backend för testning.
Dummy backend¶
Som namnet antyder gör dummy-backend ingenting med dina meddelanden. För att ange denna backend, lägg till följande i dina inställningar:
EMAIL_BACKEND = "django.core.mail.backends.dummy.EmailBackend"
Denna backend är inte avsedd att användas i produktion - den tillhandahålls som en bekvämlighet som kan användas under utveckling.
Definiera en anpassad backend för e-post¶
Om du behöver ändra hur e-postmeddelanden skickas kan du skriva din egen e-postbackend. Inställningen EMAIL_BACKEND
i din inställningsfil är sedan Python-importsökvägen för din backend-klass.
Anpassade e-postbackends bör underordna sig BaseEmailBackend
som finns i modulen django.core.mail.backends.base
. En anpassad e-postbackend måste implementera metoden `send_messages(email_messages)
. Denna metod tar emot en lista med EmailMessage
-instanser och returnerar antalet framgångsrikt levererade meddelanden. Om din backend har något koncept för en ihållande session eller anslutning bör du också implementera metoderna open()
och close()
. Referera till smtp.EmailBackend
för en referensimplementering.
Skicka flera e-postmeddelanden¶
Att upprätta och stänga en SMTP-anslutning (eller någon annan nätverksanslutning för den delen) är en dyr process. Om du har många e-postmeddelanden att skicka är det klokt att återanvända en SMTP-anslutning i stället för att skapa och förstöra en anslutning varje gång du vill skicka ett e-postmeddelande.
Det finns två sätt att tala om för en e-postbackend att den ska återanvända en anslutning.
För det första kan du använda metoden send_messages()
på en anslutning. Detta tar en lista över EmailMessage
(eller underklass) instanser, och skickar dem alla med hjälp av den enda anslutningen. Som en konsekvens ignoreras alla connection
som anges för ett enskilt meddelande.
Om du till exempel har en funktion som heter get_notification_email()
som returnerar en lista med EmailMessage
-objekt som representerar några periodiska e-postmeddelanden som du vill skicka ut, kan du skicka dessa e-postmeddelanden med ett enda anrop till send_messages:
from django.core import mail
connection = mail.get_connection() # Use default email connection
messages = get_notification_email()
connection.send_messages(messages)
I det här exemplet öppnar anropet till send_messages()
en anslutning på backend, skickar listan med meddelanden och stänger sedan anslutningen igen.
Det andra tillvägagångssättet är att använda metoderna open()
och close()
på e-postbackend för att manuellt styra anslutningen. send_messages()
öppnar eller stänger inte anslutningen manuellt om den redan är öppen, så om du öppnar anslutningen manuellt kan du styra när den ska stängas. Till exempel:
from django.core import mail
connection = mail.get_connection()
# Manually open the connection
connection.open()
# Construct an email message that uses the connection
email1 = mail.EmailMessage(
"Hello",
"Body goes here",
"from@example.com",
["to1@example.com"],
connection=connection,
)
email1.send() # Send the email
# Construct two more messages
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"],
)
# Send the two emails in a single call -
connection.send_messages([email2, email3])
# The connection was already open so send_messages() doesn't close it.
# We need to manually close the connection.
connection.close()
Konfigurera e-post för utveckling¶
Det finns tillfällen då man inte vill att Django ska skicka e-post överhuvudtaget. Till exempel när du utvecklar en webbplats vill du förmodligen inte skicka ut tusentals e-postmeddelanden - men du kanske vill validera att e-postmeddelanden kommer att skickas till rätt personer under rätt förhållanden och att dessa e-postmeddelanden innehåller rätt innehåll.
Det enklaste sättet att konfigurera e-post för lokal utveckling är att använda e-postbackend :ref:console <topic-email-console-backend>`. Denna backend omdirigerar all e-post till ``stdout
, så att du kan inspektera innehållet i e-postmeddelanden.
E-postbackend :ref:``file <topic-email-file-backend>` kan också vara användbar under utvecklingsarbetet - den här backend-enheten dumpar innehållet i varje SMTP-anslutning till en fil som kan inspekteras när du vill.
En annan metod är att använda en ”dum” SMTP-server som tar emot e-postmeddelanden lokalt och visar dem på terminalen, men som faktiskt inte skickar något. Paketet aiosmtpd tillhandahåller ett sätt att åstadkomma detta:
python -m pip install aiosmtpd
python -m aiosmtpd -n -l localhost:8025
Detta kommando startar en minimal SMTP-server som lyssnar på port 8025 på localhost. Den här servern skriver ut alla e-postrubriker och e-posttexten till standardutdata. Du behöver sedan bara ställa in EMAIL_HOST
och EMAIL_PORT
i enlighet med detta. För en mer detaljerad diskussion om SMTP-serveralternativ, se dokumentationen för modulen aiosmtpd.
Information om hur du enhetstestar e-postmeddelanden i din applikation finns i avsnittet E-posttjänster i testdokumentationen.