Avatar billede mkjaer Nybegynder
19. juli 2005 - 19:47 Der er 7 kommentarer

Bruge vedhæftet/uploadede-fil i en html-mail

Hej,

Jeg har leget lidt med [cypermann]'s script, som nu ser således ud:

<?PHP

// Hvis din mail er sendt.
if(isset($_POST[afsend])) {
       
    $fil = $_FILES['fileatt']['name'];
    $fra = $_POST[email];
    $til = $_POST[modtager];
    $emne = $_POST[emne];

 
    // Definér $boundary
    // boundary er en unik streng der identifiserer vores email
    $boundary = uniqid("");
 
    // Siden det er en tekstfil, kender vi allerede MIME typen
    $mimeType =  "application/unknown";
 
    // Læs filen ind i en variable
    $fil_var = fread(fopen($_FILES['fileatt']['tmp_name'], "r"), filesize($_FILES['fileatt']['tmp_name']));
 
    // Gør filen læsevenlig for email-klienten
    $fil_var = base64_encode($fil_var);

    // Laver lidt html-kode, hvor filen vises
    $besked = "<font face=\"Trebuchet MS\" size=\"2\"><br>Filen så sådan her ud:<br><imc src=$fil><br><br>";

    // Split filkoden op i linier med 76 tegn i hver
    $fil_var = chunk_split($fil_var);

    // Følgende lille stykke klarer det meste mht. headers, der fortæller email-klienten hvad der er på vej

    // Vi sætter vores unikke streng ind her
    $body  = "\n--$boundary\n";
 
    // Vi fortæller at følgende stump er af typen text/html samt
    // hvilket tegnsæt vi bruger
    $body .= "Content-type: text/html; charset=iso-8859-1\n";
    $body .= "Content-transfer-encoding: 8bit\n\n";
   
    // Vi sætter body-texten ind her
    $body .= $besked."\n\n";
   
    // Slut på brødteksten
    $body .= "--$boundary\n";
 
    // Så er det filens tur
    // Vi fortæller lige mime-typen og filnavnet
    $body .= "Content-type: $mimeType; name=".$fil."\n";
 
    // Fortæller at vi vil have filen hæftet ved - ikke direkte i mailen.
    // Vil du gerne have den direkte i mailen, ændres 'attachment' til 'inline'
    // Bemærk: Bl.a. OE viser _også_ filen i selve mailen selvom du angiver 'attachment'
    $body .= "Content-disposition: attachment; filename=".$fil."\n";
 
    // Klienten skal have at vide at meddelelsen er encoded med base64
    $body .= "Content-transfer-encoding: base64\n\n";
 
    // Vi sætter filkoden ind
    $body .= $fil_var."\n\n";
 
    // Vi slutter af med den samme unikke streng som vi startede med
    $body .= "--$boundary--";
 
    // Vi definerer from-headeren
    $headers  = "From: ".$fra."<".$fra.">\n";
 
    // Vi fortæller hvilken type indhold mailen indeholder
    // samt emailens unikke id-streng
    $headers .= "Content-type: multipart/mixed; boundary=\"$boundary\"";
 
    // Hvis mailen bliver sendt afsted problemfrit
    if (mail($til, $emne, $body, $headers)) {
        echo "Mailen er sendt!";
     
    // Hvis ikke skriver vi lige en fejlmeddelelse
    } else {
        echo "Der opstod en fejl, og mailen blev ikke sendt!";
    }
}
?>

<html>
<head>
  <meta name="Generator" content="Stone's WebWriter 4" />
</head>
<body>
  <form action="" method="post" enctype="multipart/form-data">
  Afsenders email: <input type="text" name="email"><br>
  Modtagers email: <input type="text" name="modtager"><br>
  Emne i mail: <input type="text" name="emne"><br>
  Teksten i mailen: <input type="text" name="indhold"><br>
  Filen: <input type="file" name="fileatt"><br>
  <input name="afsend" type="submit" value="Send email">
  </form>
</body>
</html>



Meeen jeg kan ikke få det til, at putte filen ind i min html-kode. Jeg forudsætter, at den uploadede fil er et stykke grafik.

Hvad gør jeg galt?

Hilsen
Martin
Avatar billede wuggawugga Nybegynder
20. juli 2005 - 09:48 #1
Er det fordi du ikke kan vise billedet i html indholdet af mailen?
Avatar billede martinkjaer Nybegynder
20. juli 2005 - 10:03 #2
Jeps, lige præcis!
Har du en løsning?
Avatar billede wuggawugga Nybegynder
20. juli 2005 - 10:22 #3
Du skal bruge cid: (content-id) når du refererer til inline billeder i html:

<img src="cid:a2734de8c37d9ef07d0783ed7d6e4c9d" />

Og angive det i mime part headeren :

--=_bad68daedef2dba9c35f0f0026decac9
Content-Type: image/pjpeg
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename="foo.jpg"
Content-ID: <a2734de8c37d9ef07d0783ed7d6e4c9d>
Avatar billede martinkjaer Nybegynder
20. juli 2005 - 12:27 #4
Vil du være ked af, at 'puttet' dine koder ind i min eksempel?
Jeg kunne ikke lige få det til, at spille :-(
Avatar billede martinkjaer Nybegynder
20. juli 2005 - 12:38 #5
Filen vil hedde 'grafik/banner.gif'
Avatar billede mkjaer Nybegynder
20. juli 2005 - 17:41 #6
Ok jeg fik det til at virke. Jeg havde skrevet imc i stedet for img.
Giv svar, som giver jeg point.

Og så lige et tillægspørgsmål: Jeg kunne tænke mig, at filen som sendes med email blev hentet fra en url-adresse, og ikke via en upload-funktion. Hvordan gør jeg nemmest det?
Avatar billede wuggawugga Nybegynder
21. juli 2005 - 15:13 #7
Det nemmeste er nok at erstatte linien her

$fil_var = fread(fopen($_FILES['fileatt']['tmp_name'], "r"), filesize($_FILES['fileatt']['tmp_name']));
 
Med noget lignende det her:

if(is_uploaded_file($_FILES['fileatt']['tmp_name'])) {
    $filnavn = $_FILES['fileatt']['tmp_name'];
} else {
    $filnavn = 'http://whatever';
}
$fil_var = file_get_contents($filnavn);


Dette kræver dog at du har file_get_contents() funktionen og at 'allow_url_fopen' indstillingen er slået til.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester