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
och auth_password
har samma funktioner som i send_mail()
.
Varje separat element i datatuple
resulterar i ett separat e-postmeddelande. Precis som i send_mail()
kommer mottagare i samma recipient_list
att se de andra adresserna i e-postmeddelandets ”To:”-fält.
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()
¶
Den största skillnaden mellan send_mass_mail()
och send_mail()
är att send_mail()
öppnar en anslutning till e-postservern varje gång den körs, medan send_mass_mail()
använder en enda anslutning för alla sina meddelanden. Detta gör send_mass_mail()
något mer effektiv.
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.
De Django-e-postfunktioner som beskrivs ovan skyddar alla mot header injection genom att förbjuda nya rader i header-värden. Om något `subject
, from_email
eller recipient_list
innehåller en ny rad (i antingen Unix-, Windows- eller Mac-stil), kommer e-postfunktionen (t.ex. send_mail()
) att höja django.core.mail.BadHeaderError
(en underklass av ValueError
) och kommer därför inte att skicka e-postmeddelandet. Det är ditt ansvar att validera alla data innan du skickar dem till e-postfunktionerna.
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¶
Djangos funktioner send_mail()
och send_mass_mail()
är egentligen tunna omslag som använder sig av klassen EmailMessage
.
Inte alla funktioner i klassen EmailMessage
är tillgängliga via send_mail()
och relaterade omslagsfunktioner. Om du vill använda avancerade funktioner, t.ex. BCC-mottagare, filbilagor eller flerdelade e-postmeddelanden, måste du skapa EmailMessage
-instanser direkt.
Observera
Detta är en designfunktion. send_mail()
och relaterade funktioner var ursprungligen det enda gränssnittet som Django tillhandahöll. Men listan över parametrar som de accepterade växte långsamt över tiden. Det var vettigt att gå över till en mer objektorienterad design för e-postmeddelanden och behålla de ursprungliga funktionerna endast för bakåtkompatibilitet.
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¶
Funktionen get_connection()
i django.core.mail
returnerar en instans av e-postbackend som du kan använda.
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¶
Filbackend skriver e-postmeddelanden till en fil. En ny fil skapas för varje ny session som öppnas på denna backend. Katalogen som filerna skrivs till hämtas antingen från inställningen EMAIL_FILE_PATH
eller från nyckelordet file_path
när du skapar en anslutning med 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.