Hallo PHPHulp,

Ik ben bezig met een systeem.

Nu wil ik het volgende.

De bezoeker heeft een vraag en emailt naar contact@******.net
De website leest met PHP de email en zet hem in de database, de afzender, tijd en bericht.

Hoe moet ik zoiets maken? Met een cronjob dacht ik zelf?

Iemand die kan helpen

mvg

Ivo P op 23/08/2017 12:25:06

Let er bij het schrijven wel op, dat het de mailserver (sendmail ?) is die het script moet kunnen uitvoeren.

Je kan een inkomende mail direct doorsturen naar php.
In mijn geval is "systeem" vrijwel altijd een backend, maar dat kun je inderdaad ook als een front-end lezen.

Als het op een gekoppelde site (zelfde server) ingevuld kan worden, dan heb je wel meer zeggenschap over de data en het verwerken. Dan zou ik niet eerst de mail aanbieden aan een mailserver om hem op een (dezelfde?) mailserver weer in te lezen.

Dan heb je a) veel overhead en headers extra, en b) zeker als het over meerdere servers gaat, kan op verloren gaan van de mails.
Hallo,

Bedankt voor de reacties allemaal.

Helaas kom ik er nog steeds niet uit.
Ik maak gebruik van DirectAdmin.

Kan iemand mij helpen?
- Ariën - op 23/08/2017 19:21:43

Als ik op internet rondneus op 'DirectAdmin + mail piping' kom ik op dit uit:
http://forum.directadmin.com/showthread.php?t=1092

Je kan dus |/home/xxxxxx/domains/xxxxxxx.nl/public_html/script.php als alias-forwarder instellen.

Als ik dat doe krijg ik een email terug van dat de email niet aan gekomen is. Ik heb e gegevens vervangen.
Wat zegt de mail? En hoe ziet je script eruit? En wat staat er exact (gecencureerd) in je invoerveld? Je bent de quotes om je pipeing niet vergeten?

Ik ben er ook mee aan het spelen, maar nog niet met het gewenste resultaat. Maar ik kom wel stukje bij beetje verder.

Update
Na een half uur aanstoeien en 15 mails verder, krijg ik de mails eindelijk gepiped naar een tekstbestand.


<?php
$fd = fopen("php://stdin", "r");
$email = "";
while (!feof($fd)) {
    $email .= fread($fd, 1024);
}
fclose($fd);

$fdw = fopen("/home/******/domains/*****.nl/public_html/mailpipe/mail.txt", "w+");
fwrite($fdw, $email);
fclose($fdw);

echo "0";
?>


En de invoer in Directadmin bij 'Destination Email' (mét quotes):
"|/usr/local/bin/php -q /home/****/domains/*****.nl/public_html/mailpipe/pipe.php"

Volgende zaak is om de mail-content uit elkaar te trekken, maar daar zijn wel wat opensource parsers voor te vinden.

Enige nadeel is wel dat je 'failed' mailtjes krijgt, omdat exim niet echt lijkt te snappen dat hij kan pipen.
Het is veel eenvoudiger om in je script gewoon een shebang regel op te nemen, en het executable bit te geven. Datzelfde geldt voor cron jobs etc.
Dat heb ik ook geprobeerd, maar dat leek niet lekker te werken.
Ik ga het nog eens verder uitpluizen binnenkort.
In jouw geval gewoon een regel als

#!/usr/local/bin/php -q
<?php
// hier je code
?>

Uiteraard het executable bit niet vergeten, voor ter hoogte van de uitvoerende gebruiker. Normaliter zal dat een u+rx zijn, maar voor email piping zal het waarschijnlijk o+rx zijn, omdat de mailserver uiteraard niet onder jouw gebruiker draait.
Ik heb het zelf werkend als volgt:

Log in op directadmin als de user waar het onder moet werken.
Maak een forwarder aan, b.v.: test@DIRECTADMINDOMEIN
Destination e-mail moet zijn:
"|/usr/local/bin/php -q /home/DIRECTADMINUSER/domains/DIRECTADMINDOMEIN/public_html/pipe.php"

Als je nu mailt naar test@DIRECTADMINDOMEIN wordt dit gestuurd naar het bestand pipe.php in je home directory.

De teksten met hoofdletter vervangen naar jouw situatie ;)


Toch blijf ik er bij, is het niet veel makkelijker om je vragen GELIJK in te voeren in de database, in plaats van ze eerst te mailen en dan terug uit te lezen?

Reageren