электронная почта — почта с вложенным файлом — сообщение зашифровано

Я написал этот код для отправки электронного письма с вложением в php в формате html:

<?php

if($_POST && isset($_FILES['file-upload'])){

$from             = $_POST["email"];
$rubinetteria     = 'info@domain.com';

$nome             = filter_var($_POST["nome"], FILTER_SANITIZE_STRING);
$email            = filter_var($_POST["email"], FILTER_SANITIZE_STRING);
$oggetto          = filter_var($_POST["oggetto"], FILTER_SANITIZE_STRING);
$compagnia        = filter_var($_POST["company"], FILTER_SANITIZE_STRING);
$ruolo            = filter_var($_POST["ruolo"], FILTER_SANITIZE_STRING);
$messaggio        = filter_var($_POST["messaggio"], FILTER_SANITIZE_STRING);

$fileTmpName     = $_FILES['file-upload']['uploads'];
$fileName        = $_FILES['file-upload']['name'];
$fileSize        = $_FILES['file-upload']['size'];
$fileType        = $_FILES['file-upload']['type'];
$fileError       = $_FILES['file-upload']['error'];$handle = fopen($fileTmpName, "r");
$content = fread($handle, $fileSize);
fclose($handle);
$encoded_content = chunk_split(base64_encode($content));

$boundary = md5("sanwebe");

$headers = "MIME-Version: 1.0\r\n";
$headers .= "From:".$compagnia."\r\n";
$headers .= "Reply-To: ".$reply_to_email."" . "\r\n";
$headers .= "Content-Type: multipart/mixed; boundary = $boundary\r\n\r\n";$body = "--$boundary\r\n";
$body .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$body .= "Content-Transfer-Encoding: base64\r\n\r\n";
$body .= "<b>Azienda: </b>" .$compagnia. "<br>";
$body .= "<b>Nome e Cognome: </b>" .$nome. "<br>";
$body .= "<b>Ruolo: </b>" .$ruolo. "<br>";
$body .= "<br>". chunk_split(base64_encode($messaggio));$body .= "--$boundary\r\n";
$body .="Content-Type: $fileType; name=".$fileName."\r\n";
$body .="Content-Disposition: attachment; filename=".$fileName."\r\n";
$body .="Content-Transfer-Encoding: base64\r\n";
$body .="X-Attachment-Id: ".rand(1000,99999)."\r\n\r\n";
$body .= $encoded_content;

$sentMail = @mail($rubinetteria, $oggetto, $body, $headers);

}?>

Проблема в том, что когда я получаю электронное письмо, некоторые сообщения зашифрованы.
Я думаю, проблема в этой строке кода:

$body .= "<br>". chunk_split(base64_encode($messaggio));

Я попытался подписать эту строку с этим:

$body .= "<br>".$messaggio;

Но в этом случае сообщение не зашифровано, но нет файла вложения (описание подтверждает, что вложение действительно обработано, но не получено)

0

Решение

У вас есть две проблемы

1)

 $fileTmpName     = $_FILES['file-upload']['uploads'];

Это неверно, $_FILES значение, на которое вы ссылаетесь, должно быть временным местоположением загруженного файла, то есть [uploads] но [tmp_name]поэтому замените приведенный выше код на:

 $fileTmpName     = $_FILES['file-upload']['tmp_name'];

2)

Вторая проблема — размер файла, который вы дали PHP для чтения $fileSize является не полный файл, поэтому вложение усекается и, следовательно, отображается неправильно (появляется «зашифрованный»).

Я заметил, что у PHP много проблем с тем, как он считает размеры файлов [возможно, на некоторых платформах, я не знаю]. В этом случае это похоже на значение, данное fread Функция не имеет тот же счетчик байтов, что и фактический полный размер файла, поэтому mail Функция загружает только ~ 99% вложенных файлов, что означает, что файл является неполным и поэтому будет выглядеть искаженным («Зашифрованы»).

Как указано на странице руководства:

Если вы просто хотите получить содержимое файла в строку, используйте file_get_contents (), так как он имеет гораздо лучшую производительность [чем fread ()].

так замени $handle = fopen($fileTmpName, "r");
$content = fread($handle, $fileSize); с:

 $content = file_get_contents($fileTmpName);

И это поймает все размер файла, а не произвольная сумма, определяемая $fileSize,
Теперь у вас должен быть полный файл, загруженный в вашу электронную почту.


Бонус:

Как отмечено nogad, вы действительно должны искать, используя Свифт Мейлер или же PHPMailer как mail Функция таит в себе такие же маленькие проблемы, как здесь.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector