Отправить вложение файлов из формы с помощью phpMailer и PHP
У меня есть форма на example.com/contact-us.php
, которая выглядит так (упрощена):
<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>
В моем файле process.php
у меня есть следующий код, использующий PHPMailer()
для отправки электронной почты:
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.";
Электронная почта отправляет тело правильно, но без вложения uploaded_file
.
МОЙ ВОПРОС
Мне нужен файл uploaded_file
из формы для прикрепления к письму и отправки. Я не забочусь о сохранении файла после того, как process.php
script отправит его по электронной почте.
Я понимаю, что мне нужно добавить AddAttachment();
где-нибудь (я предполагаю в строке Body
) для вложения, которое нужно отправить. Но...
- Что я помещаю в верхнюю часть файла
process.php
, чтобы вытащить файл uploaded_file
? Как что-то, используя $_FILES['uploaded_file']
, чтобы вытащить файл со страницы contact-us.php?
- Что входит в
AddAttachment();
для прикрепленного файла и отправляется вместе с электронной почтой и где этот код должен идти?
Пожалуйста, помогите и сообщите код! Спасибо!
Ответы
Ответ 1
Try:
if (isset($_FILES['uploaded_file']) &&
$_FILES['uploaded_file']['error'] == UPLOAD_ERR_OK) {
$mail->AddAttachment($_FILES['uploaded_file']['tmp_name'],
$_FILES['uploaded_file']['name']);
}
Основной пример также можно найти здесь.
Определение функции для AddAttachment
:
public function AddAttachment($path,
$name = '',
$encoding = 'base64',
$type = 'application/octet-stream')
Ответ 2
Файл не может быть прикреплен с клиентского ПК (загрузить)
В HTML-форме я не добавил следующую строку, поэтому вложение не было:
ENCTYPE = "многочастному/форм-данных"
После добавления строки в форме (как показано ниже) приложение отлично подойдет.
<form id="form1" name="form1" method="post" action="form_phpm_mailer.php" enctype="multipart/form-data">
Ответ 3
Вы использовали бы $_FILES['uploaded_file']['tmp_name']
, это путь, по которому PHP хранит загруженный файл (это временный файл, автоматически удаленный PHP при завершении script, если вы не переместили его/скопировали в другое место).
Предполагая правильность настроек загрузки на стороне клиента и серверной загрузки, вам нечего делать, чтобы "загрузить" загрузку. Это будет просто волшебным образом доступно в этом пути tmp_name.
Обратите внимание, что вам необходимо подтвердить, что загрузка действительно выполнена успешно, например
if ($_FILES['uploaded_file']['error'] === UPLOAD_ERR_OK) {
... attach file to email ...
}
В противном случае вы можете попытаться выполнить вложение с поврежденным/частичным/несуществующим файлом.
Ответ 4
Используйте этот код для отправки вложения с параметром файла загрузки с использованием формы html в 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> ';
}
}
?>
Используйте ссылку для справки.
Ответ 5
Этот код поможет мне в отправке вложений....
$mail->AddAttachment($_FILES['file']['tmp_name'], $_FILES['file']['name']);
Замените код AddAttachment (...) кодом выше