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...
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?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!
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')
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">
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
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.
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.
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
});
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>
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";
}
?>