PHPMailer multi-part message in MIME format

Рейтинг: 0Ответов: 2Опубликовано: 22.01.2023

В общем стандартная отправка сообщение с хоста без SMTP. На нескольких сайтах данный скрипт работает отлично. Ничего не меняя взял его. И пошло поехало

This is a multi-part message in MIME format.

--b1_Jw760u5PXNa6jZt6GmnvxNLWHLkxcLTV7NC9d4AwM
Content-Type: multipart/alternative;
 boundary="b2_Jw760u5PXNa6jZt6GmnvxNLWHLkxcLTV7NC9d4AwM"

--b2_Jw760u5PXNa6jZt6GmnvxNLWHLkxcLTV7NC9d4AwM
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

--b2_Jw760u5PXNa6jZt6GmnvxNLWHLkxcLTV7NC9d4AwM
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 8bit

Погуглил. Ничего толкового не нашёл. Сам код отправки

$name = $_POST['username'];
    $date = $_POST['date'];
    $phone = $_POST['phone'];
    $message = $_POST['message'];
    
    $title = "Заявка с сайта" . $sitename;
    $msg = '';
    if (!empty($message)) {

        $msg = '<b>Другие сведения:</b><br>' . $message;
    }
    $body = "
    <h2>Новый вопрос</h2>
    <b>Имя:</b><br>$name<br><br>
    <b>Дата рождения:</b><br>$date<br><br>
    <b>Телефон:</b><br>$phone<br><br>
    $msg";

    $mail = new PHPMailer\PHPMailer\PHPMailer();
    $mail->setFrom($sitemail, $sitename);
    $mail->addAddress($mymail);
    $mail->CharSet = "UTF-8";
    $mail->Subject = $title;
    $mail->msgHTML($body);

    if (!empty($_FILES)) {
        for ($ct = 0; $ct < count($_FILES); $ct++) {
            $uploadfile = tempnam(sys_get_temp_dir(), sha1($_FILES['file-' . $ct]['name']));
            $filename = $_FILES['file-' . $ct]['name'];
            if (move_uploaded_file($_FILES['file-' . $ct]['tmp_name'], $uploadfile)) {
                $mail->addAttachment($uploadfile, $filename);
                $rfile[] = "Файл $filename прикреплён";
            } else {
                $rfile[] = "Не удалось прикрепить файл $filename";
            }
        }
    }
    if ($mail->send()) {
        $result = "success";
    } else {
        $result = "error";
    }
    echo json_encode(['result' => $result]);

isHTML разумеется никак не помогает

Ответы

▲ 0

В общем так и не нашёл проблему в данном коде. Видимо хостингу что-то не нравится. Отписал без библиотеки. Если кому понадобится.

    $sitename = 'SiteName';
    $sitemail = 'sitemail@example.com';

    $name = $_POST['username'];
    $date = $_POST['date'];
    $phone = $_POST['phone'];
    $message = $_POST['message'];

    $subject="Заявка с сайта $sitename";
    $from = "$sitename <$sitemail>";
    $to = 'tomail@example.com';
    $mime_boundary="==Multipart_Boundary_x".md5(mt_rand())."x";
    $headers = "From: $from\r\n" .
    "MIME-Version: 1.0\r\n" .
       "Content-Type: multipart/mixed;\r\n" .
       " boundary=\"{$mime_boundary}\"";
    $msg = '';
    if (!empty($message)) {
        $msg = '<b>Другие сведения:</b><br>' . $message;
    }
    $body = "
    <h2>Новый вопрос</h2>
    <b>Имя:</b><br>$name<br><br>
    <b>Дата рождения:</b><br>$date<br><br>
    <b>Телефон:</b><br>$phone<br><br>
    $msg";

    $multipart = "This is a multi-part message in MIME format.\n\n" .
    "--{$mime_boundary}\n" .
    "Content-Type: text/html; charset=\"UTF-8\"\n" .
    "Content-Transfer-Encoding: 7bit\n\n" .
     $body . "\n\n";
    $fileinfo = '';
    if (!empty($_FILES)) {
        foreach ($_FILES as $userfile) {
            $tmp_name = $userfile['tmp_name'];
            $type = $userfile['type'];
            $name = $userfile['name'];
            $size = $userfile['size'];
            $fileinfo = $type . '|' . $name . '|' . $size;
            if (file_exists($tmp_name)) {
                if (is_uploaded_file($tmp_name)) {

                    $file = fopen($tmp_name, 'rb');
                    $data = fread($file, filesize($tmp_name));
                    fclose($file);
                    $data = chunk_split(base64_encode($data));

                }
                $multipart .= "--{$mime_boundary}\n" .
                    "Content-Type: {$type};\n" .
                    " name=\"{$name}\"\n" .
                    "Content-Disposition: attachment;\n" .
                    " filename=\"{$name}\"\n" .
                    "Content-Transfer-Encoding: base64\n\n" .
                    $data . "\n\n";
            }
        }
    }
    $multipart.="--{$mime_boundary}--\n";
    if (@mail($to, $subject, $multipart, $headers)) {
        $result = "success";
    } else {
        $result = "error";
    }
    echo json_encode(['result' => $result]);
▲ 0

Нужно обновить phpmailer До 6.х версии и проблема уйдет. Связано с поддержкой PHP 8.0.

Скачать последнюю версию можно тут https://github.com/PHPMailer/PHPMailer/blob/master/src/PHPMailer.php