Итак, как я сказал в комментариях, вы должны использовать Swift Mailer или PHPMailer . Я немного исправил ваш код, но все еще есть части, которые не очень хороши.
И самое главное: не изобретайте велосипед - уже есть отличные почтовые библиотеки. Функция mail()
должна использоваться только в качестве базового слоя для библиотек, никогда не отправляйте электронные письма с ней в своем коде.
Что я сделал:
- заменил ваш чек регулярного выражения на
filter_var()
- отредактировал ваше расширение и проверку типа пантомимы с помощью чего-то более удобочитаемого
- добавил код, необходимый для отправки вложения (не проверял его, возможно, он не работает должным образом, но должен)
- заменен синтаксис длинного массива (
array()
) на синтаксис короткого массива ([]
)
Что я не делал:
- Я не полировал ваш код, чтобы он был более читабельным
- Я не устранил проблему с перемещением файла (вы не должны использовать относительный путь, поэтому было бы лучше с чем-то вроде этого:
move_uploaded_file($_FILES["uploads"]["tmp_name"], __DIR__."/upload/" . $_FILES["uploads"]["name"]);
)
В любом случае, вот ваш код.
<?php
if (isset($_POST['email'])) {
// TO AND FROM
$emailTo = "info@mysite.com";
$emailSubject = "Enquiry from my website";
function died($error)
{
// ERROR MESSAGES TO THE USER
echo "We are very sorry, but there were error(s) found with the form you submitted. ";
echo "These errors appear below.<br /><br />";
echo $error . "<br /><br />";
echo "Please go back and fix these errors.<br /><br />";
die();
}
// VALIDATION ON EXPECTED DATA
if (!isset($_POST['yourname']) ||
!isset($_POST['phone']) ||
!isset($_POST['email']) ||
!isset($_POST['enquiring']) ||
!isset($_POST['field'])) {
died('We are sorry, but there appears to be a problem with the form you submitted.');
}
$nameFrom = $_POST['yourname']; // required
$phone = $_POST['phone']; // not required
$emailFrom = $_POST['email']; // required
$enquiring = $_POST['enquiring']; // not required
$field = $_POST['field']; // not required
$uploads = $_FILES['uploads']; // not required
// MANDATORY FIELDS
$errorMessage = "";
if (!filter_var($emailFrom, FILTER_VALIDATE_EMAIL)) {
$errorMessage .= 'The email address you entered does not appear to be valid.<br />';
}
// commented out, users whose names include special characters (á, ý, etc.) would be filtered out
// $stringExp = "/^[A-Za-z .'-]+$/";
// if (!preg_match($stringExp, $nameFrom)) {
// $errorMessage .= 'The name you entered does not appear to be valid.<br />';
// }
if (strlen($errorMessage)) {
died($errorMessage);
}
$emailMessage = "Services Form.\n\n";
function clean_string($string)
{
$bad = ["content-type", "bcc:", "to:", "cc:", "href"];
return str_replace($bad, "", $string);
}
$emailMessage .= "Name: " . clean_string($nameFrom) . "\n";
$emailMessage .= "Phone: " . clean_string($phone) . "\n";
$emailMessage .= "Email: " . clean_string($emailFrom) . "\n";
$emailMessage .= "I am " . clean_string($enquiring) . "\n";
$emailMessage .= "field: " . clean_string($field) . "\n";
// FILE UPLOADS
$allowedExts = ["ai", "doc", "docx", "gif", "jpeg", "jpg", "pdf", "png", "psd"];
$allowedMimeTypes = [
"image/gif",
"image/jpeg",
"image/png",
"image/pjpeg"
];
$extension = pathinfo($_FILES["uploads"]["name"], PATHINFO_EXTENSION);
if (in_array($_FILES["uploads"]["type"], $allowedMimeTypes) && $_FILES["uploads"]["size"] < 200000 && in_array($extension, $allowedExts)) {
if ($_FILES["uploads"]["error"] > 0) {
echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
} else {
echo "Upload: " . $_FILES["uploads"]["name"] . "<br />";
echo "Type: " . $_FILES["uploads"]["type"] . "<br />";
echo "Size: " . ($_FILES["uploads"]["size"] / 1024) . " Kb<br />";
echo "Temp file: " . $_FILES["uploads"]["tmp_name"] . "<br />";
if (file_exists("upload/" . $_FILES["uploads"]["name"])) {
echo $_FILES["uploads"]["name"] . " already exists. ";
} else {
move_uploaded_file($_FILES["uploads"]["tmp_name"], "upload/" . $_FILES["uploads"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["uploads"]["name"];
}
}
} else {
echo "Invalid file";
}
$filePath = "upload/" . $_FILES["uploads"]["name"];
$fileContent = chunk_split(base64_encode(file_get_contents($filePath)));
$separator = md5(random_int(PHP_INT_MIN, PHP_INT_MAX));
$eol = "\r\n";
// EMAIL HEADERS
$headers = "";
$body = "";
$headers .= "From: {$emailFrom}{$eol}";// Sender Email
$headers .= "Reply-To: {$emailFrom}{$eol}";
$headers .= "X-Mailer: PHP/" . phpversion() . $eol;
$headers .= "MIME-Version: 1.0{$eol}";
$headers .= "Content-Type: multipart/mixed; boundary=\"{$separator}\"{$eol}";
$headers .= "Content-Transfer-Encoding: 7bit{$eol}";
$headers .= "This is a MIME encoded message.{$eol}";
// the text message
$body .= "--{$separator}{$eol}";
$body .= "Content-Type: text/plain; charset=\"utf-8\"{$eol}";
$body .= "Content-Transfer-Encoding: 8bit{$eol}";
$body .= $emailMessage . $eol;
// the attachment
$body .= "--{$separator}{$eol}";
$body .= "Content-Type: {$_FILES["uploads"]["type"]}; name=\"{$_FILES["uploads"]["name"]}\"{$eol}";
$body .= "Content-Transfer-Encoding: base64{$eol}";
$body .= "Content-Disposition: attachment{$eol}";
$body .= $fileContent . $eol;
$body .= "--{$separator}--";
@mail($emailTo, $emailSubject, $body, $headers);
?>
<!-- SUCCESS MESSAGE -->
<?php
header("Location: thank-you.html");
exit();
?>
Your message has been sent. Thank you for contacting us, We'll get back to you as soon as possible.
<?php
}