Email versturen (Drupal)

Uit De Vliegende Brigade
Versie door Jeroen Strompf (overleg | bijdragen) op 15 mrt 2017 om 14:42 (→‎Message-module)
(wijz) ← Oudere versie | Huidige versie (wijz) | Nieuwere versie → (wijz)
Naar navigatie springen Naar zoeken springen
Foutmelding: Unable to send e-mail. Please contact the site administrator of the problem persist. In dit geval is er gelukkig nog een foutmelding, meestal is die er namelijk niet
Foutmelding: Probleem tijdens het versturen van e-mail. Neem contact op met de beheerder als het probleem aanhoudt

Regelmatig versturen Drupal-websites email, bv. accountbevestigingen of orderbevestigingen. In beginsel gebeurt dat met de php-functie mail(). Dat geeft nogal eens problemen en verwarring: Deze functie vereist een locaal geïnstalleerde mailserver (niet per Sendmail: Zelf gebruik ik Postfix), en verwacht deze zonder verdere authenthicatie te kunnen gebruiken. In Drupal 7 is dit probleem nog net zo actueel als in Drupal 6. Welliswaar is mail() vervangen door PHPMailer(), het probleem is nog precies hetzelfde.

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()

Een paar email-gerelateerde instellingen in phpinfo(). Laat je niet verwarren door de vermelding van Sendmail: Deze server gebruikt Postfix als mailserver, en dat werkt. Ik weet niet waarom Postfix niet genoemd wordt

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 dat niet leuk.

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 wanneer wordt er gemailed?

Twee voorbeelden:

Als je een nieuw wachtwoord aanvraagt
Drupal Commerce: Store » Configuration » Checkout settings » Checkout rules

Troubleshooting

Stuur een testmail mbv. de SMTP-module

De SMTP-module is vaak een goed startpunt om te debuggen, omdat je vanaf die pagina testemails kunt verzorgen. Daarbij kun je kiezen of je gebruik maakt van de al bestaande emailinfrastructuur, of de infrastructuur die door de SMTP-module wordt geboden.

Als je een testmail verstuurt, en je krijgt gelijk een foutmelding binnen Drupal, dan zegt dat nogal wat. Bv.:

  • Locale mailserver werd niet gevonden
  • Mail werd geweigerd door de externe mailserver, bv. omdat in Drupal onder Configuration » Settings een ander afzendadres staat dan waar de externe mailserver email voor verstuurd. In dit geval krijg je wel degelijk direct een foutmelding.

SMTP-module + debugging

Er is inderdaad een probleem? Zet dan debuggin aan, onderaan het scherm.

In maart 2017 dit toegepast bij een haperende site. Hielp fantastisch.

Voorbeeld van de laatste karakters van een geslaagde SMTP-boodschap:

get_lines(): $str is "250 2.1.5 Ok " 
SMTP -> get_lines(): $data is "250 2.1.5 Ok " 
SMTP -> FROM SERVER: 250 2.1.5 Ok 
SMTP -> get_lines(): $data was "" 
SMTP -> get_lines(): $str is "354 End data with . " 
SMTP -> get_lines(): $data is "354 End data with . " 
SMTP -> FROM SERVER: 354 End data with . 
SMTP -> get_lines(): $data was "" 
SMTP -> get_lines(): $str is "250 2.0.0 Ok: queued as 3vjrNz5Y4Jz12N9X " 
SMTP -> get_lines(): $data is "250 2.0.0 Ok: queued as 3vjrNz5Y4Jz12N9X " 
SMTP -> FROM SERVER: 250 2.0.0 Ok: queued as 3vjrNz5Y4Jz12N9X 
SMTP -> get_lines(): $data was "" 
SMTP -> get_lines(): $str is "221 2.0.0 Bye " 
SMTP -> get_lines(): $data is "221 2.0.0 Bye " 
SMTP -> FROM SERVER: 221 2.0.0 Bye 

En een voorbeeld van een niet-geslaagde sessie:

SMTP -> ERROR: Password not accepted from server: 535 5.7.8 Error: authentication failed: UGFzc3dvcmQ6 
SMTP -> get_lines(): $data was "" 
SMTP -> get_lines(): $str is "250 2.0.0 Ok " 
SMTP -> get_lines(): $data is "250 2.0.0 Ok " 
SMTP -> FROM SERVER: 250 2.0.0 Ok

Authenticatie-storingen zie je direct

Wat je kunt zien aan het voorbeeld hierboven: Een authenticatie-storing (=verkeerd wachtwoord oid.) zie je gelijk. Da's handig, want veel soorten fouten (bv. verkeerd emailadres) ontstaan pas later, zodat je geen feedback krijgt.

Drupal-logboek

Als debugging ook niet helpt: Drupal-logboek erbij pakken???

Drupal: Reports > Recent log entries

Als deze entry er niet staat, moet je wellicht module Database logging en/of Syslog aanzetten.

Helpt dit? Wordt vervolgd!

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.

Foutmelding: Probleem bij het versturen van e-mail. Neem contact op met de beheerder als het probleem aanhoudt
De oorzaak: Tikfout in het e-mailadres van de afzender. Deze fout bevestigd trouwens dat het e-mailadres van de afzender op meerdere plekken wordt bijgehouden. Anders was het al veel eerder gebleken
Deze fout heeft geen betrekking op Übercart, maar op Drupal in het algemeen. Dus pagina Site information.

SMTP-module

Zoals al eerder aangegeven, maak mail() gebruik van een locale Sendmail-mailserver. Da's eigenlijk best gek, want heel vaak zal er geen locale mailserver zijn. Daarom is het vaak handiger om 'gewoon' een locale SMTP-client te hebben, net als Thunderbird of Outlook emailclients zijn.

Die mogelijkheid is er. Het wordt geboden door zowel PHP-functies als Drupal-module:

  • nail()
  • Swiftmailer
  • Drupal SMTP-module.

Ik heb goede ervaringen met deze laatste module. Ik gebruik 'm standaard voor alle sites. Zie SMTP-module (Drupal) voor details, naast dit artikel.

Configuratie

Instellingen voor gebruik als emailclient voor een TransIP-email-adres:

Instellingen Configuration » System » SMTP Authentication support. Het moet per se SSL zijn
Instellingen Configuration » System » Site information - Als je dit overslaat, wordt email geweigerd door de SMTP-server

Message-module

Naast eerdergenoemde SMTP-module is er de Message-module, waarvan de submodule Message Notify berichten verstuurt via SMS en email:

  • Structure » Message types: Hier vind je alle berichten, zoals orderbevestigingen
  • Versturen geschiedt met de message_notify_send_message-functie
  • Ik heb de indruk dat de module gebruik maakt van de onderliggende structuur voor verzending. Dus standaard nog steeds met mail()

Standaard contactformulier

In mrt. 2017 een site waarop de SMTP-module 't goed doet, maar het standaar contactformulier niet. Werkt dit formulier wel samen met de SMTP-module?

Casus mei 2012: Storing order-notificatie-e-mails (Drupal 6)

Dit betreft een storing waarbij de foutmelding gemeld werd.

In mei 2012 kreeg ik deze foutmelding, terwijl e-mails wel degelijk verstuurd werden
En dit is een bijbehorende logboekvermelding. Hier lijkt het e-mailadres van de ontvanger te ontbreken
De oplossing: Normaal staat op de regel E-mail admin checkout notification een link reset. Door deze te klikken is het probleem verdwenen

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

php's mail()

Externe mailserver

Email & Drupal 7

Message-module