MailForm PHP-scriptje om 3 attachments te sturen..(opgelost)

Ik wil graag onderstaand PHP-mailform-Script ombouwen zodat er max. 3 attachments mee verstuurd kunnen worden.

Nou ben ik zelf al flink aan het stoeien geweest ermee en heb ook gezocht naar eventuele andere oplossingen, maar dit lijkt toch het beste te werken naar mijn idee.
Alleen lukt het me niet om het goed werkend te krijgen met meerdere attachments.
Het scriptje verstuurd wel heel netjes een email met een attachment, maar wat ik ook heb geprobeerd te veranderen en toe te voegen eraan, het blijft maar bij 1 attachment wat mee gestuurd wordt. Blijkbaar onbreekt er nogal wat PHP-kennis bij mij… :wink:

Als iemand mij ermee kan helpen, dan gaarne.

Later, als het werkt, wil ik ook het aantal input-velden uitbreiden en daarbij ook hier en daar scrolldown menu’tjes erin plaatsen. Dit lukt me wel in een HTML-form, maar nog niet in PHP. Maar dat zal wel m’n volgende topic worden… :wink:

Hieronder volgt het PHP-scriptje.

[code:1:c0b8cea985]
<?php

$maxfilesize = 512000; // in bytes
$mailto = ‘user@domain.com’;

define (‘CR’, “n”);
define (‘CRLF’, “rn”);

// Initialize
$msg = ‘’;
$name= ‘’;
$email = ‘’;
$remark = ‘’;

if ($_SERVER[‘REQUEST_METHOD’] == ‘POST’) {

if (isset($_POST[‘name’])) $name = $_POST[‘name’];
if (isset($_POST[‘email’])) $email = $_POST[‘email’];
if (isset($_POST[‘remark’])) $remark = $_POST[‘remark’];

if (get_magic_quotes_gpc()) {

$name = stripslashes&#40;$name&#41;;
$email = stripslashes&#40;$email&#41;;
$remark = stripslashes&#40;$remark&#41;;

}

// Check for errors

if (!preg_match(’/S+/’, $name)) $msg .= ‘<b>No name specified !</b><br />’;
if (!preg_match(’/S+/’, $email)) $msg .= ‘<b>No email address specified !</b><br />’;
elseif (!preg_match(’/^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*@([a-zA-Z0-9-]+.)+[a-zA-Z]{2,4}$/’, $email)) $msg .= ‘<b>Invalid email address !</b><br />’;

if (!$_FILES[‘file1’][‘tmp_name’]) {

$msg .= '&lt;b&gt;No file was uploaded !&lt;/b&gt;&lt;br /&gt;';

} else {

if &#40;is_uploaded_file&#40;$_FILES&#91;'file1'&#93;&#91;'tmp_name'&#93;&#41;&#41; &#123;

  // check for any errors
  switch &#40;$_FILES&#91;'file1'&#93;&#91;'error'&#93;&#41; &#123;

    case 0&#58;
      break;
    case 1&#58;
      $msg .= '&lt;b&gt;Filesize exceeds maximum specified for upload_max_filesize !&lt;/b&gt;&lt;br /&gt;';
      break;
    case 2&#58;
      $msg .= '&lt;b&gt;Filesize exceeds MAX_FILE_SIZE specified in the form !&lt;/b&gt;&lt;br /&gt;';
      break;
    case 3&#58;
      $msg .= '&lt;b&gt;File was only partially received !&lt;/b&gt;&lt;br /&gt;';
      break;
    case 4&#58;
      $msg .= '&lt;b&gt;No file was uploaded !&lt;/b&gt;&lt;br /&gt;';
      break;
    case 5&#58;
      $msg .= '&lt;b&gt;Uploaded file is empty !&lt;/b&gt;&lt;br /&gt;';
      break;

  &#125;

&#125; else &#123;

  $msg = '&lt;b&gt;Possible file upload attack&lt;/b&gt;&lt;br /&gt;';

&#125;

}

if (!preg_match(’/S+/’, $remark)) $msg .= ‘<b>No remark specified</b><br />’;

// no errors?

if (!$msg) {

// create mail and attach the uploaded file

$fp = fopen&#40;$_FILES&#91;'file1'&#93;&#91;'tmp_name'&#93;, 'r'&#41;;
$attachment = fread&#40;$fp, $_FILES&#91;'file1'&#93;&#91;'size'&#93;&#41;;
$attachment = chunk_split&#40;base64_encode&#40;$attachment&#41;&#41;;

$mailheader  = 'From&#58; &quot;'.$name.'&quot;&lt;'.$email.'&gt;'.CRLF.
               'MIME-Version&#58; 1.0'.CRLF.
               'Content-Type&#58; multipart/mixed; boundary=&quot;MIME_BOUNDARY&quot;'.CRLF.
               'X-Sender&#58; &lt;'.$email.'&gt;'.CRLF.
               'X-Mailer&#58; PHP4'.CRLF.
               'X-Priority&#58; 3'.CRLF.
               'Return-Path&#58; &lt;'.$email.'&gt;'.CRLF;
$subject = 'Form-Submit by '.$name;
$mailcontent = '--MIME_BOUNDARY'.CR.
               'Content-Type&#58; text/plain; charset=&quot;iso-8859-1&quot;'.CR.
               'Content-Transfer-Encoding&#58; quoted-printable'.CR.
               CR.$remark.CR.
               CR.'--MIME_BOUNDARY'.CR.
               'Content-Type&#58; '.$_FILES&#91;'file1'&#93;&#91;'type'&#93;.'; name=&quot;'.$_FILES&#91;'file1'&#93;&#91;'name'&#93;.'&quot;'.CR.
               'Content-disposition&#58; attachment'.CR.
               'Content-Transfer-Encoding&#58; base64'.CR.
               CR.$attachment.CR.
               '--MIME_BOUNDARY--'.CR;

mail&#40;$mailto, $subject, $mailcontent, $mailheader&#41;;

$msg = '&lt;b&gt;Your file has been sent successfully!&lt;/b&gt;&lt;br /&gt;';
$name = '';
$email = '';
$remark = '';

}

}

?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<link rel="stylesheet" type="text/css" href="resources/styles.css">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Mail with attachment</title>
</head>
<body>
<?php

if ($msg) {

echo ‘Message:<br /><br />’.$msg;

}

?>
<form enctype=“multipart/form-data” method=“post” action="<?php echo $_SERVER[‘PHP_SELF’]; ?>">
<br>
<b>From: </b><input type=“text” name=“name” maxlength=“30” value="<?php echo $name; ?>" /><br />
<b>Email: </b><input type=“text” name=“email” maxlength=“50” value="<?php echo $email; ?>" /><br />
<br><b>Photo 1: </b><input type=“hidden” name=“MAX_FILE_SIZE” value="<?php echo $maxfilesize; ?>" /><input type=“file” name=“file1” /><br />
<br><b>Remark: </b><br /><textarea name=“remark” rows=“9” cols=“45” ><?php echo $remark; ?> </textarea><br />
<br><input type=“submit” value=“Submit” />
</form>
</body>
</html>
[/code:1:c0b8cea985]

Denk niet dat het aan je php kennis op zich ligt. Het ligt meer aan de kennis over hoe e-mail met attachments gevormd worden.

Ik denk dat je het stuk met de attachment voor elke attachment moet herhalen, zo ver ik weet werkt dat goed.

Dus het stuk na de 2e ‘CR.’–MIME_BOUNDARY’.CR.’ herhalen voor elke attachment.

Ik heb dat net even zitten te proberen, met meerdere variaties daarop, maar dat wilde nog niet lukken. Ik zal me eens verdiepen in de opbouw van een email-bericht. Dat lijkt me een goed plan...

Thanks alvast.
Herman.

volgens mij moet het ongeveer als volgt:

verwijder het stuk:
$fp = fopen($_FILES[‘file1’][‘tmp_name’], ‘r’);
$attachment = fread($fp, $_FILES[‘file1’][‘size’]);
$attachment = chunk_split(base64_encode($attachment));
dit moet je namelijk voor al je $_FILES loopen

en vervang het stuk:
$mailcontent = ‘–MIME_BOUNDARY’.CR.
‘Content-Type: text/plain; charset=“iso-8859-1”’.CR.
‘Content-Transfer-Encoding: quoted-printable’.CR.
CR.$remark.CR.
CR.’–MIME_BOUNDARY’.CR.
‘Content-Type: ‘.$_FILES[‘file1’][‘type’].’; name="’.$_FILES[‘file1’][‘name’].’"’.CR.
‘Content-disposition: attachment’.CR.
‘Content-Transfer-Encoding: base64’.CR.
CR.$attachment.CR.
‘–MIME_BOUNDARY–’.CR;

voor:

//set mailcontent
$mailcontent = ‘–MIME_BOUNDARY’.CR.‘Content-Type: text/plain; charset=“iso-8859-1”’.CR.‘Content-Transfer-Encoding: quoted-printable’.CR.CR.$remark.CR;

foreach($_FILES as $thisfile)//loop thru all uploaded files
{
//encode attachment – only if there is any
if ($thisfile[‘tmp_name’] && $thisfile[‘size’] > 0)
{
$fp = fopen($thisfile[‘tmp_name’], ‘r’);
$attachment = fread($fp, $thisfile[‘size’]);
$attachment = chunk_split(base64_encode($attachment));

	$mailcontent .= CR.'--MIME_BOUNDARY'.CR.'Content-Type: '.$thisfile['type'].'; name="'.$thisfile['name'].'"'.CR.'Content-disposition: attachment'.CR.'Content-Transfer-Encoding: base64'.CR. CR.$attachment.CR; 
	} 
}

$mailcontent .= ‘–MIME_BOUNDARY–’.CR; //only once!!!

Bedankt voor de hulp Walinsky,

Alleen na deze aanpassingen krijg ik een parse-error op deze regel;

$attachment = fread($fp, $thisfile['size']); 

Kan er iets misgegaan zijn misschien?

PB me even de hele code ...ik zie nu ook dat ik de remarks loop;heb ik bovenin gewijzigd

You've got PB ! :)

you've got mail :o

Het is heel annoying maar op mijn server geeft ie nog steeds een foutmelding, terwijl het op jouw server/site wel goed werkt.

De PHP-versie op mijn server is 4.3.3, da’s behoorlijk recent lijkt me. Dus lijkt me sterk dat het daar aan ligt.

Probleem opgelost... Het lag dus aan de HTML/PHP tekst-editing software.

Ik heb net BBEdit gedowned, en zag meerdere vreemde tekens tussen de tekst staan. Heb deze weggefilterd en nu werkt het scriptje naar behoren… Zelfs de 3 attachements komen vlekkeloos door.

Mr. Walinsky, Muchos thanks voor de hulp en je laatste tip… :wink:

Denk erom dat het nu 'quick and dirty' in elkaar zit; je hebt nog geen echte checking op je uploads gedaan. [url=http://www.php.net/manual/en/features.file-upload.errors.php]Php manual[/url] geeft een goede omschrijving van de error-messages die in je $_FILES array zit. Tevens worden de uploadrestricties (max-filesize en .jpg) client-side geinterpreteerd; Zoals je gezien hebt kon ik zonder problemen een .png uploaden. Je checks moet je uit veiligheidsoverwegingen _altijd_ server-side doen.

cheers

Daar zal ik nog aandacht aan moeten besteden ja. Ik was op de achtergrond al een beetje bezig met de uiteindelijke layout van de form. En uiteraard mogen deze tests niet ontbreken in de final versie.

Thanks,
Herman.