web-dev-qa-db-fra.com

Volume de messagerie SMTP

L'application de mon entreprise dispose d'un système de messagerie en masse, entièrement personnalisé, utilisé par nos clients pour envoyer des courriels basés sur des opt-ins. Tout en surveillant les performances lors d’envoi d’emails par lots particulièrement volumineux, nous avons constaté qu’il existait un obstacle artificiel causé par notre mécanisme d’envoi actuel (phpMailer). Pendant un bref moment, nous avons redirigé notre courrier via un service SMTP tiers, mais réalisé qu'ils n'envoyaient pas plus vite que nous. Maintenant que le fardeau des envois est de retour sur nous, nous effectuons des tests approfondis en prévision d’un certain nombre de grands clients à venir.

En supposant que nous améliorions le débit d’envoi de notre protocole de messagerie (nous envisageons de passer à SwiftMailer), je me demandais si notre serveur SMTP pourrait également devenir un goulot d’étranglement. Quel type de débit pouvez-vous obtenir de votre serveur SMTP? Quelles considérations sur l'envoi SMTP (telles que l'authentification, le conditionnement, etc.) dois-je reconsidérer lorsque je modifie les performances?

5
bpeterson76

Tant que vous utilisez un serveur SMTP non bloquant (s'il rencontre un serveur DNS/SMTP défectueux), le nombre de domaines dans lesquels les emails sont destinés et leur largeur de bande dépendent du nombre de domaines. des exceptions à la règle apparaissent aux extrêmes). Je soupçonne ce dernier (bande passante) car vous obtenez des résultats similaires avec un serveur externe.

Tout emballage/cryptage sur du matériel moderne prend une fraction du temps nécessaire pour envoyer un courrier électronique à un serveur lent. Si vous hébergez vos propres serveurs DNS, assurez-vous qu'ils renvoient des résultats rapides, car le serveur SMTP destinataire voudra probablement vérifier vos enregistrements à nouveau (ce qui ralentira davantage les choses). Avoir deux serveurs de messagerie (avec suffisamment de bande passante) est normalement bien plus rapide (en raison du blocage sur un serveur de réception lent) que de dépenser la même somme sur un serveur unique mieux spécifié.

Nasty hacks pour des victoires rapides

  1. Trier les adresses e-mail par nom de domaine. Si vous créez une nouvelle table de base de données suspendue à la table dans laquelle vous stockez l'adresse électronique, celle-ci peut contenir la clé étrangère, la partie utilisateur et la partie de domaine. Une analyse permettant de scinder les données existantes et de modifier le CRUD pour mettre à jour les enregistrements permettra d’atteindre cet objectif. En triant par nom de domaine, vous autoriserez le serveur expéditeur à réutiliser sa connexion au serveur de messagerie distant (faites attention de ne pas bloquer le SPAM).

  2. Lorsque le code est difficile à modifier et que vous souhaitez alterner les serveurs de messagerie, vous pouvez simplement modifier la fonction pour qu’elle accepte une référence (préfixez-la avec un & en PHP), puis vous pouvez utiliser une variable $ _GLOBAL modifiée toutes les x secondes par un planificateur qui appelle une page masquée PHP.

  3. Utilisez un cache DNS local et interrogez les enregistrements MX nécessaires avant l'exécution (ou au moins, démarrez un script à exécuter en parallèle). La plupart des caches conservent des enregistrements pendant 24 heures (normalement écrites en 3600 secondes). Cela peut réduire la latence initiale de la connexion d'environ 100 ms. Si vous avez plusieurs serveurs SMTP et que le récepteur possède plusieurs enregistrements MX, vous pouvez fausser les résultats. Donc, votre premier serveur d'envoi voit:

    • Enregistrement MX 1 Priorité 10
    • Enregistrement MX 2 Priorité 20
    • Enregistrement MX 3 Priorité 30
    • Enregistrement MX 4 Priorité 40

    et votre deuxième serveur d'envoi voit

    • Enregistrement MX 1 Priorité 40
    • Enregistrement MX 2 Priorité 10
    • Enregistrement MX 3 Priorité 20
    • Enregistrement MX 4 Priorité 30

    etc. De cette façon, vous pouvez augmenter le comportement parallèle, mais cela réduit les gains du point 1.

Si vous pouvez exécuter une trace de paquet pour identifier les goulots d'étranglement, cela vous aidera à trouver les gains rapides nécessaires.

3
Metalshark

Bien que j'aime PHP, c'est là que se trouve votre goulot d'étranglement dans votre système. PHP n'a tout simplement pas l'efficacité des autres langages en matière de traitement de texte.
https://stackoverflow.com/questions/603163/is-Perl-a-good-option-for-heavy-text-processing

Perl sera un meilleur choix pour le traitement et l’envoi de courriels. Il y a quelques années, j'avais écrit un simple programme Perl permettant d'envoyer des courriels personnalisés à nos opt-ins. J'ai pu envoyer environ 80 000 courriers électroniques en 6 heures en utilisant simplement Perl pour créer le courrier électronique et le soumettre au programme Sendmail local. C'était sur un serveur privé virtuel assez standard avec 2 Go de RAM.

Soumettez-vous les travaux au processus Sendmail local ou PHPMailer utilise-t-il le protocole SMTP? Le programme Sendmail local sera plus rapide car PHP n’a pas à ouvrir de sockets réseau pour envoyer le courrier électronique.

Donc, en résumé, vous devriez:

  1. Utilisez Perl au lieu de PHP (je déteste aussi Perl, mais c'est un meilleur outil de traitement de texte)
  2. Soumettez le travail au programme Sendmail local (vous pouvez le configurer pour transférer les travaux vers des serveurs SMTP externes, le cas échéant).
  3. Utilisez un serveur SMTP externe si le serveur local est surchargé.
3
Shane Stillwell