gids · smtp python

Hoe implementeert een productteam SMTP met Python op een veilige manier?

Implementeer SMTP in Python vanuit een geautoriseerde achtergrondworker, niet direct vanuit een webrequest. Stel het bericht op met EmailMessage, gebruik SMTP_SSL voor impliciete TLS of schakel expliciet over met STARTTLS wanneer het actuele contract van de provider dat vereist, authenticeer met een server-side secret en roep send_message aan met begrensde timeouts. Sla de job op voordat je verbinding maakt, leg bewijs van weigering per ontvanger vast, reconcilieer onduidelijke verbroken verbindingen en maak onderscheid tussen SMTP-acceptatie en latere bezorging en inboxplaatsing.

Autoriseer en sla de verzending op vóór SMTP

Begin met een legitiem applicatie-event, zoals een ontvangstbewijs, een beveiligingsmelding, een aangevraagde verificatie of een accountmelding. Authenticeer de aanroeper en autoriseer de tenant, berichtklasse, zichtbare From-identiteit, ontvanger en templaterevisie. Schrijf een duurzame uitgaande job met een stabiele sleutel voor het bedrijfsevent voordat je een SMTP-verbinding opent. Die sleutel moet voorkomen dat twee workers onafhankelijk van elkaar hetzelfde logische bericht aanmaken. Invoer vanuit de browser mag niet bepalen welke SMTP-host, poort, gebruikersnaam, envelope-afzender, willekeurige ontvangers, headers of welk TLS-beleid worden gebruikt. Houd die waarden in gecontroleerde serverconfiguratie. Een queue worker claimt één job, controleert op het moment van verzenden opnieuw suppressies en autorisatie, legt elke poging vast en geeft de job vrij of rondt hem af via expliciete toestanden. De SMTP-bibliotheek van Python transporteert het voorbereide bericht; ze levert geen tenantautorisatie, toestemming, idempotentie of suppressiebeleid.

Stel het bericht op met EmailMessage

Gebruik email.message.EmailMessage in plaats van ruwe headers en bodies aan elkaar te plakken. Stel From, To, Subject, Date en een gegenereerde Message-ID in volgens het goedgekeurde model van de applicatie, en gebruik daarna set_content voor tekst en add_alternative voor HTML wanneer nodig. Valideer adresobjecten, begrens het aantal ontvangers en bijlagen, weiger newline-injectie in waarden en escape templategegevens voor de uitvoercontext. Genereer zowel tekst als HTML uit één onveranderlijke templaterevisie. Houd secrets en onnodige persoonsgegevens buiten onderwerpregels, aangepaste headers, bestandsnamen, diagnostische velden en logs. Scheid de zichtbare From-header bewust van de SMTP-envelope-afzender, omdat authenticatie en bounceverwerking van verschillende identiteiten kunnen afhangen. Bewaar een inhoudsrevisie of een privacyveilige hash voor audit in plaats van volledige berichtinhoud te bewaren zonder gedefinieerde noodzaak.

Kies expliciet voor impliciete TLS of STARTTLS

Python documenteert SMTP_SSL voor verbindingen die vanaf het begin versleuteld zijn en SMTP.starttls om een bestaande verbinding te upgraden. Volg de actuele hostnaam, poort, certificaat en het submissioncontract van de provider in plaats van te gokken op basis van een algemene lijst met poorten. Maak een geverifieerde standaard-SSL-context en schakel certificaat- of hostnaamcontroles niet uit. Maak bij STARTTLS verbinding, stuur zo nodig EHLO, roep starttls aan met de context en stuur daarna opnieuw EHLO, omdat de aangeboden extensies na de upgrade kunnen veranderen. Verstuur nooit credentials of berichtinhoud van klanten over een onversleutelde verbinding. RFC 8314 beveelt met TLS beveiligde submission aan en markeert onversleutelde toegang als verouderd. Behandel certificaatfouten, een afwijkende hostnaam, een ontbrekende vereiste STARTTLS of onverwachte veranderingen in mogelijkheden als harde fouten die onderzoek vereisen, in plaats van stilzwijgend terug te vallen.

Houd SMTP-credentials binnen een smalle secretgrens

Laad de gebruikersnaam en het wachtwoord of token tijdens runtime uit een beheerde server-side secretvoorziening. Zet credentials niet in broncode, clientbundels, omgevingsdumps, URL's, exception traces, analytics, notebooks, screenshots, prompts of gecommitte fixtures. Beperk elke credential tot de kleinste omgeving en workload die de provider ondersteunt, en scheid ontwikkeling van productie. Authenticeer pas nadat de vereiste TLS-toestand tot stand is gebracht. Oefen rotatie met gecontroleerde ontvangers: richt de vervanging in via goedgekeurd beheer, werk de worker bij, bevestig authenticatie en een volledige eventlevenscyclus en trek daarna de oude waarde in. Herhaalde authenticatiefouten moeten de betreffende route pauzeren in plaats van een snelle retry-lus te starten. De login-methode van Python onderhandelt tussen de mechanismen die de server aanbiedt, maar het werkelijke mechanisme, het accountbeleid, de tokenrechten en het rotatiegedrag van de provider vereisen actueel bewijs.

Gebruik een begrensde verzendfunctie in Python

Houd de provideradapter klein en geef gestructureerd bewijs terug aan de toestandsmachine van de job. Een typische flow maakt een SSL-context, opent SMTP_SSL(host, port, timeout=10) as smtp voor impliciete TLS, roept smtp.login(username, secret) aan en roept daarna smtp.send_message(message, from_addr=envelope_from, to_addrs=recipients) aan. Voor een provider die een expliciete upgrade vereist, gebruik je SMTP met een timeout, ehlo, starttls(context=context), ehlo en daarna login. Presenteer voorbeeldhostnamen of -poorten niet als universele standaardwaarden. Geef een genormaliseerde lijst met ontvangers door in plaats van te vertrouwen op het parsen van onbetrouwbare headers. Leg de exceptionklasse, de SMTP-antwoordcode en begrensde diagnostische tekst vast wanneer beschikbaar, maar verwijder adressen, credentials en berichtinhoud. Meet de fasen verbinding, TLS, authenticatie, envelope, data en quit afzonderlijk, zodat operationele fouten te diagnosticeren blijven.

Interpreteer de ontvangerresultaten van send_message nauwkeurig

Python documenteert dat sendmail en send_message normaal terugkeren wanneer mail voor ten minste één ontvanger is geaccepteerd, en een dictionary teruggeven voor geweigerde ontvangers; een lege dictionary betekent dat in die fase geen enkele ontvanger is geweigerd. Bewaar dat resultaat per ontvanger in plaats van de hele job als afgeleverd te markeren. Als alle ontvangers worden geweigerd, gooit de bibliotheek een SMTPRecipientsRefused-exception. Andere exceptions onderscheiden weigering van de afzender, weigering van DATA, authenticatie-, verbindings- en protocolfouten en verwante fouten. Vertaal het exacte bewijs naar applicatietoestanden: geaccepteerd door de submissionserver, permanent geweigerd, tijdelijk geweigerd of onbekend. Een normale terugkeer bewijst alleen het afgebakende resultaat van de SMTP-submission. Het stelt geen acceptatie door de bestemmingsserver, uiteindelijke plaatsing in de mailbox, lezen of engagement vast. Latere delivery status notifications of provider-events moeten afzonderlijk worden gecorreleerd.

Probeer alleen opnieuw wanneer het risico op duplicaten beheerst is

Classificeer fouten voordat je een nieuwe poging plant. Permanente fouten in adres, afzender, authenticatie, beleid of inhoud vereisen meestal correctie of suppressie in plaats van geautomatiseerde herhaling. Tijdelijke 4xx-antwoorden kunnen opnieuw worden geprobeerd met exponential backoff, jitter, een maximum aantal pogingen, een vervaltijd en een budget per bestemming. Een verbroken verbinding of timeout na het versturen van de berichtdata kan onduidelijk zijn: de server kan het bericht hebben geaccepteerd terwijl de client het definitieve antwoord heeft gemist. Houd die poging op onbekend, inspecteer de activiteit bij de provider of latere events via privacyveilige correlatie en vermijd een directe blinde herhaling. SMTP heeft geen universele idempotentiesleutel voor applicaties. De duurzame sleutel voor het bedrijfsevent voorkomt gelijktijdige pogingen vanuit de applicatie, maar kan een externe SMTP-server niet dwingen twee geaccepteerde indieningen te dedupliceren. Escaleer herhaalde onduidelijke uitkomsten en bewaar het exacte bewijs waarop de beslissing is gebaseerd.

Verwerk gedeeltelijke ontvangers en suppressies

Wanneer een bericht meerdere ontvangers heeft, kan SMTP sommige accepteren en andere weigeren. Sla het antwoord per ontvanger op en zet alleen de geaccepteerde subset door naar de volgende toestand. Verstuur niet opnieuw naar de hele oorspronkelijke lijst alleen omdat één adres een tijdelijke weigering kreeg. Pas suppressies voor permanente bounces, klachten, afmeldingen, juridische redenen, tenants en beheerders toe vóór elke poging, inclusief retries. Scheid berichtklassen alleen via een expliciet gedocumenteerd beleid; een bericht als transactioneel labelen heft de veiligheid van ontvangers of de beperkingen van de provider niet op. Geef bij gevoelige workflows de voorkeur aan jobs met één ontvanger wanneer privacy en een individuele status de kosten rechtvaardigen. Voorkom dat ontvangerslijsten zichtbaar worden via To of Cc, en gebruik Bcc-gedrag nooit als vervanging voor autorisatie. Beperk en anonimiseer diagnostische tekst, want SMTP-antwoorden kunnen adressen van ontvangers of ontvangerspecifieke details bevatten.

Test foutpaden met gecontroleerde systemen

Test het opstellen van berichten, Unicode, tekst- en HTML-alternatieven, bijlagen, weigering van headers, normalisatie van ontvangers, TLS-verificatie, ontbrekende STARTTLS, ongeldige credentials, weigering van de afzender, weigering van één en van alle ontvangers, weigering van DATA, timeouts vóór en na mogelijke acceptatie, verbroken verbindingen, rate-responses, verlopen van retries, dubbele workers, wijzigingen in suppressies en rotatie van secrets. Gebruik een gecontroleerde SMTP-testdienst of een lokale fake voor deterministische unit- en integratietests; stuur nooit per ongeluk verkeer uit lagere omgevingen naar adressen van klanten. Gebruik bij canary-tests in productie geautoriseerde ontvangers en inspecteer de ruwe headers op het zichtbare From, het envelope-pad, Message-ID, DKIM, SPF, DMARC-alignment en bewijs van de provider. Bevestig dat logs en statistieken geen credentials of berichtinhoud lekken. Laat de lancering niet doorgaan als de worker tenantautorisatie kan omzeilen, TLS kan downgraden, onbegrensd opnieuw kan proberen, gedeeltelijke weigering negeert of de verzendroute niet kan pauzeren.

Hoe SendHQ past

SendHQ is een e-mail-API per workspace voor verwachte productcommunicatie. De documentatie behandelt verzenden, geverifieerde domeinen, bezorgevents en suppressies. Gebruik de gedocumenteerde HTTP-API wanneer je SendHQ met Python integreert.

Veelgestelde vragen

Moet Python SMTP_SSL of STARTTLS gebruiken?

Gebruik de modus die het actuele submissioncontract van de provider vereist. SMTP_SSL versleutelt vanaf het begin van de verbinding; STARTTLS schakelt expliciet over en vereist geverifieerde TLS plus een nieuwe EHLO.

Bewijst een normale terugkeer van send_message dat het bericht is afgeleverd?

Nee. Het betekent dat ten minste één ontvanger in die fase van de SMTP-submission is geaccepteerd. Acceptatie door de bestemming, plaatsing in de mailbox en engagement vereisen later afgebakend bewijs.

Wat betekent de dictionary die send_message teruggeeft?

Die koppelt ontvangers die door de SMTP-server zijn geweigerd aan het bewijs uit het antwoord. Een lege dictionary betekent dat in die fase niemand is geweigerd, niet dat elk bericht een inbox heeft bereikt.

Kan een timeout direct opnieuw worden geprobeerd?

Niet veilig als de timeout optrad na een mogelijke submission. Bewaar de poging als onduidelijk, reconcilieer met bewijs van de provider of latere events en verstuur alleen opnieuw volgens een begrensd beleid voor het risico op duplicaten.

Waar moet het SMTP-wachtwoord worden opgeslagen?

Gebruik een beheerde server-side secretvoorziening met smalle toegang per workload en omgeving, geaudit ophalen, geteste rotatie en geen blootstelling aan clients, logs, prompts of fixtures.

Mag certificaatverificatie ooit worden uitgeschakeld in productie?

Nee. Een certificaat- of hostnaamfout wijst op een onveilige of onjuiste configuratie. Stop de route en diagnosticeer het probleem in plaats van de TLS-verificatie stilzwijgend af te zwakken.

Hoe moet gedeeltelijke weigering van ontvangers worden afgehandeld?

Sla het resultaat per ontvanger op, zet de geaccepteerde subset door en probeer alleen geschikte tijdelijke weigeringen opnieuw. Verstuur niet opnieuw naar al geaccepteerde ontvangers door de hele oorspronkelijke lijst te gebruiken.

Bewijst deze pagina dat SendHQ SMTP ondersteunt?

Nee. Deze gids behandelt Python SMTP in het algemeen; gebruik de actuele documentatie van SendHQ voor de e-mail-API.

Bronnen