Поврежденное изображение при отправке электронного письма с вложением изображения с помощью php mail ()

#php #image #email #attachment #corrupt

#php #изображение #Адрес электронной почты #вложение #повреждено

Вопрос:

Я следую примеру отправки электронного письма с вложением изображения через mail (). Электронное письмо отправляется нормально, и изображение прикреплено, но когда я пытаюсь открыть изображение, браузер сообщает мне, что оно повреждено. Я сохранил изображение и открыл его в текстовом редакторе, и содержимое все еще находится в base64, как видно из этого фрагмента файла: http://pastebin.com/B2VgarH8

Строка Content-Transfer-Encoding: base64, которую я предполагаю, сообщает браузеру интерпретировать изображение, но это ничего не делает. Я пытался открыть его в Firefox и Chrome, и результат тот же. У кого-нибудь есть идея, почему это не удается?

 $to = 'admin@hostoi.com';
$subject = $matches[3][$i];
$bound_text = "AbC123";
$bound = "--".$bound_text."rn";
$bound_last = "--".$bound_text."--rn";
$headers = "From: me@gmail.comrn";
$headers .= "MIME-Version: 1.0rnContent-Type: multipart/mixed; boundary="$bound_text"";
$message = "If you can see this MIME than your client doesn't accept MIME types!rn" . $bound;
$message .= "Content-Type: text/html; charset="iso-8859-1"rn" .
    "Content-Transfer-Encoding: 7bitrnrn" . (string)$matches[5][$i] . "rn" . $bound;

$attachment = chunk_split(base64_encode(file_get_contents($matches[1][$i])));
$attachment_ext = substr(strrchr($matches[1][$i], '.'), 1);
$attachment_ext = $attachment_ext == 'jpg' ? 'jpeg' : $attachment_ext;
$attachment_name = time() . "_" . rand(10,99) . "." . $attachment_ext;

$message .= "Content-Type: image/$attachment_ext; name="$attachment_name"rn" .
    "Content-Transfer-Encoding: base64rn" .
    "Content-disposition: attachmentrnrn" .
    chunk_split(base64_encode($attachment)) . $bound_last;

if(mail($to, $subject, $message, $headers)) {
    echo 'MAIL SENT';
    //mysql_query("INSERT INTO message(body) VALUES(" . mysql_real_escape_string($matches[5][$i]) . ")", $dbh);
} else {
    echo 'MAIL FAILED';
}
  

Комментарии:

1. Не могли бы вы предоставить исходное сообщение электронной почты, которое выдает ваш скрипт или $message ?

2. $ message отформатировано правильно, я разобрался с проблемой, о которой я сообщу ниже, спасибо.

Ответ №1:

Я обнаружил проблему. Я вызываю base64_encode () дважды, один раз при создании $ attachment и еще раз в $ message, делая его дважды закодированным. Когда электронное письмо читается клиентом, оно декодируется только один раз, поэтому оно кажется поврежденным. Сейчас это работает фантастически.

Ответ №2:

Взгляните на PHPMailer — это потрясающий класс, который может с легкостью прикреплять изображения.

Комментарии:

1. реализация того, что у вас есть с помощью PHPMailer, займет 2 минуты.

2. Если вас интересует, как работает почта, используйте функцию mail (), в противном случае возьмите что-то вроде PHPMailer и просто отправляйте письма…

3. Взгляните на campaignmonitor.com/blog/post/1759/embedding-images-revisited

4. Я согласен с rabbits, зачем внедрять отдельный класс, когда он отлично работает без него