Door karma4: Ik maakte de berekening voor de impact niet voor niets.
Net zoals jij (zie mijn eerdere opmerking met Moore verwijzing) heb ik een hekel aan onnodige verkwisting van resources.
Anderzijds moet je bedenken dat hoe eenvoudiger iets kan met minder werk des te sneller en met minder risico het gaat.
In algemene zin heb je daar natuurlijk gelijk in, maar bij de inschatting van wat eenvoudiger en sneller is moet je wel enige kennis van zaken toepassen. Ik heb wat uitgewerkt om het aanschouwelijk te maken.
Het opmaken van een e-mail-tekst, inclusief headers, is gescheiden van het programmatisch versturen ervan. Het niet lekken van e-mailadressen is zuiver en alleen een kwestie van ze niet in de e-mailitekst opnemen. Ik laat de opmaak verder voor wat die is, daar is software voor. Versturen doe je met een SMTP-library waar je de volledig opgemaakte e-mail aan doorgeeft. Die ontvangt ook een afzender en een
lijst met bestemmingen. Deze worden niet aan de headers van de e-mail toegevoegd maar in de SMTP-dialoog gebruikt (de 'envelope'), en die worden niet zichtbaar voor de ontvangers. Of je zo'n sendmail()-call met dezelfe e-mailtekst en een lijstje van 1 bestemming, alle bestemmingen in een keer of plukjes van bestemmingen maakt nagenoeg niets uit in complexiteit, en
er is helemaal geen verschil in risico's die je ermee loopt. Een ongeordende lijst e-mailadressen sorteren en groeperen is in Python niet meer dan zoiets:
from email.utils import parseaddr
def groepeer(adressen, aantal):
def domein(adres):
return parseaddr(adres)[1].split('@')[-1]
adressen.sort(key=domein)
for i in range(0, len(adressen), aantal):
yield adressen[i:i+aantal]
Dit gebruik je zo:
with smtplib.SMTP(smtp_host) as smtp:
for bestemmingen in groepeer(adressen, 200):
smtp.sendmail(afzender, bestemmingen, bericht)
Dat is nagenoeg identiek aan het stuk voor stuk afleveren:
with smtplib.SMTP(smtp_host) as smtp:
for bestemming in adressen:
smtp.sendmail(afzender, [bestemming], bericht)
Het verschil is dus één import, een triviale functie van 6 regels die een ervaren Python-programmeur in minuten schrijft en test (het opgtuigen van de testdata die je sowieso nodig hebt voor je met echte adressen gaat werken kost heel wat meer tijd) en een klein verschil in twee regels van de rest van de code. Dat is alles. En het risico op het lekken van adressen zit hoe dan ook niet in deze code maar in het apart aangemaakte bericht.
Een ervaren Perl-programmeur kan ongetwijfeld iets dergelijks voor Perl laten zien en voor andere talen/platforms zal ook zoiets gelden, al zijn veel daarvan een stuk breedsprakiger dan Python of Perl.
Natuurlijk gaat het groeperen niet op als je gepersonaliseerde e-mails aanmaakt, maar daar hadden we het even niet over.
@redactie: ik zie dat de code-bbtag voorloopspaties weghaalt. Ik heb dat nu "opgelost" door no-break-spaces te gebruiken voor inspringen, maar code moet natuurlijk met handhaving van inspringen worden weergegeven. In talen die {} gebruiken om blokken te markeren is dat voor de leesbaarheid goed, in talen als Python waar het inspringen zelf blokken markeert verminkt het weglaten van voorloopspaties de code tot iets dat syntactisch onjuist is. De code-tag is er om code goed weer te geven, niet om hem te verminken.