PHP mail() bijlage

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Bryan De Baar

Bryan De Baar

05/07/2016 13:42:49
Quote Anchor link
Beste,


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?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
//$_FILES slaat tijdelijk file's op
$attachment = $_FILES["attachment"]["type"];
?>
 
PHP hulp

PHP hulp

25/04/2024 08:57:05
 
- Ariën  -
Beheerder

- Ariën -

05/07/2016 13:47:23
Quote Anchor link
Daar is geen standaard functie voor in PHP, en je zult zelf een hoop dingen moeten regelen:
- 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.
 
Jop B

Jop B

05/07/2016 22:46:35
Quote Anchor link
Graag wil ik even inspringen op deze topic,

Dit is wat ik ervan heb gemaakt

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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>


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/.
 
Michael -

Michael -

05/07/2016 23:05:54
Quote Anchor link
De mail() functie is leuk als je logs o.i.d. naar je zelf wilt sturen, maar als je meer wilt kun je beter, zoals Arien al zei, een library gebruiken waarvan PHPMailer een hele bekende is.
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.
 
- Ariën  -
Beheerder

- Ariën -

05/07/2016 23:13:29
Quote Anchor link
Maar het kan soms ook wel eens interessant zijn om het op de 'vanilla' manier te doen, zonder libraries.
Je leert er wel veel van... ;-)

Misschien is het gewoon zijn keuze?
Gewijzigd op 05/07/2016 23:13:45 door - Ariën -
 
Jop B

Jop B

05/07/2016 23:15:12
Quote Anchor link
Dank voor de reactie.

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
 
Thomas van den Heuvel

Thomas van den Heuvel

05/07/2016 23:43:26
Quote Anchor link
$file = $temp_name = $FILES['attachment']['tmp_name'];

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
 
Ivo P

Ivo P

06/07/2016 10:15:48
Quote Anchor link
Wat ik wat vreemd vind aan het script van Jop:

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.
 
Thomas van den Heuvel

Thomas van den Heuvel

06/07/2016 14:53:21
Quote Anchor link
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
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.