Email versturen (Drupal)
In diverse situaties verstuurt Drupal e-mail, bv. order-bevestigingen door Übercart of account-bevestigingen. Dat gaat niet altijd vlekkeloos. In Drupal 6 is het gebruik van de PHP-functie mail()
de wortel van het kwaad: Deze functie vereist een locale Sendmail-instantie. Een bijkomend voordeel bij dit nadeel is, dat je geen emailaccounts hoeft te configureren: Emailadressen worden automatisch geaccepteerd, zonder verder autenthicatie (heel raar eigenlijk).
In Drupal 7 schijnt de situatie verbetert te zijn, omdat er nu gebruik wordt gemaakt van PHPMailer()
. In de praktijk lijkt er weinig te zijn veranderd: Nog altijd wordt de aanwezigheid van Sendmail veronderstelt.
De SMTP-module (Drush: smtp
) is een oplossing voor veel problemen. Ook als je niet precies weet wat het probleem is, omdat je er goed mee kunt diagnosticeren.
Het probleem: mail()
Drupal 6 gebruikt een wrapper om de PHP-functie mail()
:
bool mail(string $to, string $subject, string $message [, string $additional_headers [, string $additional_parameters ]] )
mail
functioneert als een mailclient voor de locale mailserver. Dus een mailserver die op die machine draait. Meer over de betreffende mailserver kun je achterhalen met phpinfo()
. Mail kan alleen overweg met een locale mailserver, en schijnt vrij beroerd te werken. Problematischer: Zover ik weet, kan het alleen overweg met één domein per webserver. Als er meerdere domeinen op een webserver geconfigureerd zijn, moet je gaan spoofen. En veel spamfilters vinden het niet leuk als je dat doet.
Mail-headers
Dit is een deel van de header van zo'n email. Deze email is verstuurd uit naam van een webwinkel. Dit domein staat op een VPS welke gedeeld wordt met een aantal andere domeinen. Er wordt altijd gebruik gemaakt door dezelfde mail-server. In dit geval vallen de waarschuwingen nog mee:
Delivered-To: info@gmail.com Received-SPF: neutral (google.com: 83.137.149.10 is neither permitted nor denied by best guess record for domain of www-data@example.com) client-ip=83.137.149.10; Authentication-Results: mx.google.com; spf=neutral (google.com: 83.137.149.10 is neither permitted nor denied by best guess record for domain of www-data@example.com) smtp.mailfrom=www-data@example.com Received-SPF: none (no valid SPF record) X-PHP-Originating-Script: 1000:mail.inc MIME-Version: 1.0 Content-Type: text/html; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8Bit X-Mailer: Drupal
Waar en hoe wordt er gemailed?
Dit is een beginnetje:
Troubleshooting
Begin bij het logboek
Je weet wel:
Drupal: Reports > Recent log entries
Als deze entry er niet staat, moet je wellicht module Database logging en/of Syslog aanzetten.
Het logboek houdt alleen bij of email met success is afgeleverd bij de mailserver. Dat zegt dus niet of de mailserver de mail met succes heeft kunnen versturen.
Anders kan het PHP-logboek ook helpen:
less /var/log/php/error.log
Controleer de afzender (site information)
In de voortdurende strijd tegen spam, controleren veel ontvangende mailservers of de verzendende mailserver wel echt bestaat. Dat kan een probleem zijn, bv. als de betreffende website op een ontwikkelserver staat zonder domeinnaam, maar met alleen een IP-adres. Of als de site een echte naam heeft, maar op een ontwikkelserver draait, zonder die domeinnaam.
De afzender staat geconfigureerd onder Site information.
Übercart? Controleer de afzender!
In november 2012 had ik bij het klonen van een Übercart-site vergeten om het afzender-e-mailadres te veranderen. Bevestigingen van nieuwe accounts werden dus wel goed verzonden, maar orderbevestigingen niet.
In Drupal 6 moet je de afzender op twee of drie plekken aanpassen onder Conditionele acties.
Externe SMTP-server gebruiken: Mogelijkheden
Hierboven werd mail()
genoemd, en de tekortkomingen die het heeft. Verzending via een externe mailserver, zou een universele oplossing zijn. Mogelijkheden:
- nail()
- Swiftmailer
- Drupal SMTP-module ivm. PHPMailer.
Deze laatste mogelijkheid, blijkt een goede oplossing te zijn. Zie SMTP-module (Drupal) voor details.
Casus mei 2012: Storing order-notificatie-e-mails (Drupal 6)
Dit betreft een storing waarbij de foutmelding gemeld werd.
Casus nov. 2012: Geen email na klonen webwinkel (Drupal 6 & Übercart)
Zie beschrijving in een eerder hoofdstuk.
Casus april 2015: Geen email na migratie (Drupal 6 & Übercart)
Dit probleem trad op na migratie van een Übercart-site naar een eigen VPS icm. een Email-Only-abonnement van TransIP. In de praktijk blijk je niet naar jezelf te kunnen emailen. Ik heb hier contact over gehad met TransIP, maar dat heeft tot op heden weinig opgeleverd.
Casus lente & zomer 2015: Vaak geen email vanuit Übercart
Probleem & aanvullende gegevens
Bij een bepaalde Drupal 6-webwinkel ontvangen klanten vaak geen orderbevestiging:
- Drupal-log vermeldt geen problemen
- PHP-log vermeldt geen problemen
- In het bijbehorende email-only-abonnement staat spamfiltering op z'n laagst, nog afgezien dat spamfiltering betrekking heeft op binnenkomende email, en niet op uitgaande email
- Bij een test op 5 augustus kreeg ik zelf wel gewoon een orderbevestiging
- Er komt geen email met fouten retour.
Overgebleven mogelijke oorzaken
- Kloppen de email-gerelateerde instellingen op deze Drupal-site?
- Is het SPF-record correct ingevuld?
Casus herfst 2015: Geen orderbevestigingen (Drupal 6)
Probleem
De orders van een aantal webwinkels komen niet meer aan in een Gmail-account dat gebruikt wordt voor monitoring.
Aanvullende gegevens
- Dit betreft meerdere webwinkels, terwijl er niets aan die webwinkels is veranderd
- Het probleem treedt op op meerdere computers
- De enige gemeenschappelijke factor: Gebruik Gmail
- Geen orders in de spambox
Mogelijke oorzaken
- Gmail past voortdurend spaminstellingen aan. Dingen die voor Gmail overduidelijk spam zijn, belanden niet in de spambox, maar worden direct verwijderd
- Er wordt gebruik gemaakt van generieke mailserver-instellingen. Dat geeft een mismatch met de domeinnamen waarvoor gemailed wordt. Dat wordt al snel als spam aangemerkt.
Zie ook
Bronnen
- http://api.drupal.org/api/drupal/includes--mail.inc/function/drupal_mail_send/6 - De API die mailen verzorgd
- http://drupal.org/node/356525 - Reroute Email Module om e-mailen te testen
- http://drupal.org/node/201981 - Aardig overzicht van verschillende debug-mogelijkheden
- http://www.ubercart.org/forum/support/9146/after_completing_order_unable_send_email_please_contact_site_admin_if_problem_per
- http://www.ubercart.org/docs/user/8590/email_notifications
- http://www.ubercart.org/docs/user/305/notification_settings
php's mail()
Externe mailserver
- http://www.google.com/search?q=drupal+use+external+smtp+server
- http://www.tonyrocks.com/index.php/blogging/content-management-systems/configuring-drupal-to-use-an-external-smtp-server/
- http://stackoverflow.com/questions/6573511/how-do-i-specify-to-php-that-mail-should-be-sent-using-an-external-mail-server
- http://www.symphonythemes.com/drupal-blog/configure-drupal-smtp-gmail - Concrete implementatie
Email & Drupal 7
- https://www.drupal.org/node/1229932 - email configuration - Vraag & antwoord van iemand
- https://www.drupal.org/project/smtp - Ook voor Drupal 7!