PHP mail() bijlage
Als ik met de mail functie een bijlage wil mee zenden wat kan ik dan het beste doen?
Ik heb een variabel gemaakt maar hoe zet ik dat nu in de header, zodat deze word mee verzonden vanuit de tijdelijke server opslag?
- Een hash aanmaken voor de bijlage
- De bijlage tot string verwerken met Base64
- De string in stukken hakken met chunk_split()
- headers aanmaken
- en nog wat fratsen...
http://webcheatsheet.com/php/send_email_text_html_attachment.php#attachment
Een beter idee is om phpMailer te gebruiken, die kent er een standaard functie voor.
Dit is wat ik ervan heb gemaakt
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
47
48
49
50
51
52
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
47
48
49
50
51
52
<?php
// store some variables
$file_name = $FILES['attachment']['name'];
$temp_name = $FILES['attachment']['tmp_name'];
$file_type = $FILES['attachment']['type'];
// get the extension of the file
$base = basename($file_name);
$extension = substr($base, strlen($base)-4, strlen($base));
// mail essenstials
$to = "[email protected]";
$subject = "Test bijlage";
$message = "Foto";
//attachment things
$file = $temp_name;
$content = chunk_split(base64_encode(file_get_contents($file)));
$uid = md5(uniqid(time()));
$header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n";
$header .= "This is a multi-part message in MIME format.\r\n";
//plain text part
$header .= "--".$uid."\r\n";
$header .= "Content-type:text/plain; charset=iso-8859-1\r\n";
$header .= "Content-transfer-Encoding: 7bit\r\n\r\n";
$header .= $message."\r\n\r\n";
// atachment part
$header .= "--".$uid."\r\n";
$header .= "Content-Type: ".$file_type."; name=\"".$file_name."\"\r\n";
$header .= "Content-Transfer-Encoding: base64\r\n";
$header .= "Content-Disposition: attachment; filename=\"".$file_name."\"\r\n\r\n";
$header .= $content."\r\n\r\n";
mail($to, $subject, "", $header);
?>
<html>
<body>
<form method="POST" action="" enctype="multipart/form-data">
<input type="file" id="attachment_field" name="attachment" value="">
<input type="submit">
</form>
</body>
</html>
// store some variables
$file_name = $FILES['attachment']['name'];
$temp_name = $FILES['attachment']['tmp_name'];
$file_type = $FILES['attachment']['type'];
// get the extension of the file
$base = basename($file_name);
$extension = substr($base, strlen($base)-4, strlen($base));
// mail essenstials
$to = "[email protected]";
$subject = "Test bijlage";
$message = "Foto";
//attachment things
$file = $temp_name;
$content = chunk_split(base64_encode(file_get_contents($file)));
$uid = md5(uniqid(time()));
$header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n";
$header .= "This is a multi-part message in MIME format.\r\n";
//plain text part
$header .= "--".$uid."\r\n";
$header .= "Content-type:text/plain; charset=iso-8859-1\r\n";
$header .= "Content-transfer-Encoding: 7bit\r\n\r\n";
$header .= $message."\r\n\r\n";
// atachment part
$header .= "--".$uid."\r\n";
$header .= "Content-Type: ".$file_type."; name=\"".$file_name."\"\r\n";
$header .= "Content-Transfer-Encoding: base64\r\n";
$header .= "Content-Disposition: attachment; filename=\"".$file_name."\"\r\n\r\n";
$header .= $content."\r\n\r\n";
mail($to, $subject, "", $header);
?>
<html>
<body>
<form method="POST" action="" enctype="multipart/form-data">
<input type="file" id="attachment_field" name="attachment" value="">
<input type="submit">
</form>
</body>
</html>
Ik krijg wel te zien dat er een bijlage is, maar deze is 0kb groot, er zit dus niets achter.
Ik zie zo even niet 1,2,3 wat er nu mis gaat/.
Het is veel gemakkelijker de functies van een library te gebruiken dan zelf rekening te houden met allerlei headers om te zorgen dat alles juist overkomt en niet gelijk als spam wordt gezien.
Je leert er wel veel van... ;-)
Misschien is het gewoon zijn keuze?
Gewijzigd op 05/07/2016 23:13:45 door - Ariën -
Natuurlijk kan ik PHPmailer gebruiken die ik in andere forms al gebruik :)
Ik vond het gewoon leuk een te kijken wat je zelf kan zonder library te gebruiken. De tekst komt goed aan en hij ziet ook dat er een bijlage is alleen word er aangegeven dat deze 0 bytes is en zou graag willen weten waar het niet goed zit in de php code.
@ Arien, dit is precies waarom ik het zelf wil proberen om meer van php en de scripting te leren :)
Gewijzigd op 05/07/2016 23:16:18 door Jop B
Dit moet in eerste instantie $_FILES zijn?
Daarnaast bevat de tmp_name enkel de tijdelijke naam, niet het pad naar je tmp directory (of wel? controleer dit!), dus het openen van een bestand met enkel de bestandsnaam (zonder het juiste pad) zal sowieso niet werken.
Deel je probleem in stukken op, in plaats van aan het einde te constateren dat er geen attachment is verstuurd, dat maakt het nogal moeilijk om op grond daarvan te herleiden wat er onderweg fout gaat (te meer omdat er onderweg een heleboel fout kan gaan in dit geval).
Gewijzigd op 05/07/2016 23:44:00 door Thomas van den Heuvel
De inhoud van de mail is geheel leeg, terwijl de headers wel de inhoud van de mail bevatten. Zowel de tekst als het attachment.
Volgens mij was het logischer geweest om de var $header gewoon $inhoud te noemen en daarna $inhoud als 3e parameter aan mail() te geven.
$header kan dan vervallen.
Vermoedelijk werkt het met $header ook, maar dan puur omdat na de headers de inhoud hoort te volgen en er in $header feitelijk helemaal geen headers staan.
Het zou anders zijn als je ook nog een CC adres zou willen opnemen.
Daarnaast is het misschien wel leuk om dit zelf helemaal uit te puzzelen, maar ik zou dat dan ook alleen maar doen voor een klein, eigen oefenprojectje.
Anders kom je toch steeds weer op een punt dat je eigen functie toch net een of andere functionaliteit mist.
Voorbeeld: voor een project werk ik met een omgeving waar een of andere htmlmail-class gebruikt wordt ipv. een bekendere als phpmailer. Werkt ook prima, maar alleen als je je aan de uitgangspunten houdt.
En als snel wilde ik meer dan 1 attachment mee kunnen sturen, en het ging ook mis toen ik unicode karakters wilde gebruiken.
Ik bedoel te zeggen: een eigen functie maken voor het versturen van mail gaat nooit kunnen tippen aan iets als phpmailer waaraan uren en uren besteed is door talloze programmeurs.
Ivo P op 06/07/2016 10:15:48:
een eigen functie maken voor het versturen van mail gaat nooit kunnen tippen aan iets als phpmailer waaraan uren en uren besteed is door talloze programmeurs.
Niet nooit, maar waarschijnlijk ook niet snel. De vraag is of je zelf de tijdsinvestering kunt/wilt doen om iets soortgelijks te maken. Mogelijk heb je lang niet alle functionaliteit nodig of wil je specifieke aspecten van bestaande functionaliteit verder uitbouwen. Deze investering levert mogelijk ook extra inzicht op.
En er is altijd de gulden middenweg: schrijf een (of meer) wrapper(s) om de PHPMailer class(es) heen, mogelijk specifiek voor hetgeen je er mee wilt doen. Wanneer deze klasses semi-handig zijn opgezet moet je deze verder uit kunnen bouwen.
Een ander bijkomend "voordeel" van wrappers is ontkoppeling van de specifiek gebruikte implementaties. Stel dat je een eigen MyMail klasse hebt geschreven en je gebruikt PHPMailer voor de opbouw en transport. Je zou dan de implementatie van MyMail kunnen aanpassen zonder dat dit van invloed is op code waar deze functionaliteit wordt gebruikt. Dit zou een andere zaak zijn als je overal rechtstreeks (hardcoded) aanroepen van PHPMailer doet. Wanneer je dan van PHPMailer overstapt naar iets anders is dit van invloed op veel meer code. Dit zelfde principe geldt o.a. ook voor databases.
Gewijzigd op 06/07/2016 14:55:21 door Thomas van den Heuvel