#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, зачем внедрять отдельный класс, когда он отлично работает без него