Avatar billede kischi Novice
27. januar 2011 - 15:32 Der er 30 kommentarer og
1 løsning

Sende mail med attachment via mail formular

Hej,

Jeg prøver at lave en mail formular som sender sender en mail til mig med en attachment som jeg har uploadet via formularen, men indtil videre sender den kun teksten, jeg kan ikke få den til at sende attachment.

Jeg tror muligvis at det er fordi jeg ikke har defineret at den skal hente filen fra feltet som hedder "upfile" kan det passe?

og hvordan ville jeg kunne gøre det?

Her er min kode:

[code]

<?php
function spamcheck($field)
  {
  //filter_var() sanitizes the e-mail
  //address using FILTER_SANITIZE_EMAIL
  $field=filter_var($field, FILTER_SANITIZE_EMAIL);

  //filter_var() validates the e-mail
  //address using FILTER_VALIDATE_EMAIL
  if(filter_var($field, FILTER_VALIDATE_EMAIL))
    {
    return TRUE;
    }
  else
    {
    return FALSE;
    }
  }

if (isset($_REQUEST['email']))
  {//if "email" is filled out, proceed

  //check if the email address is invalid
  $mailcheck = spamcheck($_REQUEST['email']);
  if ($mailcheck==FALSE)
    {
    echo "Invalid input";
    }
  else
    {//send email
    $email = $_REQUEST['email'] ;
    $subject = $_REQUEST['subject'] ;
    $message = $_REQUEST['message'] ;
   
    //Get the uploaded file information
    $name_of_uploaded_file =  basename($_FILES['uploaded_file']['name']);
    //get the file extension of the file
    $type_of_uploaded_file = substr($name_of_uploaded_file, strrpos($name_of_uploaded_file, '.') + 1);
   
    $size_of_uploaded_file =
    $_FILES["uploaded_file"]["size"]/1024;//size in KBs
   
    //Settings
    $max_allowed_file_size = 100; // size in KB
    $allowed_extensions = array("jpg", "jpeg", "gif", "bmp");

    //Validations
    if($size_of_uploaded_file > $max_allowed_file_size )
{
      $errors .= "\n Size of file should be less than $max_allowed_file_size";
}

    //------ Validate the file extension -----
    $allowed_ext = false;
    for($i=0; $i<sizeof($allowed_extensions); $i++)
{
      if(strcasecmp($allowed_extensions[$i],$type_of_uploaded_file) == 0)
  {
    $allowed_ext = true;   
  }
}

    if(!$allowed_ext)
{
    $errors .= "\n The uploaded file is not supported file type. ".
      " Only the following file types are supported: ".implode(',',$allowed_extensions);
}

    //copy the temp. uploaded file to uploads folder
    $path_of_uploaded_file = $images . $name_of_uploaded_file;
    $tmp_path = $_FILES["uploaded_file"]["tmp_name"];

    if(is_uploaded_file($tmp_path))
{
      if(!copy($tmp_path,$path_of_uploaded_file))
  {
    $errors .= '\n error while copying the uploaded file';
  }
}



   
    mail("min@e-mail.com", "Subject: $subject",
    $message, "From: $email" );
    echo "Thank you for using our mail form";
    }
  }
else
  {//if "email" is not filled out, display the form
  echo "<form method='post' action='formmail.php' ENCTYPE='multipart/form-data'>
  Email: <input name='email' type='text' /><br />
  Subject: <input name='subject' type='text' /><br />
  Message:<br />
  <textarea name='message' rows='15' cols='40'>
  </textarea><br />
  File to upload:<br>
  <INPUT TYPE='FILE' NAME='upfile'><br>
  <input type='submit' />
  </form>";
  }
?>

[/code]



Tak
Avatar billede kischi Novice
28. januar 2011 - 12:40 #1
Hej igen,

Nu har jeg fundet ud af lidt mere.

Nu har jeg overført filen til en mappe på serveren, men kan stadig ikke helt finde ud af at tilføje den til den mail som bliver sendt som en attachment.

Er der nogen der kan hjælpe?

Tak.
Jeg håber i kan hjælpe.

Her er min kode nu:

<?php




function spamcheck($field)
  {
  //filter_var() sanitizes the e-mail
  //address using FILTER_SANITIZE_EMAIL
  $field=filter_var($field, FILTER_SANITIZE_EMAIL);

  //filter_var() validates the e-mail
  //address using FILTER_VALIDATE_EMAIL
  if(filter_var($field, FILTER_VALIDATE_EMAIL))
    {
    return TRUE;
    }
  else
    {
    return FALSE;
    }
  }

if (isset($_REQUEST['email']))
  {//if "email" is filled out, proceed

  //check if the email address is invalid
  $mailcheck = spamcheck($_REQUEST['email']);
  if ($mailcheck==FALSE)
    {
    echo "Invalid input";
    }
  else
    {//send email
    $email = $_REQUEST['email'] ;
    $subject = $_REQUEST['subject'] ;
    $message = $_REQUEST['message'] ;
   

ini_set('error_reporting', E_ALL);

$dist = $_SERVER["DOCUMENT_ROOT"]."/sendmail/formmail_with_attachment/uploads";

    // Er upload tilladt ???
    if(false == ini_get('file_uploads')) {
        echo "Upload af filer er ikke tilladt i php.ini!";
        exit;
    }

    // Findes dir til upload ???
    if(!is_dir($dist)) {
        echo "Dir til upload findes ikke!";
        exit;
    }

    if(!is_writable($dist)) {
        echo "Der er ikke skriverettigheder på uploaddir, ". $dist;
        exit;
    }



if(isset($_FILES["upfile"]) && is_uploaded_file($_FILES["upfile"]["tmp_name"]))
{
$filnavn = $_FILES["upfile"]["name"];
$tempnavn = $_FILES["upfile"]["tmp_name"];

    if(move_uploaded_file($tempnavn, $dist."/".$filnavn)) {
    chmod($dist."/".$filnavn, 0644);
    echo"Din fil er uploadet!";

    }
    else
    {

    echo"Filen kunne ikke uploades";

    }
   
}
else
    {
    echo"filen er der ikke";
    }

    mail("minmail@hotmail.com", "Subject: $subject",
    $message, "From: $email" );
    echo "Thank you for using our mail form";
    }
  }

?>
Avatar billede kischi Novice
28. januar 2011 - 14:33 #2
Nu har jeg prøvet at sætte denne lille stump kode ind:

$path = "/sendmail/formmail_with_attachment/uploads";////need to pass the field name of the file field
$att_file_name = split("/",$path);
$att_file_name = $att_file_name[1];
$mail->AddAttachment($path, $att_file_name, $encoding = "base64", $type = "application/octet-stream");

men får bare denne fejl:

Fatal error: Call to a member function AddAttachment() on a non-object in /home/www/wearecrunch.dk/sendmail/formmail_with_attachment/formmail.php on line 52

Er der nogen der vil være søde og hjælpe mig.
Tak ;)
Avatar billede majbom Novice
28. januar 2011 - 22:33 #3
jeg tror du blander noget sammen - mail() er en simpel funktion og i #2 bruger du den som et objekt, og det kan du ikke.

tag et kig på phpmailer, så kommer du hurtigt over dit lille problem :)
Avatar billede kischi Novice
29. januar 2011 - 16:22 #4
ok tak,

Men jeg forsår det stadig ikke helt. Jeg kan ikke rigtigt finde en god tutorial på hvordan man bruger phpmailer.

Kan man ikke bare skrive koden så den sender attachment med? altså den sender jo alt texten i felterne, er det så ikke bare at tilføje noget om at den skal også tage filen med?

Sådan noget som:

Hvis der er en fil i upfile feltet så skal den tage den includere den i mailen som attachment.

Men hvordan ville man kunne skrive det i koden, ved du det?

Tak
Avatar billede majbom Novice
29. januar 2011 - 19:40 #5
der er ellers nogle fine guides på deres side: http://phpmailer.worxware.com/index.php?pg=tutorial
Avatar billede kischi Novice
30. januar 2011 - 15:14 #6
Hej igen,

Ok nu har jeg så prøvet at downloade phpmailer, men jeg tror ikke jeg har gjordt det helt rigtigt fordi jeg fåe ikkt en fil ved navn:

class.phpmailer.php

Og det tror jeg vidst man skal.

Men så har jeg også læst på
http://phpmailer.worxware.com/index.php?pg=tutorial#3

at komandoen for at vedhæfte er: AddAttachment($path);

men jeg har prøvet at sætte den ind forskellige steder i koden, og skrevet den på forskellige måde, men uden held. Er det fordi at den spiller kun samme med phpmailer eller hvorfor virker komandoen ikke?

min kode ser sådan ud det sted:

if (isset($_REQUEST['email']))
  {//if "email" is filled out, proceed

  //check if the email address is invalid
  $mailcheck = spamcheck($_REQUEST['email']);
  if ($mailcheck==FALSE)
    {
    echo "Invalid input";
    }
  else
    {//send email
    $email = $_REQUEST['email'] ;
    $subject = $_REQUEST['subject'] ;
    $message = $_REQUEST['message'] ;
   
   
    ////attachment file
$path = "/sendmail/formmail_with_attachment/uploads";////need to pass the field name of the file field
AddAttachment($path);

og jeg får denne fejl:

Fatal error: Call to undefined function AddAttachment() in /home/www/wearecrunch.dk/sendmail/formmail_with_attachment/formmail.php on line 52

Håber du kan hjælpe?
Tak
Avatar billede majbom Novice
30. januar 2011 - 17:55 #7
hent filen herfra: http://sourceforge.net/projects/phpmailer/files/phpmailer%20for%20php5_6/PHPMailer%20v5.1/ (jeg går ud fra du har windows, så du skal hente zip-filen - der ligger filen/klassen du skal bruge

jeg kan se at det ser ud til at de har problemer med deres links, linket til php5 og 6 linker til version 0.9, som er til php4, så måske du har fået hente den?

og så prøv at følg deres tutorial fra starten, for du er nødt til at bruge det som der står derinde, du kan ikke bare smide AddAttachment ind i din eksisterende kode...
Avatar billede kischi Novice
31. januar 2011 - 00:57 #8
ok, tak.

nu var dte den rigtige fil :)
Men nu når jeg prøver at køre den sender den ikke nogen mail.

Man kan vel godt teste om det virker bare ved at gå direkte til filen via url'en ik?

Uden at gå via en formular altså?

der står "the mail has been sent" men jeg modtager ikke noget.

min kode ser nu sådan ud:

<?php
require("class.phpmailer.php");
$mail = new PHPMailer();

$mail->SetFrom("minmail@hotmail.com","mitnavn");
$mail->AddAddress("minmail@hotmail.com","hutelihut");

$mail->Subject  = "First PHPMailer Message";
$mail->Body    = "Hi! \n\n This is my first e-mail sent through PHPMailer.";
$mail->WordWrap = 50;

if(!$mail->Send()) {
  echo 'Message was not sent.';
  echo 'Mailer error: ' . $mail->ErrorInfo;
    }
    else {
  echo 'Message has been sent.';
    }


?>

Håber du kan hjælpe.
Tak
Avatar billede kischi Novice
31. januar 2011 - 12:42 #9
Hej igen,

Jeg fandt ud af at det faktisk virkede, men mailen bliver placeret i junk folderen,

kommer det så altid til at ske eller er der en måde man kan ændre det på?

Tak
Avatar billede majbom Novice
31. januar 2011 - 13:38 #10
hmm, kommer din "fra"-adresse med i den mail du modtager?

som regel lander den i junk, fordi den mangler...
Avatar billede kischi Novice
31. januar 2011 - 22:22 #11
hmm, virker stadig ikke, men har læst at der nok ikke er så meget at gøre ved det, det kan være at det bare er mailprogrammets indstillinger med junk e-mail indstillinger.

Og det sker oftest kun med hotamail.

Men jeg har nu et andet problem, jeg sender mailen med nogle info som bliver indtastet i en form, det er fint nok. Men den bliver altid sendt fra "Root user" og emailen er "root@localhost"

Men den kører ikke på min local host.

Håber du kan hjælpe med det, tak :)

Sådan her ser koden ud:


<?php
require("class.phpmailer.php");
$mail = new PHPMailer();

$mail->SetFrom = $_REQUEST['email'];
$mail->AddAddress("adamkischi@hotmail.com","Adam Kischinovsky");

$mail->Subject = $_REQUEST['subject'];
$mail->Body    = $_REQUEST['message'];
$mail->WordWrap = 50;

if(!$mail->Send()) {
  echo 'Message was not sent.';
  echo 'Mailer error: ' . $mail->ErrorInfo;
    }
    else {
  echo 'Message has been sent.';
    }


?>


og det her er formen:



  <form method='post' action='virker_det.php' ENCTYPE='multipart/form-data'>
  Email: <input name='email' type='text' /><br />
  Subject: <input name='subject' type='text' /><br />
  Message:<br />
  <textarea name='message' rows='15' cols='40'>
  </textarea><br />
  File to upload:<br>
  <INPUT TYPE='FILE' NAME='upfile'><br>
  <input type='submit' />
  </form>
Avatar billede majbom Novice
31. januar 2011 - 22:32 #12
du bruger jo også SetFrom forkert, du skal gøre som i #8 (SetFrom($address, $name = ""))
Avatar billede kischi Novice
31. januar 2011 - 22:47 #13
Ja ok, det kan jeg godt se, men hvordan er det man ville skulle skrive det hvis man bruger @_request og jo tager infoen fra en form, jeg har prøvet mig lidt frem men det er helt forkert. det her er hvad jeg prøvede:

$mail->SetFrom = ($_REQUEST['email' . "," . 'navn'];

Men jeg ved ikke hvordan både e-mail og navn kan hentes ud på samme linje?

Tak
Avatar billede majbom Novice
01. februar 2011 - 08:45 #14
du kan heller ikke hente mere end én ting ud fra én variabel (umiddelbart)

jeg går ud fra at email-adressen er i $_REQUEST['email'] - har du også en med navnet på afsender?

man kunne måske:

$mail->SetFrom = ($_REQUEST['email'], $_REQUEST['navn']);


forudsat du har et felt der hedder 'navn'
Avatar billede kischi Novice
01. februar 2011 - 12:41 #15
hej,

ja nu har jeg også et navn felt, og ja e-mail aressen er i email feltet. så nu ser min kode sådan ud:

$mail->SetFrom = ($_REQUEST['email'] $_REQUEST['navn']);

men jeg får denne fejl:

Parse error: syntax error, unexpected T_VARIABLE in /home/www/wearecrunch.dk/sendmail/PHPMailer_v5.1/virker_det.php on line 14

Ved du hvordan jeg kan ændre det?
Tak
Avatar billede kischi Novice
01. februar 2011 - 12:51 #16
Nu fik jeg ihvertfald ændret det til at jeg ikke får en fejl og at den sender, men der står stadig root user.
koden ser sådan ud nu:

$mail->SetFrom = ($_REQUEST['email']. ',' . $_REQUEST['navn']);
Avatar billede majbom Novice
01. februar 2011 - 14:27 #17
du mangler også et komma imellem de to variabler...
Avatar billede majbom Novice
01. februar 2011 - 14:28 #18
du skal gøre som jeg skrev i #14...
Avatar billede kischi Novice
01. februar 2011 - 14:55 #19
ja ok men det havde jeg også gjordt, men troede at det var en fejl fordi jeg får denne fejlbesked:

Parse error: syntax error, unexpected ',' in /home/www/wearecrunch.dk/sendmail/PHPMailer_v5.1/virker_det.php on line 14

Den siger jo at kommaet er forkert, gør den ikke?
Tak
Avatar billede majbom Novice
01. februar 2011 - 16:35 #20
hvad har du skrevet når du får den fejl?
Avatar billede kischi Novice
01. februar 2011 - 21:38 #21
Jeg har skrevet det fra #14 som ser sådan her ud:

$mail->SetFrom = ($_REQUEST['email'], $_REQUEST['navn']);
Avatar billede majbom Novice
01. februar 2011 - 22:10 #22
sorry, det er gået for stærkt, der skal selvfølgelig ikke være lighedstegn med jo...

$mail->SetFrom($_REQUEST['email'], $_REQUEST['navn']);


beklager
Avatar billede kischi Novice
01. februar 2011 - 22:33 #23
ok fedt, nu virker det ihvertfald.

Men nu tilbage til mit oprindelige spørgsmål.
attachment.
Jeg har prøvet lidt forskellige ting, med det jeg havde læst:
men det her er hvad jeg fandt frem til:

$mail->AddAttachment = $_REQUEST['upfile'];

mailen bliver sendt, men stadig ikke med attachment. :(

Ved du hvad der er galt? jeg havde prøvet nogle andre ting også, men så sagde den at den ikke kunne få fat i filen, men det siger den ikke nu, den bliver bare ikke sendt med.

Tak
Avatar billede majbom Novice
01. februar 2011 - 22:43 #24
du er nødt til at gemme filen til din server, inden du sender mailen. når du uploader en fil, og ikke gør mere ved den bliver den slettet når sessionen slutter.

find et simpelt upload-script og så er du ved at være kørende :)
Avatar billede kischi Novice
01. februar 2011 - 22:58 #25
ok, jeg havde et gammelt fileupload script som jeg bruger.

nu overføre den også filen til mappen på serveren men den bliver ikke sendt videre som attachment.

Er min addattachment() forkert skrevet måske? den skal jo også have fat i den rigtige fil som bliver uploadet på det tidspunkt.

Hele min kode ser nu således ud:

<?php


$dist = $_SERVER["DOCUMENT_ROOT"]."sendmail/PHPMailer_v5.1/uploads";

// Findes dir til upload ???
    if(!is_dir($dist)) {
        echo "Dir til upload findes ikke!";
        exit;
    }



if(isset($_FILES["upfile"]) && is_uploaded_file($_FILES["upfile"]["tmp_name"]))
{
$filnavn = $_FILES["upfile"]["name"];
$tempnavn = $_FILES["upfile"]["tmp_name"];

    if(move_uploaded_file($tempnavn, $dist."/".$filnavn)) {
    chmod($dist."/".$filnavn, 0644);
    echo"Din fil er uploadet!";

    }
    else
    {

    echo"Filen kunne ikke uploades";

    }
   
}
else
    {
    echo"filen er der ikke";
    }



require("class.phpmailer.php");
$mail = new PHPMailer();

$mail->SetFrom($_REQUEST['email'], $_REQUEST['navn']);
$mail->AddAddress("adamkischi@hotmail.com","Adam Kischinovsky");
$mail->AddAttachment = $_REQUEST['upfile'];

$mail->Subject = $_REQUEST['subject'];
$mail->Body    = $_REQUEST['message'];
$mail->WordWrap = 50;

if(!$mail->Send()) {
  echo 'Message was not sent.';
  echo 'Mailer error: ' . $mail->ErrorInfo;
    }
    else {
  echo 'Message has been sent.';
    }

?>

Tak igen ;)
Avatar billede majbom Novice
01. februar 2011 - 23:03 #26
i AddAttachment skal du skrive stien som du angiver i move_uploaded_file...
Avatar billede kischi Novice
01. februar 2011 - 23:38 #27
Hmm, altså nu har problemet løst sig med at det ikke ligger sig i junk folderen :)

Men den sender stadig ikke som attachment, men er også lidt i tvivl om jeg har lavet addattachment rigtigt:

$mail->AddAttachment($tempnavn, $dist."/".$filnavn);
Avatar billede majbom Novice
02. februar 2011 - 00:01 #28
prøv med:

$mail->AddAttachment($dist."/".$filnavn);
Avatar billede kischi Novice
02. februar 2011 - 00:13 #29
Yeps, det virker perfekt, tusind tak for hjælpen :)

Hvis du lukker af med et svar skal jeg nok give point og lukke tråden :)

Igen tusind tak :)
Avatar billede majbom Novice
02. februar 2011 - 12:37 #30
selv tak :)

(dejligt med en der ikke skal have det hele serveret, men selv kommer i mål vha hints :) )
Avatar billede majbom Novice
02. februar 2011 - 16:32 #31
tfp :)
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