Hey allen,

Gezien ik absoluut niks ken van php, heb ik na opzoeking een code gevonden (formulier met multiple uploads). Maar ik ben niet zeker of het solide en betrouwbaar is, want sommige klanten melden me dat ze wel op de bedankpagina komen, maar ik ontvang hun mail niet.
Kan iemand de onderstaande code nakijken en toevoegen wat nodig is om de code met een gerust hart online te plaatsen?
Dankje.

<?php

// append data to a log file
function _log($log_file,$ip,$email,$message)
{
$str = date('Y-m-d H:i:s') . " IP:$ip, EM:$email, $message\n";
file_put_contents($log_file,$str,FILE_APPEND);
}

$log_file = 'log.txt'; // log text file name

$ip = $_SERVER['REMOTE_ADDR']; // get ip to short variable name for logging purposes

$to = "[email protected]";
$subject= "inschrijving";
$name = $_POST['name'];
$phone = $_POST['phone'];
$email = $_POST['email'];
$website = $_POST['website'];
$beschrijving = $_POST['beschrijving'];
$socialURL = $_POST['socialURL'];
$cmname = $_POST['cmname'];
$faciliteit = $_POST['faciliteit'];
$add = $_POST['add'];
$city = $_POST['city'];
$zip = $_POST['zip'];
$keywords1 = $_POST['keywords1'];
$keywords2 = $_POST['keywords2'];
$keywords3 = $_POST['keywords3'];
$keywords4 = $_POST['keywords4'];
$keywords5 = $_POST['keywords5'];
$keywords6 = $_POST['keywords6'];
$prijslijst = $_POST['prijslijst'];
$openingsuren = $_POST['openingsuren'];
$klikbaar = $_POST['klikbaar'];
$socialFB = $_POST['socialFB'];
$socialTW = $_POST['socialTW'];
$socialIN = $_POST['socialIN'];
$socialGP = $_POST['socialGP'];
$opmerking = $_POST['opmerking'];
$message = "
Faciliteit: $faciliteit
Naam bedrijf: $cmname
Adres: $add, $zip $city

Beschrijving:
$beschrijving

Video:
$socialURL

Kernwoorden:
$keywords1
$keywords2
$keywords3
$keywords4
$keywords5
$keywords6

Prijslijst:
$prijslijst

Openklikbare tekst:
$klikbaar

Contactpersoon: $name
Telefoon: $phone
Email: $email
Website: $website

Openingsuren:
$openingsuren

Facebook: $socialFB
Instagram: $socialIN
Twitter: $socialTW
Google Plus: $socialGP

Verdere opmerkingen:
$opmerking
";
$mime_boundary="==Multipart_Boundary_x".md5(mt_rand())."x";
$headers = "From: $email\r\n" .
"MIME-Version: 1.0\r\n" .
"Content-Type: multipart/mixed;\r\n" .
" boundary=\"{$mime_boundary}\"";
$message = "This is a multi-part message in MIME format.\n\n" .
"--{$mime_boundary}\n" .
"Content-Type: text/plain; charset=\"iso-8859-1\"\n" .
"Content-Transfer-Encoding: 7bit\n\n" .
$message . "\n\n";
foreach($_FILES as $userfile)
{
$tmp_name = $userfile['tmp_name'];
$type = $userfile['type'];
$name = $userfile['name'];
$size = $userfile['size'];
if (file_exists($tmp_name))
{
if(is_uploaded_file($tmp_name))
{
$file = fopen($tmp_name,'rb');
$data = fread($file,filesize($tmp_name));
fclose($file);
$data = chunk_split(base64_encode($data));
}
$message .= "--{$mime_boundary}\n" .
"Content-Type: {$type};\n" .
" name=\"{$name}\"\n" .
"Content-Disposition: attachment;\n" .
" filename=\"{$fileatt_name}\"\n" .
"Content-Transfer-Encoding: base64\n\n" .
$data . "\n\n";
}
}
$message.="--{$mime_boundary}--\n";
if(mail($to, $subject, $message, $headers))
{
echo "Dankje om je gegevens door te zenden.<br>We nemen die door en contacteren je zo snel mogelijk.";
_log($log_file,$ip,$email,'Mail call successful.');

} else {
echo "Error in mail.<br>Probeer opnieuw door hieronder te klikken.";
$last_error = error_get_last();
_log($log_file,$ip,$email,"Mail call failed - {$last_error['message']}");

}
?>
Ik heb die kennis wel, maar dat wil niet zeggen dat ik nu tijd heb om je hele script te doorlopen, en hier te plaatsen. Plus dat voor dergelijke verzoeken het Vacature-forum bedoeld is, omdat je blijkbaar iemand zoekt.
Jammer dat je het nu laat liggen, terwijl ik net de indruk had dat we er bijna waren.
Dankje voor je inspanning, Ariën.
Het punt is dat ik hier vrijwillig zit, en ik niet alle tijd heb. Ook werk gaat natuurlijk voor.
Ik hoop dat je dit begrijpt. Ik zal er anders later even naar kijken, of iemand anders mag zijn licht er op schijnen.
Graag tot later dan, Ariën.
Veel plezier op het werk!
Bruintje Negrito op 05/03/2018 10:37:36
Maar ik ben niet zeker of het solide en betrouwbaar is, want sommige klanten melden me dat ze wel op de bedankpagina komen, maar ik ontvang hun mail niet.

Sja, dat is het nadeel van e-mail, zelfs als je iets succesvol verstuurt is het geen garantie voor ontvangst. Heb je gecontroleerd of deze mail misschien onderschept wordt door een spamfilter of in de spambox zit?

Daarnaast, wat voor attachments worden verstuurd?
Komen alle attachments goed aan (als de mail uberhaupt aankomt lol)?

Mogelijke gotcha: chunk_split voegt ook een \r\n aan het einde toe.

Het script is inconsistent bij regelovergangen: de ene keer \n, de andere keer \r\n.

Enne, log.txt staat in hetzelfde pad als dit script? Dus dit bestand is gewoon op te roepen en te downloaden? Dat lijkt mij niet de bedoeling.

Ook zou je eens naar de broncode van het verstuurde mailtje in verschillende vormen (0 attachments, 1 attachment, meerdere attachments) kunnen kijken of dat er allemaal wel snor uitziet. En dan eens kijken hoe het komt dat sommige mailtjes niet aankomen. Dat laatste lijkt mij wel een showstopper.

EDIT: je zou natuurlijk altijd een kopie kunnen opslaan die buiten e-mail omgaat zodat je een historie hebt van verstuurde mail. En/of een (B)CC kunnen sturen naar de afzender. Dit zodat je altijd ergens een versie van het verstuurde bericht hebt waar je aan kunt refereren. Nu heb je niets als het af en toe aan jouw kant in de papierversnipperaar verdwijnt. Maar aangezien het GMail is, kijk eens in je spamfolder.
Dankje voor je reactie, Thomas.
Wanneer de mail toekomt, is dit altijd met het aantal opgeladen afbeeldingen.

- "gotcha: chunk_split" : begrijp ik niet
- "de ene keer \n, de andere keer \r\n": is dit belangrijk voor de werking?
- "log.txt": dit staat in de code, maar geen idee wat ik ermee moet doen en wat de functie ervan is.

Welke info kan ik uit de broncode halen die helpt om dit formulier optimaal te krijgen?
En gmail is hier in de testcode; ik gebruik een andere mailserver.
Die log-file wordt gevuld zodra het formulier verstuurd wordt. Aan de hand of het wel of niet gelukt is kan je dat uit de log.txt herleiden. Echter zou ik dit niet openbaar zetten, en dan buiten de webroot (de map public_html, htdocs, www, o.i.d). Pas dan ook je pad aan naar dat bestand.

Over de slashes. Ik zou gewoon consistent net als het blok met $headers een \r\n gebruiken.
Verder klopt regel 104 niet. Dat is toch niet de tekst die je in je mail aan de lezer wilt voorschotelen?
Dit is ook een $header namelijk, maar dan moet je hem wel samenvoegen met de andere variabele door
$headers .=
te gebruiken.
Helpt die log.txt iets? Zorgt die ervoor dat mails wel zouden toekomen?
En in het verzenden van de mail met attachments heb ik nog nooit de tekst van regel 104 zien verschijnen, dus geen idee wat die daar staat te blinken.
De log is zoals het al zegt, een 'logboek'.

De reden dat de mails niet aankomen kan veel oorzaken hebben. Het kan ook liggen aan de inrichting van de mailserver of zelfs de DNS. Probeer eens uit te zoeken wat wel en niet aankomt, en of je er een verband in vindt. Denk aan hotmail, live, gmail
domeinenen.

Misschien is het wel zo handig om al je headers eens netjes te groeperen in plaats dat ze her en der in je code staan.
- "gotcha: chunk_split" : begrijp ik niet

Je attachments worden base64 geëncodeerd, en vervolgens in blokken van (standaard) 76 karakters gesplitst. Dit om aan de standaarden (RFC's) van (MIME-)mail te voldoen. chunk_split() is de functie die alles in partjes splitst, en stopt hier (standaard) "\r\n" (dus regelovergangen) als "lijm" tussen. Echter, chunk_split() zet ook een "\r\n" achter de laatste base64-regel, wat dus eigenlijk niet klopt. Voor de goede orde zou deze getrimd moeten worden.

- "de ene keer \n, de andere keer \r\n": is dit belangrijk voor de werking?

Sommige mailservers (en misschien ook tussenstations?) zijn hier héél gevoelig voor. Het beste is eigenlijk om een regelovergangs-constante te definiëren, en deze overal te gebruiken. Initieel zou je deze als "\r\n" kunnen definiëren, en als dit niet werkt kun je deze boem in een keer aanpassen naar "\n".

- "log.txt": dit staat in de code, maar geen idee wat ik ermee moet doen en wat de functie ervan is.

Dit is een soort van manifest die gebeurtenissen registreert. Dit is in het algemeen handig, maar ook in het bijzonder wanneer er mail lijkt te verdwijnen, je kunt dan nagaan dat e-mail ook daadwerkelijk is verstuurd op het moment dat men zegt dat deze verstuurd is.

Oh, nog iets wat mij te binnen schoot: je gebruikt de character encoding "iso-8859-1", maar wat gebruikt jouw website waarin dit formulier zit? Dit is van invloed op je $_POST data en daarmee dus ook of deze data correct wordt weergegeven in je mail. Indien je website of formulier een andere character encoding gebruikt dan kun je niet verwachten dat dit in een "iso-8859-1" setting goed wordt weergegeven.

Reageren