Вложение файла не отправляется на электронную почту с помощью PHP
Я пытаюсь отправить вложение из формы. В электронном письме создается вложение, а не то, которое я пытаюсь загрузить. Я хотел бы, чтобы он загрузил и изменил имя на $strNewFileName
, когда его отправят пользователю.
Html-код:
<input type="file" class="upload" name="uploaded_file[]" id="uploaded_file"></input>
Php-файл:
<?php
$strTo = "[email protected]";
$strSubject = "Document Updated";
$strMessage = nl2br($_GET["sqlCode"]);
$strNewFileName = $_GET["RevisedFileName"];
if (is_uploaded_file($_FILES['uploaded_file']['tmp_name'])) {
echo "File ". $_FILES['uploaded_file']['name'] ." uploaded successfully.\n";
echo "Displaying contents\n";
readfile($_FILES['uploaded_file']['tmp_name']);
} else {
echo "Possible file upload attack: ";
echo "filename '". $_FILES['uploaded_file']['tmp_name'] . "'.";
}
//*** Uniqid Session ***//
$strSid = md5(uniqid(time()));
$strHeader = "";
$strHeader .= "From: Document Update\r\nReply-To: [email protected]";
$strHeader .= "MIME-Version: 1.0\n";
$strHeader .= "Content-Type: multipart/mixed; boundary=\"".$strSid."\"\n\n";
$strHeader .= "This is a multi-part message in MIME format.\n";
$strHeader .= "--".$strSid."\n";
$strHeader .= "Content-type: text/html; charset=utf-8\n";
$strHeader .= "Content-Transfer-Encoding: 7bit\n\n";
$strHeader .= $strMessage."\n\n";
rename("$strFilesName", "$strNewFileName");
// *** Attachment *** //
$strFilesName = $_FILES["uploaded_file"]["name"];
$strContent = chunk_split(base64_encode(file_get_contents($_FILES["uploaded_file"]["name"])));
$strHeader .= "--".$strSid."\n";
$strHeader .= "Content-Type: application/pdf; name=\"".$strNewFileName."\"\r\n";
$strHeader .= "Content-Transfer-Encoding: base64\n";
$strHeader .= "Content-Disposition: attachment;\n\n";
$strHeader .= $strContent."\n\n";
$flgSend = @mail($strTo,$strSubject,$strMessage,$strHeader);
if($flgSend)
{
echo "Approval Send Complete.";
}
else
{
echo "Cannot send mail, Approval has not been processed.";
}
?>
2 answers
Я думаю, что ваша проблема здесь:
$strContent = chunk_split(base64_encode(file_get_contents($_FILES["uploaded_file"]["name"])));
_FILES["uploaded_file"]["name"]
представляет исходное имя загруженного файла, а не его местоположение на сервере. Для этого вам нужно использовать $_FILES['uploaded_file']['tmp_name']
(как вы делали ранее в сценарии, где вы подтверждаете, что это правильно загруженный файл.
Также для доступа к массиву (из-за использования uploaded_file[]
в качестве имени ввода) вам нужно будет сделать что-то подобное, чтобы создать массив допустимых вложений:
$valid_attachments = array();
foreach ($_FILES['uploaded_file']['tmp_name'] as $key => $temp_file_name) {
if (is_uploaded_file($temp_file_name)) {
$valid_attachments[] = array(
'path' => $temp_file_name,
'filename' => $_FILES['uploaded_file']['name'][$key],
'type' => $_FILES['uploaded_file']['type'][$key],
'size' => $_FILES['uploaded_file']['size'][$key]
);
}
}
Затем вам нужно будет выполнить цикл по этому массиву в вашем Раздел кода "Вложение" и добавьте вложения в электронное письмо.
Похоже, что у вас настроена загрузка файлов для отправки нескольких файлов, name="uploaded_file[]"
но вы обрабатываете только один файл в своем php-коде. В этом случае просто удалите []
в вашем html-файле.