webentwicklung-frage-antwort-db.com.de

Senden Sie eine Dateianlage aus dem Formular mit phpMailer und PHP

Ich habe ein Formular auf example.com/contact-us.php, das wie folgt aussieht (vereinfacht):

<form method="post" action="process.php" enctype="multipart/form-data">
  <input type="file" name="uploaded_file" id="uploaded_file" />
  <input type="hidden" name="MAX_FILE_SIZE" value="10000000" />
</form>

In meiner process.php-Datei habe ich den folgenden Code, der PHPMailer() zum Senden einer E-Mail verwendet:

require("phpmailer.php");

$mail = new PHPMailer();

$mail->From     = [email protected];
$mail->FromName = My name;
$mail->AddAddress([email protected],"John Doe");

$mail->WordWrap = 50;
$mail->IsHTML(true);

$mail->Subject  =  "Contact Form Submitted";
$mail->Body     =  "This is the body of the message.";

Die E-Mail sendet den Text korrekt, jedoch ohne den Anhang von uploaded_file.

MEINE FRAGE

Ich brauche die Datei uploaded_file aus dem Formular, um an die E-Mail angehängt und gesendet zu werden. Es ist mir NICHT wichtig, die Datei zu speichern, nachdem das process.php-Skript sie in einer E-Mail gesendet hat. 

Ich verstehe, dass ich irgendwo AddAttachment(); hinzufügen muss (ich gehe davon aus, dass sich die Zeile Body befindet), damit der Anhang gesendet werden kann. Aber...

  1. Was muss ich oben in die process.php-Datei einfügen, um sie in die Datei uploaded_file zu ziehen? Wie etwas, das $_FILES['uploaded_file'] verwendet, um die Datei von der Seite contact-us.php abzurufen?
  2. Was geht in AddAttachment(); für die Datei an, die mit der E-Mail angehängt und mitgesendet werden soll, und wohin muss dieser Code gehen?

Bitte helfen Sie und geben Sie den Code an! Danke!

62
adamdehaven

Versuchen:

if (isset($_FILES['uploaded_file']) &&
    $_FILES['uploaded_file']['error'] == UPLOAD_ERR_OK) {
    $mail->AddAttachment($_FILES['uploaded_file']['tmp_name'],
                         $_FILES['uploaded_file']['name']);
}

Grundlegendes Beispiel kann auch gefunden werden hier .

Die Funktionsdefinition für AddAttachment lautet:

public function AddAttachment($path,
                              $name = '',
                              $encoding = 'base64',
                              $type = 'application/octet-stream')
95
drew010

Datei konnte nicht vom Client-PC angehängt werden (Upload)

Im HTML-Formular habe ich folgende Zeile nicht hinzugefügt, daher wurde kein Anhang hinzugefügt:

enctype = "multipart/form-data"

Nachdem Sie die obige Zeile im Formular (wie unten) hinzugefügt haben, ist der Anhang perfekt.

<form id="form1" name="form1" method="post" action="form_phpm_mailer.php"  enctype="multipart/form-data">
6
Imtiaz Ahmad

Dieser Code hilft mir beim Senden von Attachments ....

$mail->AddAttachment($_FILES['file']['tmp_name'], $_FILES['file']['name']);

Ersetzen Sie Ihren AddAttachment (...) Code durch den obigen Code

1
Irshad Khan

Sie würden $_FILES['uploaded_file']['tmp_name'] verwenden. Dies ist der Pfad, in dem PHP die hochgeladene Datei gespeichert hat (es handelt sich um eine temporäre Datei, die automatisch von PHP entfernt wird, wenn das Skript endet, es sei denn, Sie haben sie an eine andere Stelle verschoben/kopiert).

Unter der Annahme, dass die Einstellungen für das clientseitige Formular und die serverseitigen Uploads korrekt sind, müssen Sie nichts tun, um den Upload "einzuladen". Es wird nur magisch in diesem Pfad von tmp_name verfügbar sein.

Beachten Sie, dass Sie prüfen müssen, ob der Upload tatsächlich erfolgreich war, z.

if ($_FILES['uploaded_file']['error'] === UPLOAD_ERR_OK) {
    ... attach file to email ...
}

Andernfalls können Sie versuchen, einen Anhang mit einer beschädigten/unvollständigen/nicht vorhandenen Datei zu erstellen.

0
Marc B

Verwenden Sie diesen Code zum Senden von Anhängen mit der Option zum Hochladen von Dateien mithilfe des HTML-Formulars in phpmailer

 <form method="post" action="" enctype="multipart/form-data">


                    <input type="text" name="name" placeholder="Your Name *">
                    <input type="email" name="email" placeholder="Email *">
                    <textarea name="msg" placeholder="Your Message"></textarea>


                    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
                    <input type="file" name="userfile"  />


                <input name="contact" type="submit" value="Submit Enquiry" />
   </form>


    <?php




        if(isset($_POST["contact"]))
        {

            /////File Upload

            // In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead
            // of $_FILES.

            $uploaddir = 'uploads/';
            $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

            echo '<pre>';
            if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
                echo "File is valid, and was successfully uploaded.\n";
            } else {
                echo "Possible invalid file upload !\n";
            }

            echo 'Here is some more debugging info:';
            print_r($_FILES);

            print "</pre>";


            ////// Email


            require_once("class.phpmailer.php");
            require_once("class.smtp.php");



            $mail_body = array($_POST['name'], $_POST['email'] , $_POST['msg']);
            $new_body = "Name: " . $mail_body[0] . ", Email " . $mail_body[1] . " Description: " . $mail_body[2];



            $d=strtotime("today"); 

            $subj = 'New enquiry '. date("Y-m-d h:i:sa", $d);

            $mail = new PHPMailer(); // create a new object


            //$mail->IsSMTP(); // enable SMTP
            $mail->SMTPDebug = 1; // debugging: 1 = errors and messages, 2 = messages only ,false = Disable 
            $mail->Host = "mail.yourhost.com";
            $mail->Port = '465';
            $mail->SMTPAuth = true; // enable 
            $mail->SMTPSecure = true;
            $mail->IsHTML(true);
            $mail->Username = "[email protected]"; //[email protected]
            $mail->Password = "password";
            $mail->SetFrom("[email protected]", "Your Website Name");
            $mail->Subject = $subj;
            $mail->Body    = $new_body;

            $mail->AddAttachment($uploadfile);

            $mail->AltBody = 'Upload';
            $mail->AddAddress("[email protected]");
             if(!$mail->Send())
                {
                echo "Mailer Error: " . $mail->ErrorInfo;
                }
                else
                {

                echo '<p>       Success              </p> ';

                }

        }



?>

Verwenden Sie diesen link als Referenz.

0
Jithu Wilson C

In meinem eigenen Fall verwendete ich serialize() im Formular. Daher wurden die Dateien nicht an PHP gesendet. Wenn Sie Jquery verwenden, verwenden Sie FormData(). Zum Beispiel

<form id='form'>
<input type='file' name='file' />
<input type='submit' />
</form>

Jquery verwenden,

$('#form').submit(function (e) {
e.preventDefault();
var formData = new FormData(this); // grab all form contents including files
//you can then use formData and pass to ajax

});
0

Hey Leute, der folgende Code hat für mich perfekt funktioniert. Ersetzen Sie einfach setFrom und addAddress mit Ihren Wünschen und fertig. 

<?php
/**
 * PHPMailer simple file upload and send example.
 */
//Import the PHPMailer class into the global namespace
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
$msg = '';
if (array_key_exists('userfile', $_FILES)) {
    // First handle the upload
    // Don't trust provided filename - same goes for MIME types
    // See http://php.net/manual/en/features.file-upload.php#114004 for more thorough upload validation
    $uploadfile = tempnam(sys_get_temp_dir(), hash('sha256', $_FILES['userfile']['name']));
    if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) 
    {
        // Upload handled successfully
        // Now create a message

        require 'vendor/autoload.php';
        $mail = new PHPMailer;
        $mail->setFrom('[email protected]', 'CV from Web site');
        $mail->addAddress('[email protected]', 'CV');
        $mail->Subject = 'PHPMailer file sender';
        $mail->Body = 'My message body';

        $filename = $_FILES["userfile"]["name"]; // add this line of code to auto pick the file name
        //$mail->addAttachment($uploadfile, 'My uploaded file'); use the one below instead

        $mail->addAttachment($uploadfile, $filename);
        if (!$mail->send()) 
        {
            $msg .= "Mailer Error: " . $mail->ErrorInfo;
        } 
        else 
        {
            $msg .= "Message sent!";
        }
    } 
        else 
        {
            $msg .= 'Failed to move file to ' . $uploadfile;
        }
}
?>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>PHPMailer Upload</title>
</head>
<body>
<?php if (empty($msg)) { ?>
    <form method="post" enctype="multipart/form-data">
        <input type="hidden" name="MAX_FILE_SIZE" value="4194304" />
        <input name="userfile" type="file">
        <input type="submit" value="Send File">
    </form>

<?php } else {
    echo $msg;
} ?>
</body>
</html>
0
pancy1

Das wird perfekt funktionieren

    <form method='post' enctype="multipart/form-data">
    <input type='file' name='uploaded_file' id='uploaded_file' multiple='multiple' />
    <input type='submit' name='upload'/> 
    </form>

    <?php
           if(isset($_POST['upload']))
        {
             if (isset($_FILES['uploaded_file']) && $_FILES['uploaded_file']['error'] == UPLOAD_ERR_OK)
                {
                     if (array_key_exists('uploaded_file', $_FILES))
                        { 
                            $mail->Subject = "My Subject";
                            $mail->Body = 'This is the body';
                            $uploadfile = tempnam(sys_get_temp_dir(), sha1($_FILES['uploaded_file']['name']));
                        if (move_uploaded_file($_FILES['uploaded_file']['tmp_name'], $uploadfile))
                             $mail->addAttachment($uploadfile,$_FILES['uploaded_file']['name']); 
                            $mail->send();
                            echo 'Message has been sent';
                        }       
                else
                    echo "The file is not uploaded. please try again.";
                }
                else
                    echo "The file is not uploaded. please try again";
        }
    ?>
0