Encodering e-mailberichten mislukt
Nu ik mijn e-mailverzending op orde heb met meervoudige bijlagen, is het nu zover dat ik de bijlagen wil gaan openen. Helaas, dat lukt niet. Ik krijg een melding dan mijn codering niet juist is (gegaan).
Welke regel in onderstaande code verzorgt dit?
Voor de goede orde heb ik de inhoud van variabele $body even vastgelegd:
De waarde van $body:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
This is a multi-part message in MIME format. --==Multipart_Boundary_x24ee641efc4abab68a14a09f2c009eacx Content-Transfer-Encoding: 7bit
Test met twee bijlagen
Nee geen twee maar een
--==Multipart_Boundary_x24ee641efc4abab68a14a09f2c009eacx Content-Type: application/pdf; name=20130108_Voorwaarden_deelname_KPN_Compleet_v1_1_def.pdf Content-Transfer-Encoding: base64 Content-disposition: attachment This is a multi-part message in MIME format. --==Multipart_Boundary_x24ee641efc4abab68a14a09f2c009eacx Content-Transfer-Encoding: 7bit
Test met twee bijlagen
Test met twee bijlagen
Nee geen twee maar een
--==Multipart_Boundary_x24ee641efc4abab68a14a09f2c009eacx Content-Type: application/pdf; name=20130108_Voorwaarden_deelname_KPN_Compleet_v1_1_def.pdf Content-Transfer-Encoding: base64 Content-disposition: attachment This is a multi-part message in MIME format. --==Multipart_Boundary_x24ee641efc4abab68a14a09f2c009eacx Content-Transfer-Encoding: 7bit
Test met twee bijlagen
Mijn PHP-code:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
$html = true;
$headers = 'From: ' . $cAfzenderEmail . PHP_EOL;
$headers .= 'Reply-To: ' . $cAfzenderEmail . PHP_EOL;
$headers .= 'X-Mailer: PHP/' . phpversion() . PHP_EOL;
$headers .= 'X-Priority: Normal' . PHP_EOL;
$headers .= ($html) ? 'MIME-Version: 1.0' . PHP_EOL : '';
//email bestaat uit meerdere bestanden dus vertel wat de scheidings teken is en dat het een multipart is
$headers .= "Content-Type: multipart/mixed; boundary=\"" . $mime_boundary . "\"\r\n";
//we zenden een attachment mee
$headers .= "Content-Disposition: attachment\r\n";
$nAfteller = 0;
while($nAfteller <= $nBijlagen) {
//readfile
//$fp = fopen($_FILES['bijlage']['tmp_name'],'r');
$fp = fopen($_FILES['bijlage']['name'][$nAfteller]);
$bestand = fread($fp,$_FILES['bijlage']['size'][$nAfteller]);
fclose($fp);
//create body
//generenen een body. Dit is een multi part gezeik
$body.= "This is a multi-part message in MIME format.\r\n";
$body.= "\r\n";
//boundary
$body.= "--" . $mime_boundary . "\r\n";
//content type + charater set (iso in dit geval)
//$body .= ($html) ? 'Content-type: text/html; charset=UTF-8' . PHP_EOL : '';
//codering (7 bit)
$body.= "Content-Transfer-Encoding: 7bit\r\n";
$body.= "\r\n";
//het bericht
$body.= nl2br($_POST['editor1']) ."\r\n";
//boundary
$body.= "--" . $mime_boundary . "\r\n";
//content type + naam bestand (database.sql)
//$body .= "Content-Type: application/octet-stream; name=".$_FILES['bijlage']['name'][$nAfteller]."\r\n";
$body .= "Content-Type: " . MimeExtensie($_FILES['bijlage']['name'][$nAfteller]) . " name=" . $_FILES['bijlage']['name'][$nAfteller] . "\r\n";
//codering
$body .= "Content-Transfer-Encoding: base64\r\n";
//als bijlage toegevoegd
$body.= "Content-disposition: attachment\r\n";
$body .= "\n";
$body .= chunk_split(base64_encode($bestand )) . "\r\n";
$nAfteller++;
echo $body;
}
?>
$html = true;
$headers = 'From: ' . $cAfzenderEmail . PHP_EOL;
$headers .= 'Reply-To: ' . $cAfzenderEmail . PHP_EOL;
$headers .= 'X-Mailer: PHP/' . phpversion() . PHP_EOL;
$headers .= 'X-Priority: Normal' . PHP_EOL;
$headers .= ($html) ? 'MIME-Version: 1.0' . PHP_EOL : '';
//email bestaat uit meerdere bestanden dus vertel wat de scheidings teken is en dat het een multipart is
$headers .= "Content-Type: multipart/mixed; boundary=\"" . $mime_boundary . "\"\r\n";
//we zenden een attachment mee
$headers .= "Content-Disposition: attachment\r\n";
$nAfteller = 0;
while($nAfteller <= $nBijlagen) {
//readfile
//$fp = fopen($_FILES['bijlage']['tmp_name'],'r');
$fp = fopen($_FILES['bijlage']['name'][$nAfteller]);
$bestand = fread($fp,$_FILES['bijlage']['size'][$nAfteller]);
fclose($fp);
//create body
//generenen een body. Dit is een multi part gezeik
$body.= "This is a multi-part message in MIME format.\r\n";
$body.= "\r\n";
//boundary
$body.= "--" . $mime_boundary . "\r\n";
//content type + charater set (iso in dit geval)
//$body .= ($html) ? 'Content-type: text/html; charset=UTF-8' . PHP_EOL : '';
//codering (7 bit)
$body.= "Content-Transfer-Encoding: 7bit\r\n";
$body.= "\r\n";
//het bericht
$body.= nl2br($_POST['editor1']) ."\r\n";
//boundary
$body.= "--" . $mime_boundary . "\r\n";
//content type + naam bestand (database.sql)
//$body .= "Content-Type: application/octet-stream; name=".$_FILES['bijlage']['name'][$nAfteller]."\r\n";
$body .= "Content-Type: " . MimeExtensie($_FILES['bijlage']['name'][$nAfteller]) . " name=" . $_FILES['bijlage']['name'][$nAfteller] . "\r\n";
//codering
$body .= "Content-Transfer-Encoding: base64\r\n";
//als bijlage toegevoegd
$body.= "Content-disposition: attachment\r\n";
$body .= "\n";
$body .= chunk_split(base64_encode($bestand )) . "\r\n";
$nAfteller++;
echo $body;
}
?>
In http://www.phphulp.nl/php/forum/topic/emailbericht-met-meerdere-bijlagen/96114/last/ is ook al gevraagd waarom geen gebruik maken van phpmailer of swiftmailer?
Je reactie daar, dat het niet kan, begrijp ik nog steeds niet. Of je nu zelf de mailfunctie van php aanroept of via een class. Voordeel van laatste is echter dat veel problemen waar jij nu tegen aan loopt al opgelost zijn.
Ik heb het advies opgevolgd om ded class van phpmailer te installeren. Het verzenden van meerdere bijlagen gaat nu goed alleen zijn deze bijlagen niet te openen vanwege een decoderingsfout. Dat had ik in eerste instantie ook.
Omdat ik in de code van phpmailer niets zie over het decoderen van bepaalde typen bestanden loop ik even vast.
Is er iemand die mij verder kan helpen?
George
Om in het wiel uitvinden te blijven:
Er is je aangeraden om een wiel te gebruiken dat al uitgevonden was. Dat probeer je maar mogelijk omdat je het puntje: pomp de band op" overgeslagen hebt, wil je weer geheel terug?
Met phpmailer zou het voldoende zijn om
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$mailer = new phpmailer();
$mailer->AddAttachement('path/naar/file1.pdf');
$mailer->AddAttachement('path/naar/file2.pdf');
?>
$mailer = new phpmailer();
$mailer->AddAttachement('path/naar/file1.pdf');
$mailer->AddAttachement('path/naar/file2.pdf');
?>
te doen.
Hoe doe jij het?
Mijn code:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
require_once "plugins/mailer/class.phpmailer.php";
$aBijlage = array();
$aBijlage = $_FILES['bijlage']['name'];
$nBijlagen = count($aBijlage); // Tellen aantal bijlagen
$cGeadresseerde = $_SESSION['inlognaam'];
$cAfzenderEmail = $_SESSION['inlognaam'];
// Start de class van phpmailer
$mail = new PHPMailer();
$body = $cEmailbericht;
$body = eregi_replace("[\]",'',$body);
$mail->AddReplyTo($cAfzenderEmail,"");
$mail->SetFrom($cAfzenderEmail, "");
$address = $cGeadresseerde;
$mail->AddAddress($address, "");
$mail->Subject = $cOnderwerp;
$mail->AltBody = "To view the message, please use an HTML compatible email viewer!";
$mail->MsgHTML($body);
$nAfteller = 0;
while($nAfteller < $nBijlagen) { // Hier voeg ik de bijlagen toe !!
$mail->AddAttachment($_FILES['bijlage']['name'][$nAfteller]); // attachment
$nAfteller++;
}
if(!$mail->Send()) {
echo "Mailer Error: " . $mail->ErrorInfo;
} else {
echo "Message sent!";
}
?>
require_once "plugins/mailer/class.phpmailer.php";
$aBijlage = array();
$aBijlage = $_FILES['bijlage']['name'];
$nBijlagen = count($aBijlage); // Tellen aantal bijlagen
$cGeadresseerde = $_SESSION['inlognaam'];
$cAfzenderEmail = $_SESSION['inlognaam'];
// Start de class van phpmailer
$mail = new PHPMailer();
$body = $cEmailbericht;
$body = eregi_replace("[\]",'',$body);
$mail->AddReplyTo($cAfzenderEmail,"");
$mail->SetFrom($cAfzenderEmail, "");
$address = $cGeadresseerde;
$mail->AddAddress($address, "");
$mail->Subject = $cOnderwerp;
$mail->AltBody = "To view the message, please use an HTML compatible email viewer!";
$mail->MsgHTML($body);
$nAfteller = 0;
while($nAfteller < $nBijlagen) { // Hier voeg ik de bijlagen toe !!
$mail->AddAttachment($_FILES['bijlage']['name'][$nAfteller]); // attachment
$nAfteller++;
}
if(!$mail->Send()) {
echo "Mailer Error: " . $mail->ErrorInfo;
} else {
echo "Message sent!";
}
?>
Toevoeging op 20/10/2014 11:57:10:
Sorry, ik had een klein foutje over het hoofd gezien.
Helaas krijg ik nu geen bestanden meer mee:
Code (php)
Deze echo toont wel de juiste bestandsnamen alleen worden zij niet bijgesloten in de mail.
(De echo staat er alleen voor foutlokalisatie)
Gewijzigd op 20/10/2014 11:37:07 door George van Baasbank
dat zal niet bestaan.
Daarin tref je de naam aan die de file voor het uploaden had bij de bezoeker van de site.
$_FILES['bijlage']['tmp_name'][$nAfteller] zal beter gaan.
---
$body = eregi_replace("[\]",'',$body);
Je replacet dus case-ongevoelig een \ ?
ten eerste ken ik geen hoofdletter \
ten tweede zou str_replace() genoeg zijn
en tenslotte, zou je je even af moeten vragen waarom er kennelijk overtollige \ voor kan komen in je bericht...
je emuleert hier strip_slashes() en dat is een functie die je nooit nodig moet hebben
Het gaat steeds beter. Ik krijg na jouw opmerking wel bestanden binnen maar die hebben een totaal andere nam: phpHnau87.dat. Dat zal de tmp-name wel zijn maar hoe krijg ik dat weer goed?
P.S.: De "$body = eregi_replace("[\]",'',$body);" heb ik verwijderd
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
while($nAfteller < $nBijlagen) {
$mail->AddAttachment($_FILES['bijlage']['tmp_name'][$nAfteller]); // attachment
//echo $_FILES['bijlage']['name'][$nAfteller];
$nAfteller++;
}
?>
while($nAfteller < $nBijlagen) {
$mail->AddAttachment($_FILES['bijlage']['tmp_name'][$nAfteller]); // attachment
//echo $_FILES['bijlage']['name'][$nAfteller];
$nAfteller++;
}
?>
http://phpmailer.worxware.com/?pg=tutorial
ongeveer op de helft
Gewijzigd op 20/10/2014 12:26:57 door Ivo P
Met de volgende code (PHPMailer) is alles gelukt:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
// Start PHPMailer
$mail = new PHPMailer();
$mail->IsHTML(true);
$body = $cBericht2;
$mail->AddReplyTo($cAfzenderEmail,"");
$mail->SetFrom($cAfzenderEmail, "");
$address = $cGeadresseerde;
$mail->AddAddress($address, "");
$mail->Subject = $cOnderwerp;
$mail->AltBody = "Om dit bericht te kunnen lezen is een HTML-compatibel browser nodig!";
$mail->MsgHTML($body);
$nAfteller = 0;
while($nAfteller < $nBijlagen) {
$mail->AddAttachment($_FILES['bijlage']['tmp_name'][$nAfteller],$_FILES['bijlage']['name'][$nAfteller]); // Voeg attachment toe
$nAfteller++;
}
$mail->Send();
// Einde PHPMailer
?>
// Start PHPMailer
$mail = new PHPMailer();
$mail->IsHTML(true);
$body = $cBericht2;
$mail->AddReplyTo($cAfzenderEmail,"");
$mail->SetFrom($cAfzenderEmail, "");
$address = $cGeadresseerde;
$mail->AddAddress($address, "");
$mail->Subject = $cOnderwerp;
$mail->AltBody = "Om dit bericht te kunnen lezen is een HTML-compatibel browser nodig!";
$mail->MsgHTML($body);
$nAfteller = 0;
while($nAfteller < $nBijlagen) {
$mail->AddAttachment($_FILES['bijlage']['tmp_name'][$nAfteller],$_FILES['bijlage']['name'][$nAfteller]); // Voeg attachment toe
$nAfteller++;
}
$mail->Send();
// Einde PHPMailer
?>
De oplossing in AddAttachment was dus heel simpel
Topic gesloten
George