[sSMTP + PHP] mail()-functie niet laten wachten op resultaat

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Basje
  • Registratie: November 2008
  • Laatst online: 01-10 07:50
LS,

Om lekker te experimenteren in een door mij gecontroleerde omgeving heb ik een VPS gehuurd en daar een LAMP-installatie op gezet met Debian Wheezy en PHP 5.5. Omdat het geen grote specs heeft wil ik er zo min mogelijk op draaien.

Voor het versturen van mail heb ik gekozen voor sSMTP, supersimpel en snel werkend gekregen via Ziggo's SMTP, werkt ook in PHP via mail(). Bij tests blijkt echter dat scripts heel traag worden als er ergens een mailtje wordt verstuurd.

PHP:
1
2
3
4
5
6
7
8
9
10
$time_start = microtime(true);
$success = mail(
    "johndoe@example.domain",
    "Testmail PHP", 
    (new DateTime())->format("c"), 
    "From: Testserver <janedoe@example.domain>");
echo "Mail verstuurd: ", ($success ? "ja" : "nee"), PHP_EOL;
$time_end = microtime(true);
$time = $time_end - $time_start;
printf("Duur: %f seconden", $time);

Bij het uitvoeren van bovenstaand script duurt het ruim een seconde tot soms wel vier seconden, veel te lang om een bezoeker op te laten wachten in ieder geval. Na inspectie van /var/log/mail.log lijkt het te komen door het versturen zelf:
Jul 17 20:31:34 primus sSMTP[21092]: Creating SSL connection to host
Jul 17 20:31:34 primus sSMTP[21092]: SSL connection using RSA_AES_128_CBC_SHA1
Jul 17 20:31:35 primus sSMTP[21092]: Sent mail for janedoe@example.domain (221 smtp2.tb.mail.iss.as9143.net closing connection) uid=33 username=www-data outbytes=442


Google gaf me dit artikel nog maar die krijg ik niet aan de praat. De oplossing zou m.i. zijn dat PHP niet wacht op het afhandelen van mail() en gewoon doorgaat. Liefst door asynchroon te werken, maar met een "hack" mag wat mij betreft ook. Zelfs een ander simpel SMTP-programma is in principe een optie.

Na uren hobby-en kom ik er nog steeds niet uit, dus keer ik me naar jullie: hoe zouden jullie zo snel mogelijk een dergelijke oplossing inrichten?

Disclaimer: Linux-noob en autodidact.

Alvast heel erg bedankt voor de hulp! :)

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Ik ken sSMTP niet, maar gooi gewoon een localhost smtp erop.

Jouw script post naar localhost smtp (moet snel gaan) en je localhost smtp kent allerlei queues en timeouts etc om het berichtje weer op zijn bestemming te krijgen.

update : na even googlen begrijp ik dat sSMTP ook gewoon een mailer is, dan moet je gewoon even je php.ini config veranderen volgens bijv : http://kb.simplewallsoftw...tion-with-ssmtp-on-linux/ zodat er ook echt ssmtp gebruikt wordt.

Alhoewel ik uberhaupt het al extreem zou afraden om direct de mail() functie van php te gebruiken, gooi daar gewoon lekker een mail-library omheen zodat je ook minder spam-ratings etc krijgt.

Acties:
  • 0 Henk 'm!

  • bille
  • Registratie: Mei 2000
  • Laatst online: 16-08 14:37

bille

Don't call me Buff

Gebruik een jobqueue zoals Beanstalkd: http://kr.github.io/beanstalkd/ of IronIO: http://www.iron.io/. Handig voor allerlei stuff die je asynchroon wilt doen van het afhandelen van de client request.

[ Voor 47% gewijzigd door bille op 17-07-2014 23:31 ]

Ultra Pilammo 6666Mhz AMD, 4251Mbit/s RAM, Gefors V6666 MegaTurbo, 43" TFS, Ultra 80Gig Firewire netwerkkaart en 5D geluid met 66 speakers in 5 dimensies


Acties:
  • 0 Henk 'm!

  • CAPSLOCK2000
  • Registratie: Februari 2003
  • Laatst online: 01-10 12:22

CAPSLOCK2000

zie teletekst pagina 888

Wat je wil kan ssmtp niet, daar is het te simpel voor. Je zal zelf voor een asynchrone afhandeling moeten zorgen (door een aparte php-thread te starten ofzo) of er een intelligentere mailer onder zetten.
Je kan ook nog proberen je mail te versturen naar een snellere externe SMTP-server. 4 seconde is wel erg langzaam maar die moet je dan maar net beschikbaar hebben.

This post is warranted for the full amount you paid me for it.


Acties:
  • 0 Henk 'm!

  • Basje
  • Registratie: November 2008
  • Laatst online: 01-10 07:50
Gomez12 schreef op donderdag 17 juli 2014 @ 23:21:
update : na even googlen begrijp ik dat sSMTP ook gewoon een mailer is, dan moet je gewoon even je php.ini config veranderen volgens bijv : http://kb.simplewallsoftw...tion-with-ssmtp-on-linux/ zodat er ook echt ssmtp gebruikt wordt.
Het probleem is niet dat sSMTP niet gebruikt wordt, het werkt allemaal naar behoren. Voordat ik sSMTP configureerde kon ik überhaupt geen mail versturen. De mail.log laat ook zien dat de mail via sSMTP verstuurd is.

Het probleem is dat PHP wacht totdat de mail verstuurd is, dat zou ik graag anders zien. Het "afleveren" aan sSMTP zou voor mij voldoende zijn om true terug te krijgen uit mail(). Zal even kijken of er in jouw link nog tips/trucs staan die het probleem wellicht oplossen.
Gomez12 schreef op donderdag 17 juli 2014 @ 23:21:
Alhoewel ik uberhaupt het al extreem zou afraden om direct de mail() functie van php te gebruiken, gooi daar gewoon lekker een mail-library omheen zodat je ook minder spam-ratings etc krijgt.
Op zichzelf ben ik het met je eens, maar elke library is in feite een schil over mail() heen, toch? Dat is ook nog iets waar ik even in moet duiken.
bille schreef op donderdag 17 juli 2014 @ 23:29:
Gebruik een jobqueue zoals Beanstalkd: http://kr.github.io/beanstalkd/ of IronIO: http://www.iron.io/. Handig voor allerlei stuff die je asynchroon wilt doen van het afhandelen van de client request.
Bedankt voor de suggesties. Zal gaan kijken of ik er iets mee kan, maar mijn eerste indruk is dat het overkill is voor het probleem dat ik nu probeer op te lossen. Neemt niet weg dat ik het zal noteren, mocht ik het in de toekomst nodig hebben.
CAPSLOCK2000 schreef op donderdag 17 juli 2014 @ 23:37:
Wat je wil kan ssmtp niet, daar is het te simpel voor.
Ik begon al te vrezen dat het zoiets zou zijn. Jammer.
CAPSLOCK2000 schreef op donderdag 17 juli 2014 @ 23:37:Je zal zelf voor een asynchrone afhandeling moeten zorgen (door een aparte php-thread te starten ofzo) of er een intelligentere mailer onder zetten.
Het starten van een asynchrone PHP-thread is inderdaad een optie, maar mijn voorkeur gaat dan uit naar een intelligentere mailer. Heb je suggesties? Ben er inmiddels achter dat sSMTP onder de noemer nullmailers valt, dus dat ik op zoek moet naar een dergelijke mailer die wel asynchroon kan afvangen. Ook vond ik in de sSMTP-man-page nog dit:
-od
    (ignored) Set the delivery mode to interactive/synchronous, background or queue (Always interactive). 
Als ik het goed begrijp ondersteunt sendmail dus eigenlijk gewoon die actie. Kan iemand dat bevestigen? Ik vind het geen probleem om er weer wat tijd in te steken om uit te zoeken hoe dat dan precies moet, maar het zou fijn zijn om te weten dat het uiteindelijk kan lukken, al dan niet met hulp van anderen. ;) En heeft iemand dan tips voor het instellen van sendmail als nullmailer? Want een volledige mailserver heb ik eigenlijk niet nodig en als ik de resources ergens anders voor kan gebruiken zou dat mooi zijn.
CAPSLOCK2000 schreef op donderdag 17 juli 2014 @ 23:37:Je kan ook nog proberen je mail te versturen naar een snellere externe SMTP-server. 4 seconde is wel erg langzaam maar die moet je dan maar net beschikbaar hebben.
Ja, dat is natuurlijk waar. Zou het bijvoorbeeld kunnen proberen met de Google SMTP-server, maar zelfs als ik flinke winst haal zal de mail()-afhandeling nooit in milliseconden zijn terwijl dat wel het streven is. Dit gaat ook op mijn lijstje met back-up-plannen.

Iedereen bedankt voor het meedenken, het wordt gewaardeerd!

Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Eventueel het mailing systeem wat uitbreiden geen optie? Dan maak je er een tabel (of meerdere tabellen) voor in een database, welke je vervolgens middels een cron script eens in de X tijd laat draaien? Dan heb je dus mail() alleen nodig in het script wat uitgevoerd wordt door cron. :) En je hoeft voor het mailen zelf dan ook niet per se PHP te gebruiken.

[ Voor 15% gewijzigd door CH4OS op 18-07-2014 11:11 ]


Acties:
  • 0 Henk 'm!

  • CAPSLOCK2000
  • Registratie: Februari 2003
  • Laatst online: 01-10 12:22

CAPSLOCK2000

zie teletekst pagina 888

Postfix is de gouden standaard. IOp een enigzins modern systeem is het geheugengebruik daarvan behoorlijk verwaarloosbaar. Als dat nog te groot is kun je eens kijken naar nullmailer, esmtp of msmtp. Ik weet niet of die zelfstandig werken of blokkeren tot de mail is verzonden.

This post is warranted for the full amount you paid me for it.


Acties:
  • 0 Henk 'm!

  • Basje
  • Registratie: November 2008
  • Laatst online: 01-10 07:50
Wederom bedankt voor de antwoorden!
CptChaos schreef op vrijdag 18 juli 2014 @ 11:10:
Eventueel het mailing systeem wat uitbreiden geen optie? Dan maak je er een tabel (of meerdere tabellen) voor in een database, welke je vervolgens middels een cron script eens in de X tijd laat draaien? Dan heb je dus mail() alleen nodig in het script wat uitgevoerd wordt door cron. :) En je hoeft voor het mailen zelf dan ook niet per se PHP te gebruiken.
Leuk om een keer te proberen! Maar eerst dit aan de praat krijgen zoals ik aanvankelijk had gepland, want ik vind dat ik dit zou moeten kunnen. :+
CAPSLOCK2000 schreef op vrijdag 18 juli 2014 @ 15:02:
Postfix is de gouden standaard. Op een enigzins modern systeem is het geheugengebruik daarvan behoorlijk verwaarloosbaar. Als dat nog te groot is kun je eens kijken naar nullmailer, esmtp of msmtp. Ik weet niet of die zelfstandig werken of blokkeren tot de mail is verzonden.
Waarschijnlijk zal ik uiteindelijk inderdaad eindigen bij Postfix, maar de complexiteit van de software schrikt me een beetje af.

Vanavond voor het eerst sinds mijn laatste antwoord weer aan dit project gezeten. sSMTP van de server gegooid en de hierboven genoemde nullmailer geïnstalleerd. Omdat ik twee veelbelovende artikelen had gevonden was ik ervan overtuigd dat het in een uurtje gefixt zou zijn. Helaas...Zeker de eerste link leek hoopgevend. De tweede link gold als fallback maar ik krijg OpenSSL niet aan de praat met Ziggo. Moet me nu weer even op andere zaken richten, maar dit weekeinde hoop ik tijd te hebben om te kijken welke versie van nullmailer standaard bij Debian Wheezy komt en eventueel ga ik proberen het vanuit de broncode zelf de compileren. En ik moet opzoeken hoe ik via een parameter meegeef TLS te gebruiken. Mocht iemand dit al gelijk weten, een heads up zou fijn zijn! :)

En anders dit weekeinde een bericht waarin ik (hopelijk) zeg dat het gelukt is, of anders Postfix-hulp kom vragen...

Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 21:30

Hero of Time

Moderator LNX

There is only one Legend

Je kan ook kijken naar Exim. Dat is het standaard alternatief als je 'mailserver' selecteert in tasksel of tijdens installatie van Debian. Config ervan is misschien eenvoudiger voor je. Maar Postfix is echt niet zo moeilijk.

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • Joolee
  • Registratie: Juni 2005
  • Niet online
Ik gebruik voor zoiets simpels altijd nullmailer. Als je echter ook maar iets wilt buiten de standaard mogelijkheden dan loop je daarop al snel vast. Als je persé met SSL moet verbinden kun je beter gewoon postfix installeren. Zo complex is het niet en, iig bij Ubuntu kun je de benodigde configuratie tijdens de installatie van Postfix doen. Waarschijnlijk zul je dan alleen nog een certificaatje moeten maken en in main.conf naar verwijzen. Dat zul je echter met al je mogelijk oplossingen moeten doen.

Acties:
  • 0 Henk 'm!

  • Basje
  • Registratie: November 2008
  • Laatst online: 01-10 07:50
Hero of Time schreef op donderdag 24 juli 2014 @ 22:29:
Je kan ook kijken naar Exim. Dat is het standaard alternatief als je 'mailserver' selecteert in tasksel of tijdens installatie van Debian. Config ervan is misschien eenvoudiger voor je. Maar Postfix is echt niet zo moeilijk.
Ja, ik denk dat Exim inderdaad op mijn installatie stond maar door apt-get is verwijderd bij het installeren van sSMTP. Zal er eens naar kijken.
Joolee schreef op donderdag 24 juli 2014 @ 22:40:
Ik gebruik voor zoiets simpels altijd nullmailer. Als je echter ook maar iets wilt buiten de standaard mogelijkheden dan loop je daarop al snel vast. Als je persé met SSL moet verbinden kun je beter gewoon postfix installeren. Zo complex is het niet en, iig bij Ubuntu kun je de benodigde configuratie tijdens de installatie van Postfix doen.
Duidelijk. Zal binnenkort een goede tutorial gaan zoeken.

Ter informatie voor mensen die het leuk vinden; ben vandaag weer even bezig geweest met het configureren van nullmailer op basis van twee artikelen die ik heb gevonden:Er staat veel nuttige informatie in en nadat ik had geverifieerd dat ik een versie heb die het ondersteunt (Wheezy komt met versie 1.11 van nullmailer) ben ik gaan experimenteren met de opties --starttls, --auth-login en --insecure. Hierdoor ziet /etc/nullmailer/remotes er als volgt uit:
smtp.ziggo.nl smtp --port=587 --auth-login --user=host.example.domain@ziggo.nl --pass==omGwtfbBq --starttls

Door het toevoegen van --starttls wordt er goed gecommuniceerd tussen mijn server en de Ziggo-smtp-server, maar het resulteert alleen maar in een nieuwe foutmelding:

Jul 26 16:25:14 primus nullmailer[31665]: Rescanning queue.
Jul 26 16:25:14 primus nullmailer[31665]: Starting delivery: protocol: smtp host: smtp.ziggo.nl file: 1406391622.31378
Jul 26 16:25:14 primus nullmailer[31665]: Starting delivery, 1 message(s) in queue.
Jul 26 16:25:14 primus nullmailer[31667]: smtp: Failed: 535 Incorrect authentication data
Jul 26 16:25:14 primus nullmailer[31665]: Sending failed:  Permanent error in sending the message
Jul 26 16:25:14 primus nullmailer[31665]: Delivery complete, 1 message(s) remain.

Zo dichtbij en nog steeds niet het gewenste resultaat. Tot drie keer toe gecontroleerd dat de inlognaam en het wachtwoord kloppen. Inloggen op de webmail lukt met deze gegevens, en het zijn dezelfde gegevens zoals gebruikt bij sSMTP waarbij het mailen succesvol was. Alle resultaten via Google komen linksom of rechtsom neer op het feit dat het wachtwoord niet zou kloppen, maar andere oplossingen worden niet aangedragen.

Waarschijnlijk geef ik het op... Baal ervan dat het niet gelukt is terwijl het niet zo moeilijk lijkt. :(

Ach ja, misschien dat ik na het diner me eens ga verdiepen in Postfix...

Iedereen bedankt voor het meedenken!

Update 27 juli, 0:33 uur

Na veel Googlen en lezen besloten terug te gaan naar de kern van het probleem, namelijk dat mailen via sendmail niet werkte, waardoor ik een workaround nodig had. Ergens had ik gelezen dat VPS-providers soms uitgaand verkeer via poort 25 blokkeren om het spammers lastig(er) te maken. Een ticket aangemaakt met de vraag of dat bij mij misschien het geval was. Binnen een minuut antwoord dat er geen poorten op mijn VPS waren geblokkeerd. Nogmaals sendmailconfig gedraaid, testmails gestuurd, geen mail binnen gekregen. Totdat er een lampje ging branden. De testmail die verstuurd werd ging naar hetzelfde domein waar de server ook onderdeel van uitmaakt, dus die mail werd lokaal afgeleverd. Mail naar een ander adres buiten het domein leek ook niet aan te komen, maar vond ik terug tussen de spam. Na het goed configureren van de SPF-records en reverse DNS lijkt dat opgelost te zijn. Kortom: een reeks aan rookie mistakes die ik (hopelijk) nooit meer zal maken waren de oorzaak.

8)7

[ Voor 13% gewijzigd door Basje op 27-07-2014 00:33 . Reden: Oorspronkelijk probleem opgelost, bericht aangepast met update ]


Acties:
  • 0 Henk 'm!

  • Brahiewahiewa
  • Registratie: Oktober 2001
  • Laatst online: 30-09-2022

Brahiewahiewa

boelkloedig

Nou, in ieder geval gefeliciteerd dat het nu werkt.
'k Heb wel de indruk dat je 't probleem moeilijker maakt dan het is.
Zowel exim als postfix als sendmail kunnen in ieder geval een directory in de gaten houden en, zodra er een filetje in verschijnt - volgens een vast formaat, dat dan weer wel - gooien ze dat via SMTP eruit. Dus als je exim of postfix of sendmail gaat gebruiken hoef je alleen maar een filetje te saven; dat gaat echt wel in milliseconden.
Zorg wel dat niet iedere Jodocus op internet in die directory kan schrijven, overigens

QnJhaGlld2FoaWV3YQ==


Acties:
  • 0 Henk 'm!

  • Basje
  • Registratie: November 2008
  • Laatst online: 01-10 07:50
Brahiewahiewa schreef op maandag 28 juli 2014 @ 03:16:
Zowel exim als postfix als sendmail kunnen in ieder geval een directory in de gaten houden en, zodra er een filetje in verschijnt - volgens een vast formaat, dat dan weer wel - gooien ze dat via SMTP eruit. Dus als je exim of postfix of sendmail gaat gebruiken hoef je alleen maar een filetje te saven; dat gaat echt wel in milliseconden.
Zorg wel dat niet iedere Jodocus op internet in die directory kan schrijven, overigens
Bedankt voor deze suggestie, klinkt als een leuk project om uit te dokteren tijdens een paar vrije uurtjes. :)
Pagina: 1