Avatar billede alexander_j Nybegynder
12. februar 2005 - 17:47 Der er 8 kommentarer og
1 løsning

mail: vedhæft fil liggende på serveren

Hej nu har jeg brugt over en time på at finkæmme danske og engelske sider angående vedhæftning af filer til mails sendt via php's mail-function.
De to sider der ser mest brugbare ud er:
http://php4you.kiev.ua/docs/print/php_attach.html og
http://delfs.dk/tricks.attachments.php

Men jeg kan stadig ikke finde ud af det :-(

Koden fra den nederste ser sådan her ud:
<?php
$boundary = uniqid('');
$mimeType = ($_FILES['filen']['type'] ? $_FILES['filen']['type'] : 'application/unknown');
$file = fread(fopen($_FILES['filen']['tmp_name'], 'r'), filesize($_FILES['filen']['tmp_name']));
$file = base64_encode($file);
$file = chunk_split($file);

$body  = "\n--$boundary\n";
$body .= "Content-type: text/plain; charset=iso-8859-1\n";
$body .= "Content-transfer-encoding: 8bit\n\n";
$body .= $_POST['body']."\n\n";
$body .= "--$boundary\n";
$body .= "Content-type: $mimeType; name=".$_FILES['filen']['name']."\n";
$body .= "Content-disposition: attachment; filename=".$_FILES['filen']['name']."\n";
$body .= "Content-transfer-encoding: base64\n\n";
$body .= $file."\n\n";
$body .= "--$boundary--";
$headers = "Content-type: multipart/mixed; boundary=\"$boundary\"";

mail('din@email.dk', 'Emnet', $body, $headers);
?>

Men hvordan definerer jeg stien til den fil jeg ønsker vedhæftet (som forøvrigt er en pdf-fil)?
Avatar billede bojo Nybegynder
12. februar 2005 - 17:51 #1
Denne ( iøvrigt "stjålet" her ) virker, pil selv det du skal bruge ud.


<?PHP

// Hvis din mail er sendt.
if(isset($_POST[afsend])) {

    $fil = $_FILES['fileatt']['name'];
    $fra = $_POST[email];
    $til = $_POST[modtager];
    $emne = $_POST[emne];
    $besked = $_POST[indhold];

    // 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);

    // 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/plain samt
    // hvilket tegnsæt vi bruger
    $body .= "Content-type: text/plain; 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>
Avatar billede alexander_j Nybegynder
12. februar 2005 - 17:53 #2
jep og det er en med et inputfelt, hvor der kan uploades en fil der vedhæftes, men hvordan vedhæfter jeg en fil fra serveren? (svaret er sikker ganske simpelt)
Avatar billede bojo Nybegynder
12. februar 2005 - 18:07 #3
i denne linie

// Læs filen ind i en variable
    $fil_var = fread(fopen($_FILES['fileatt']['tmp_name'], "r"), filesize($_FILES['fileatt']['tmp_name']));


erstatter du $_FILES['fileatt']['tmp_name'] med din fils navn
Avatar billede alexander_j Nybegynder
12. februar 2005 - 18:12 #4
Tjaeh, ¨å får jeg en fejlmeddelelse
Warning: fread(): Length parameter must be greater than 0. in /net/users/a54/640/vestermarieskdk/www/temp/sendmail.php on line 20

og en mail med en vedhæftning der hedder:
.dat(60 B)
Avatar billede alexander_j Nybegynder
12. februar 2005 - 18:15 #5
Sorry ingen fejlmeddellelse, men bare en vedhæftning der hedder:
.dat(60 B)
Avatar billede alexander_j Nybegynder
12. februar 2005 - 18:32 #6
<?php
$boundary = uniqid('');

$filename = "minpdffil.pdf";

$mimeType = 'application/pdf';
$file = fread(fopen($filename, 'r'), filesize($filename));
$file = base64_encode($file);
$file = chunk_split($file);

$body  = "\n--$boundary\n";
$body .= "Content-type: text/plain; charset=iso-8859-1\n";
$body .= "Content-transfer-encoding: 8bit\n\n";
$body .= $_POST['body']."\n\n";
$body .= "--$boundary\n";
$body .= "Content-type: $mimeType; name=".$filename."\n";
$body .= "Content-disposition: attachment; filename=".$filename."\n";
$body .= "Content-transfer-encoding: base64\n\n";
$body .= $file."\n\n";
$body .= "--$boundary--";
$headers = "Content-type: multipart/mixed; boundary=\"$boundary\"";

mail('min.email@mail.dk', 'Emnet', $body, $headers);
?>

Det her virker - læg svar, så deler vi!
Avatar billede bojo Nybegynder
12. februar 2005 - 18:38 #7
hmm, jeg har lige testet med

    $fil='sendfile1.php';
    $fil_var = fread(fopen($fil, "r"), filesize($fil));

og det virker fint, har du husket at sætte filnavnet i ' ' eller " "
Avatar billede bojo Nybegynder
12. februar 2005 - 18:38 #8
Nej tak, svar selv og accepter
Avatar billede alexander_j Nybegynder
12. februar 2005 - 18:55 #9
ok tak!
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