Прикрепление файла через PHP

djdiplomat
На сайте с 05.08.2009
Offline
136
1395

Юзал интернет. Нашел вот тут http://www.spravkaweb.ru/php/sovet/mail/file и тут

функции по прикреплению файлов http://www.spravkaweb.ru/php/sovet/mail/image

Но нифига она не работает


/*
$to - адрес получателя письма
$from_mail - адрес отправителя письма
$from_name - имя отправителя письма
$subject - тема письма
$message - само сообщение в HTML-формате
$file_name - путь к файлу, который надо прикрепить к письму
(это может быть имя файла, выбранного в поле <input name="file_name" type="file">)
*/
function sendMail($to,$from_mail,$from_name,$subject,$message,$file_name) {
$bound="spravkaweb-1234";
$header="From: '$from_name' <$from_mail>n";
$header.="To: $ton";
$header.="Subject: $subjectn";
$header.="Mime-Version: 1.0n";
$header.="Content-Type: multipart/mixed; boundary='$bound'";
$body="nn--$boundn";
$body.="Content-type: text/html; charset='windows-1251'\n";
$body.="Content-Transfer-Encoding: quoted-printablenn";
$body.="$message";
$file=fopen($file_name,"rb");
$body.="nn--$boundn";
$body.="Content-Type: application/octet-stream;";
$body.="name=".basename($file_name)."\n";
$body.="Content-Transfer-Encoding:base64n";
$body.="Content-Disposition:attachmentnn";
$body.=base64_encode(fread($file,filesize($file_name)))."n";
$body.="$bound--nn";
if(mail($to, $subject, $body, $header)) {
echo "<center>Письмо было успешно отправлено!</center>";
} else {

echo "<center>Сообщение не отправлено!</center>";
};

};

Для теста пробовал так вызывать

$message2 = "Текст письма с картинкой <IMG src='se_google_adwords_204x170.jpg'>";
sendMail("my@yandex.ru", "otpravitel@yandex.ru", "Сергей", "Тема письма", $message2, "http://drajiahs0fudw.cloudfront.net/iblock/b13/b1360d07c458f7ff595cf5390bd73075/se_google_adwords_204x170.jpg");

В итоге на my@yandex.ru приходит коцаное письмо ни вложений ни названия темы нихера ничего почти.

Может кто знает как эту функции допилить можно?

LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#1

Файло должен находиться у вас на сервере, а не где-то там.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
ДП
На сайте с 23.11.2009
Offline
203
#2

А fopen не может разве при наличии разрешений/библиотек или как оно там правильно называется (wrapper вроде), открывать файлы по url?

Но так да, надежнее файлс со своего сервера аттачить и рекомендую заюзать какую-нибудь более специализированную библиотеку, типа SwiftMailer, чтоли.

Даже если этот код и прикрепит вам к письму картинку - то вставляете в письмо вы её неправильно.

djdiplomat
На сайте с 05.08.2009
Offline
136
#3

Чет не помогло. Скрипт и файл в одной папке.

Попробовал сейчас 3 варианта поочередно:

sendMail("my@yandex.ru", "otpravitel@yandex.ru", "Сергей", "Тема письма", $message2, "wp-content/uploads/01.jpg");

sendMail("my@yandex.ru", "otpravitel@yandex.ru", "Сергей", "Тема письма", $message2, "http://mysite.ru/wp-content/uploads/01.jpg");

sendMail("my@yandex.ru", "otpravitel@yandex.ru", "Сергей", "Тема письма", $message2, "01.jpg");

Пробовал и на одном серваке.

Получаю такую штуку fopen(wp-content/uploads/01.jpg): failed to open stream: No such file or directory in

Дикий пионер:
Даже если этот код и прикрепит вам к письму картинку - то вставляете в письмо вы её неправильно.

А как правильно?

PS Я умышленно не хочу использовать мудреных библиотек. Тк по сути они то на обычной функции mail основаны. Хочу разобраться, как все работает. Чтобы знать.

Может в приведенной мною функции как-то неверно заголовок сформирован? Или еще что.

Тк. к примеру, попробовал на другом хостинге эту функию - полезли траблы. Пришлось заменить кое-что на вот - такое.


$file_name="wp-content/uploads/01.jpg";
$subj="Отправка изображения";
$bound="spravkaweb-1234";
$headers="From: Pronis <roni@yandex.ru>n";
$headers.="To: djdipl@yandex.run";
$headers.="Subject: $subjn";
$headers.="Mime-Version: 1.0n";
$headers.="Content-Type: multipart/alternative; boundary=".$bound."n";
$body="--$boundn";
$body.='Content-type: text/html; charset="windows-1251"n';
$body.="Content-Transfer-Encoding: 8bitnn";
$body.="<h3>Привет</h3>
<p>Это проба отправки письма с прикрепленной картинкой.<br>
А вот и сама картинка:<br>
<img src='cid:spravkaweb_img_1'>";
$body.="nn--$boundn";
$body.="Content-Type: image/jpeg; name='".basename($file_name)."'n";
$body.="Content-Transfer-Encoding:base64n";
$body.="Content-ID: <spravkaweb_img_1>nn";
$f=fopen($file_name,"rb");
$body.=base64_encode(fread($f,filesize($file_name)))."n";
$body.="--$bound--nn";
mail("djdipl@yandex.ru", $subj, $body, $headers);

Взято с того же сайта. Только с другой страницы. Эта же функция, ток чутка упрощенная.

ДП
На сайте с 23.11.2009
Offline
203
#4

В этом коде картинка уже как минимум правильно в html прописана.

А так, если хотите руками всё формировать - то ищите rfc на почтовые сообщения.

Попробуйте разные варианты пути передать в функцию file_exists() - какой вариант true выдаст - то и пользуйте. Если файл лежит в той же папке, что и скрипт - попробуйте __DIR__.DIRECTORY_SEPARATOR."01.jpg";

RAS
На сайте с 27.11.2005
Offline
126
RAS
#5

Если хотите отправлять почту с вложением из пхп, то рекомендую сразу использовать phpmailer.

брать с github, проблем не будет с прохождением писем и не надо ничего форматировать самому.

Администрируем сервера, впс, вдс. Ускоряем загрузку сайтов - DLE, Word Press, Joomla, Modx... Настраиваем безопасность. Ручная чистка rootkit/malware/вирусов. (/ru/forum/867860) Разработка - shell/bash/sh/python/perl.
M
На сайте с 04.12.2013
Offline
223
#6

Как было сказано, если хотите разобраться, читайте спеки. Вот вам подсказка:


MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="граница"

--граница
Content-Transfer-Encoding: base64
Content-Type: text/html; charset=utf-8

текст письма в base64 (тут возможны варианты; просто скорректируйте заголовки данной части)
--граница
Content-Transfer-Encoding: base64
Content-Type: application/zip; name="файл.zip"
Content-Disposition: attachment; filename="файл.zip"

тело файла в base64
--граница--



---------- Добавлено 11.03.2015 в 01:02 ----------

По протоколу разделителем строк является "\r\n".
Домены и скрипт для коротких ссылок: https://u75.ru/domains-for-shortcuts
djdiplomat
На сайте с 05.08.2009
Offline
136
#7

Вот я тут чутка запутался)) Лазил по разным сайтам в итоге сам свое написал (точнее собрал по частям и чутка своего).

Родил такой скрипт. (Даже удаленно загружает картинки, т.е не обязательно, чтобы был на моем серваке).

Картинка в сообщение вставляется на ура!

Но. Она просто вставляется. Она не вложение. (скрепки нет, чтоб скачать.) Подскажите, как допилить можно...

$file_name="wp-content/uploads/pic-73-150x112.jpg";

// Некоторые параметры отправляемого сообщения
$to = 'djdipl@yandex.ru';
$from = 'oleg985@rambler.ru';
$fromName = 'Oleg';
$subject = 'Test email';
// HTML-макет письма
$message = '<p>Картинка: <img src="cid:pic-73-150x112.jpg" /> И немного текста после</p>';

// Генерируем идентификатор границы файла
$boundary = 'b1_' . md5(uniqid(time()));

// Генерируем общие заголовки всего сообщения
$headers = 'Return-Path: ' . $from . "\n" .
'From: ' . $fromName . ' <' . $from . '>' . "\n" .
"MIME-Version: 1.0\n" .
"Content-Type: multipart/related;\n" .
"\ttype=\"text/html\";\n" .
"\tboundary=\"{$boundary}\"\n";

// Генерируем заголовки HTML-части письма
$content = "--{$boundary}\n" .
"Content-Type: text/html; charset=\"utf-8\"\n" .
"Content-Transfer-Encoding: 8bit\n\n";

// Присоединяем само HTML-письмо
$content .= trim($message);

// Генерируем заголовки для картинки, которая должна быть в тексте макета
$content .= "\n\n" .
"--{$boundary}\n" .
"Content-Type: image/jpg; name=\"pic-73-150x112.jpg\"\n" .
"Content-Transfer-Encoding: base64\n" .
"Content-ID: <pic-73-150x112.jpg>\n" . // Здесь указываем то, что поставили после cid в теге img
"Content-Disposition: inline; filename=\"pic-73-150x112.jpg\"\n\n";

$f=fopen($file_name,"rb");
// Кодируем в base64 в соответствии с требованиями RFC 2045
// $image = chunk_split(base64_encode(fread($f,filesize($file_name))), 76, "\n");


$fd=fopen($file_name,"rb") or die('Не могу открыть');
$contents = '';
while (!feof($fd)) {
$contents .= fread($fd, 8192);
}
//echo nl2br($contents);
$image = chunk_split(base64_encode($contents), 76, "\n");
// $image2 = base64_encode(fread($f,filesize($file_name)));
echo $f .'<br>'.$image2;
// Теперь прикрепляем саму картинку (её "исходный код")
$content .= $image;

// Завершаем письмо
$content .= "\n\n--{$boundary}--\n";

// Ну а теперь отправляем сгенерированное письмо
$sended = mail($to, $subject, $content, $headers);

// Проверяем, что вернула функция mail
var_dump($sended);
ДП
На сайте с 23.11.2009
Offline
203
#8

Насколько я помню, для вставки надо, чтобы у картинки

Content-Disposition: attachment; filename=\"pic-73-150x112.jpg\"\n\n"

было

M
На сайте с 04.12.2013
Offline
223
#9

Умеющий читать да прочтет...

[umka]
На сайте с 25.05.2008
Offline
456
#10

Если мне не изменяет память, то в тело письма контент из аттачей вставляется с использованием content-id (cid), а не с указанием имени файла.

А fopen() в PHP может открывать и урлы, если это разрешено настройками.

Лог в помощь!

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий