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']}");

}
?>
Dankje heren, om een nitwit kennis bij te geven.
Hoe worden headers gegroepeerd?
En dus moet er consequent altijd \r\n staan waar nu \n staat?
Die log.txt lijkt me zinloos, want ik zal het nooit weten wanneer een mail niet toekomt. Dan heb ik gewoon een ontevreden klant die denkt dat hij me niet interesseert.
Ik werk via One.com, en hier vind je het formulier: https://www.lichaamengeest.be/nieuw.php
Wat moet er nog allemaal aangepast worden?
De headers kan je prima bij elkaar zetten in de code, en is dus geen technische term ofzo. Het gaat puur om de logica goed bijelkaar te te houden. Ikzelf zou de voor de mail() functie plaatsen, omdat het daar ook betrekking bij heeft.

En die log kan zeker interessant zijn. Je weet immers niet van te voren of een mail wel of niet wordt verstuurd. Misschien kan je bij een hoop 'fails' wel een logica erin vinden die je op pad kan helpen om de oorzaak te vinden.
De headers staan toch allemaal mooi samen?

$headers = 'From: ' . $website_naam . ' <' . $eigen_emailadres . '>' . "\r\n";
$headers .= 'Reply-To: ' . $naam_verzender . ' <' . $email_verzender . '>' . "\r\n";
$headers .= 'Return-Path: Mail-Error <' . $error_emailadres . '>' . "\r\n";
$headers .= ($bcc_emailadres != '') ? 'Bcc: ' . $bcc_emailadres . "\r\n" : '';
$headers .= 'X-Mailer: PHP/' . phpversion() . "\r\n";
$headers .= 'X-Priority: Normal' . "\r\n";
$headers .= ($html) ? 'MIME-Version: 1.0' . "\r\n" : '';
$headers .= ($html) ? 'Content-type: text/html; charset=iso-8859-1' . "\r\n" : '';
$headers .= ($html) ? "Content-Type: multipart/mixed;\r\n" .
$headers .= ($html) ? "boundary=\"{$mime_boundary}\"";


Dus dan maak ik een www.domain.com/logs/log.txt aan, pas de url aan in de code en zien wat er te lezen valt?
In je laatste code die je hebt laten zien staan de $headers bovenaan.
Ikzelf zou ze liever bovenaan je mail-functie plaatsen, zodat je niet straks rot hoeft te zoeken in je code.
De variabelen voor de waardes die je invoert zou ik dan bovenaan zetten.

Verder zou ik je log niet zichtbaar hebben voor jan-en-alleman. En dus buiten de webroot (htdocs, public_html etc...).
Waar staat de "mail() functie"? Is dat "if(mail($to, $subject, $message, $headers))"?
public_html heb ik niet; htdocs geen idee ... Bij One.com heb ik dat niet.

Is dit beter?


<?php

$_POST['name'];
$_POST['phone'];
$_POST['email'];
$_POST['website'];
$_POST['beschrijving'];
$_POST['socialURL'];
$_POST['cmname'];
$_POST['faciliteit'];
$_POST['add'];
$_POST['city'];
$_POST['zip'];
$_POST['keywords1'];
$_POST['keywords2'];
$_POST['keywords3'];
$_POST['keywords4'];
$_POST['keywords5'];
$_POST['keywords6'];
$_POST['prijslijst'];
$_POST['openingsuren'];
$_POST['klikbaar'];
$_POST['socialFB'];
$_POST['socialTW'];
$_POST['socialIN'];
$_POST['socialGP'];
$_POST['opmerking'];

// 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\r\n";
file_put_contents($log_file,$str,FILE_APPEND);
}

$log_file = 'http://www.domain.com/logs/log.txt';; // log text file name

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

$website_naam = 'Mijn Site';
$eigen_emailadres = '[email protected]';
$error_emailadres = '[email protected]';
$naam_verzender = 'Afzender';
$email_verzender = 'emailadres_van_verzender@zijn_domein.nl';
$bcc_emailadres = '[email protected]';
$html = true;

$to = "[email protected]";
$subject= "inschrijving";
$message = "
Faciliteit: $_POST['faciliteit'];
Naam bedrijf: $_POST['cmname'];
Adres: $_POST['add']; $_POST['zip']; $_POST['city'];

Beschrijving:
$_POST['beschrijving'];

Video:
$_POST['socialURL'];

Kernwoorden:
$_POST['keywords1'];
$_POST['keywords2'];
$_POST['keywords3'];
$_POST['keywords4'];
$_POST['keywords5'];
$_POST['keywords6'];

Prijslijst:
$_POST['prijslijst'];


Openklikbare tekst:
$_POST['klikbaar'];


Contactpersoon: $_POST['name'];
Telefoon: $_POST['phone'];
Email: $_POST['email'];
Website: $_POST['website'];

Openingsuren:
$_POST['openingsuren'];

Facebook: $_POST['socialFB'];
Instagram: $_POST['socialIN'];
Twitter: $_POST['socialTW'];
Google Plus: $_POST['socialGP'];

Verdere opmerkingen:
$_POST['opmerking'];
";
$mime_boundary="==Multipart_Boundary_x".md5(mt_rand())."x";
$message = "This is a multi-part message in MIME format.\n\n" .
"--{$mime_boundary}\r\n" .
"Content-Type: text/plain; charset=\"iso-8859-1\"\r\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}\r\n" .
"Content-Type: {$type};\r\n" .
" name=\"{$name}\"\r\n" .
"Content-Disposition: attachment;\r\n" .
" filename=\"{$fileatt_name}\"\r\n" .
"Content-Transfer-Encoding: base64\n\n" .
$data . "\n\n";
}
}
$message.="--{$mime_boundary}--\r\n";

$headers = 'From: ' . $website_naam . ' <' . $eigen_emailadres . '>' . "\r\n";
$headers .= 'Reply-To: ' . $naam_verzender . ' <' . $email_verzender . '>' . "\r\n";
$headers .= 'Return-Path: Mail-Error <' . $error_emailadres . '>' . "\r\n";
$headers .= ($bcc_emailadres != '') ? 'Bcc: ' . $bcc_emailadres . "\r\n" : '';
$headers .= 'X-Mailer: PHP/' . phpversion() . "\r\n";
$headers .= 'X-Priority: Normal' . "\r\n";
$headers .= ($html) ? 'MIME-Version: 1.0' . "\r\n" : '';
$headers .= ($html) ? 'Content-type: text/html; charset=iso-8859-1' . "\r\n" : '';
$headers .= ($html) ? "Content-Type: multipart/mixed;\r\n" .
$headers .= ($html) ? "boundary=\"{$mime_boundary}\"";

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']}");

}
?>
Regel 3 t/m 27 zijn ook onnodig.

Kijk anders in een apart .php-bestand met dit wat je volledige pad is:
<?php
echo "Je volledig pad is: ".$_SERVER['DOCUMENT_ROOT'];
?>

Misschien kan je in je FTP-programma wel een mapje hogerop komen om je log veilig te stellen.
En als je wilt loggen moet je op lijn 36 geen URL invoeren, maar de bestandsnaam. Als je ../ ervoor gebruikt, dan ga je een mapje hoger.
Dit komt er wanneer ik je code in een nieuw doc steek: /customers/5/6/9/DOMAIN.COM/httpd.www
Hoe heet mijn log.txt dan?
Ik heb ook overal waar "\n" stond er "\r\n" van gemaakt. Dat mocht?
Ik weet niet of je in FTP een mapje hoger kan komen, en anders kan je hem ook in een beveiligde map plaatsen.
Zo te zien kan je bij one.com ook mappen beveiligen met een password. Dan is je logbestand ook veilig, als je hem daar in plaatst.
Aangemaakt. Dus dit is nu mijn beveiligde url: https://www.DOMAIN.com/logs
Dus nu een log.text aanmaken en in die folder opladen, en dan deze aanpassen:
$log_file = 'http://www.domain.com/logs/log.txt';;

Is de aanpassing van de "\r\n" correct?

Dan ziet de code er zo uit:
Is dit het meest mogelijk beveiligd?

<?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\r\n";
file_put_contents($log_file,$str,FILE_APPEND);
}

$log_file = 'http://www.domain.com/logs/log.txt';; // log text file name

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

$website_naam = 'Mijn Site';
$eigen_emailadres = '[email protected]';
$error_emailadres = '[email protected]';
$naam_verzender = 'Afzender';
$email_verzender = 'emailadres_van_verzender@zijn_domein.nl';
$bcc_emailadres = '[email protected]';
$html = true;

$to = "[email protected]";
$subject= "inschrijving";
$message = "
Faciliteit: $_POST['faciliteit'];
Naam bedrijf: $_POST['cmname'];
Adres: $_POST['add']; $_POST['zip']; $_POST['city'];

Beschrijving:
$_POST['beschrijving'];

Video:
$_POST['socialURL'];

Kernwoorden:
$_POST['keywords1'];
$_POST['keywords2'];
$_POST['keywords3'];
$_POST['keywords4'];
$_POST['keywords5'];
$_POST['keywords6'];

Prijslijst:
$_POST['prijslijst'];


Openklikbare tekst:
$_POST['klikbaar'];


Contactpersoon: $_POST['name'];
Telefoon: $_POST['phone'];
Email: $_POST['email'];
Website: $_POST['website'];

Openingsuren:
$_POST['openingsuren'];

Facebook: $_POST['socialFB'];
Instagram: $_POST['socialIN'];
Twitter: $_POST['socialTW'];
Google Plus: $_POST['socialGP'];

Verdere opmerkingen:
$_POST['opmerking'];
";
$mime_boundary="==Multipart_Boundary_x".md5(mt_rand())."x";
$message = "This is a multi-part message in MIME format.\n\n" .
"--{$mime_boundary}\r\n" .
"Content-Type: text/plain; charset=\"iso-8859-1\"\r\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}\r\n" .
"Content-Type: {$type};\r\n" .
" name=\"{$name}\"\r\n" .
"Content-Disposition: attachment;\r\n" .
" filename=\"{$fileatt_name}\"\r\n" .
"Content-Transfer-Encoding: base64\n\n" .
$data . "\n\n";
}
}
$message.="--{$mime_boundary}--\r\n";

$headers = 'From: ' . $website_naam . ' <' . $eigen_emailadres . '>' . "\r\n";
$headers .= 'Reply-To: ' . $naam_verzender . ' <' . $email_verzender . '>' . "\r\n";
$headers .= 'Return-Path: Mail-Error <' . $error_emailadres . '>' . "\r\n";
$headers .= ($bcc_emailadres != '') ? 'Bcc: ' . $bcc_emailadres . "\r\n" : '';
$headers .= 'X-Mailer: PHP/' . phpversion() . "\r\n";
$headers .= 'X-Priority: Normal' . "\r\n";
$headers .= ($html) ? 'MIME-Version: 1.0' . "\r\n" : '';
$headers .= ($html) ? 'Content-type: text/html; charset=iso-8859-1' . "\r\n" : '';
$headers .= ($html) ? "Content-Type: multipart/mixed;\r\n" .
$headers .= ($html) ? "boundary=\"{$mime_boundary}\"";

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']}");

}
?>
Je schrijft naar een bestand, en NIET naar een URL.
Dus je moet enkel je bestandsnaam opgeven.

Reageren