Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.08.2017, 21:16
Интересующийся
Отправить личное сообщение для Aleksandr Chirkov Посмотреть профиль Найти все сообщения от Aleksandr Chirkov
 
Регистрация: 24.06.2017
Сообщений: 14

Отправка HTML в письмах
Доброго времени суток. Есть проблемка, хотел бы попросить помощи у Гуру. Написал скриптик на PHP + HTML, чтоб при получении письма, в теле письма, формировалась mini-web страница.

У меня хостинг на timeweb. И это письмо уходит в 2 направления, на тот адрес который указывает пользователь и на стандартный, который я сам задал. Проблема в том, что на моём хостинге письмо смотрится хорошо. Но когда отсылаешь на rambler, mail или яндекс, письмо отказывается формироваться как страница и получается текст.

https://yadi.sk/i/bOSRDVMR3M3MbF - timeweb
https://yadi.sk/i/7dKn98f83M3McG - mail

часть скрипта которая отвечает за отправку html вот:

$text = '
	<head>
		<style type="text/css">
			a{text-decoration: none; color:white;}
			a:hover{color:red; text-shadow:1px 1px 2px black, 0 0 1em red;}
            @font-face{font-family: bernier; src: url(http://test104.ru/fonts/bernier.otf);}
			h1{text-align:center; font-family: bernier; color:white; letter-spacing:2px;}
			h2{padding:0px;color:white;font-family: bernier;}
			p {color:white;font-size:20px;font-family:bernier;}
			span{color:white;font-size:20px;font-family:bernier;}
            .forLetter{background-image:url(http://test104.ru/images/letter/back.png);width:800px;height:600px;}
			.text{width:53%;height:100%;}
			.centerPart{width:60%;height:25%;position:relative;left:20%;}
			.logo{width:40%;}
			.flamePic{position:relative;z-index:10;opacity:0.5;width:800px;height:100px;top:-80px;}
		</style>
	</head>
    <body>
		<div class="forLetter">
			<div class="text"> 
				<h1>ПРИВЕТ!</h1>
				<center><span>МЕСТО В BFB НА ' . $date . '</span><br>
				<span>ДЛЯ БАЙКЕРОВ ГАРАНТИРОВАННО!</span>
				<h2>Дальше:</h2></center>
					<div class="centerPart">
					<p>1. ЗАВОДИ МОТИК</p>
					<p>2. ТЕБЕ <a href="http://barforbikers.ru/location.html">СЮДА</a></p>
					<p>3. ВОТ ТЕБЕ <a href="http://barforbikers.ru/menu.html">ХЛЕБА</a></p>
					<p>4. ВОТ ТЕБЕ <a href="http://barforbikers.ru/events.html">ЗРЕЛИЩ</a></p>
					</div>
				<center><p>ПОЧУВСТВУЙ ВКУС СВОБОДЫ</p>
                <img src="cid:LogoWhite.png" class="logo">
				<p>P.S.:ВЫПИЛ? ЗА РУЛЬ НЕ САДИСЬ!<br> А ДЛЯ ВСЕГО ОСТАЛЬНОГО ЕСТЬ МОТОЭВАКУАТОР!</p></center>
			</div>
            <img src="cid:flame.png" alt="пожар" class="flamePic">
		</div>
	</body>
    ';


//Заголовки формы
//пока отправляю без From - потому что странное дело с From письмо не доходит
	$headers .= "subject: $subject\r\n"; 
	$headers .= "Date: " . date("r") . "\r\n";
	$headers .= "X-Mailer: zm php script\r\n";
	$headers .= "MIME-Version: 1.0\r\n";
	$headers .= "Content-Type: multipart/alternative;\r\n";
	$baseboundary = "------------" . strtoupper(md5(uniqid(rand(), 
        true)));
	$headers .= "  boundary=\"$baseboundary\"\r\n";


//Тело письма
	$message = "--$baseboundary\r\n";
	$message .= "Content-type: text/plain;\r\n";
	$message .= "Content-Transfer-Encoding: 7bit\r\n\r\n"; 
	$message .= "--$baseboundary\r\n";
	$newboundary = "------------" . strtoupper(md5(uniqid(rand(), true)));
	$message .= "Content-Type: multipart/related;\r\n";
	$message .= "  boundary=\"$newboundary\"\r\n\r\n\r\n";
	$message .= "--$newboundary\r\n";
	$message .= "Content-Type: text/html; charset=utf-8\r\n";
	$message .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
	$message .= $text . "\r\n\r\n";


Вот подскажите, куда разбираться? В каком направлении копнуть, может я MIME не совместимый использую или content type надо писать text/html?
Ответить с цитированием
  #2 (permalink)  
Старый 15.08.2017, 21:18
Интересующийся
Отправить личное сообщение для Aleksandr Chirkov Посмотреть профиль Найти все сообщения от Aleksandr Chirkov
 
Регистрация: 24.06.2017
Сообщений: 14

Ой карамба! Вообще не в тот топик её поместил, модераторы простите!
Ответить с цитированием
  #3 (permalink)  
Старый 16.08.2017, 00:04
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от Aleksandr Chirkov
отправляю без From - потому что странное дело с From письмо не доходит
Если адрес To совпадает с адресом From, то почтовый сервер может такое письмо отклонить, Яндекс, с недавних пор, это делает гарантировано.

<style type="text/css"> в письме, это, конечно, красиво, но никак не гарантирует, что будет принято к вниманию. Почта все-так не веб страница и различные почтовые сервера и почтовые клиенты в этом отношению поступают по своему усмотрению. То что вы можете видеть красоту на одном, совсем не означает, что на другом тоже такое будет. Кроме того, даже поддерживая стили встроенные, поддержка может быть только некоторых, а не всего существующего разнообразия.

Отправлять адресату письмо как HTML и надеяться, что он таковым его и прочтет, это как гадать на кофейной гуще - вид письма определяет не mime тип его, а настройки почтового ящика, если пользователь определил получать письма как текст, то ваше письмо будет кошмарным для него. Гарантированно читабельным для получателя будет письмо содержащее в себе две части - text/plain и text/html.

Ваше письмо по типу конечно же глупость - его содержание объявляется и как text/plain (строка 55) и как text/html (строка 62).

subject: $subject\r\n - объявления charset на тему письма не влияют, тему нужно кодировать.

Тип multipart имеет три субтипа - mixed, alternative и related, которые используются синтаксически одинаково, но имеют разное предназначение:

mixed - используется, когда в рамках одного почтового сообщения имеется несколько независимых друг от друга, и равнозначных частей. Самый простой пример такого письма - сообщение с вложением.
alternative - используется, когда в одном почтовом сообщении содержится несколько частей, содержащих одну и ту же информацию, предназначенную для отображения на различном клиентском ПО - например текстовая и HTML версия одного и того же письма.
related - используется, когда в одном почтовом сообщении содержится несколько частей, формирующих один итоговый документ. Пример - HTML письмо с картинками. Запомните, по стандарту только в этом случае должны работать ссылки на Contend-id элементов вида <img src="cid:image">.

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

mixed - порядок частей для наших задач не имеет значения.

alternative - части должны быть расставлены по порядку, от более простых к более сложным. RFC регламентирует процесс выбора одной из версий письма клиентом пользователя примерно так: "В общем случае, почтовый клиент должен отображать последнюю доступную ему версию документа". То есть, при формировании текстовой и HTML-версий письма необходимо вперед поставить текстовую.

related - первой в очереди должна идти основная часть (HTML документ, например). Следом - все остальные. По большому счету, стандартом регламентирован специальный параметр "start", который указывает на основную часть документа, но этим лучше не злоупотреблять.

Любая из частей письма может так же иметь Content-type: multipart, а значит можно выстроить некоторое подобие древовидной структуры, гарантирующей, что каждая из частей письма займет правильное место. Например структура письма, имеющего текстовую и HTML версию (HTML с картинками), а так же приложенный документ MS Word:

Content-type: multipart/mixed
    Content-type: multipart/alternative
        Content-type: text/plain
        Content-type: multipart/related
            Content-type: text/html
            Content-type: image/jpeg
            Content-type: image/jpeg
    Content-type: application/msword


Разделитель в почтовом отправлении зависит от платформы, которую можно определить как:

$CRLF = substr(PHP_OS, 0, 3) != "WIN" ? "\n" : "\r\n";


Но лучше использовать константу PHP_EOL возвращающую необходимое в зависимости от платформы.

Рекомендации и регламенты отправления почтовых сообщений описаны в соответствующих документах RFC.

Последний раз редактировалось laimas, 16.08.2017 в 00:06.
Ответить с цитированием
  #4 (permalink)  
Старый 18.08.2017, 13:14
Интересующийся
Отправить личное сообщение для Aleksandr Chirkov Посмотреть профиль Найти все сообщения от Aleksandr Chirkov
 
Регистрация: 24.06.2017
Сообщений: 14

Вообщем я разобрался частично, проблема была здесь:
$text = '
<body>
<div style="background-image:url(http://test104.ru/images/letter/back.png);width:800px;height:600px;">
<div style="width:53%;height:100%;"> 
<h1 style="text-align:center; font-family: bernier; color:white; letter-spacing:2px;">ПРИВЕТ!</h1>
<center><span style="color:white;font-size:17px;font-family:bernier;">МЕСТО В BFB НА ' . $date . '</span><br>
<span style="color:white;font-size:17px;font-family:bernier;">ДЛЯ ' . $numberOfGuests . ' БАЙКЕРОВ ГАРАНТИРОВАННО!</span>
<h2 style="padding:0px;color:white;font-family: bernier;">Дальше:</h2></center>
<center><span style="color:white;font-size:20px;font-family:bernier;">1. ЗАВОДИ МОТИК</span></center>
<center><span style="color:white;font-size:20px;font-family:bernier;">2. ТЕБЕ <a href="http://barforbikers.ru/location.html" style="text-decoration: none; color:red; text-shadow:1px 1px 2px black, 0 0 1em red;">СЮДА</a></span></center>
<center><span style="color:white;font-size:20px;font-family:bernier;">3. ВОТ ТЕБЕ <a href="http://barforbikers.ru/menu.html" style="text-decoration: none; color:red; text-shadow:1px 1px 2px black, 0 0 1em red;">ХЛЕБА</a></span></center>
<center><span style="color:white;font-size:20px;font-family:bernier;">4. ВОТ ТЕБЕ <a href="http://barforbikers.ru/events.html" style="text-decoration: none; color:red; text-shadow:1px 1px 2px black, 0 0 1em red;">ЗРЕЛИЩ</a></span></center>
<center><p style="color:white;font-size:20px;font-family:bernier;">ПОЧУВСТВУЙ ВКУС СВОБОДЫ</p>
<img src="cid:LogoWhite.png" style="width:150px; @media(max-width: 400px){width="30px;}">
<p style="color:white;font-size:17px;font-family:bernier;">P.S.:ВЫПИЛ? ЗА РУЛЬ НЕ САДИСЬ!<br> А ДЛЯ ВСЕГО ОСТАЛЬНОГО ЕСТЬ МОТОЭВАКУАТОР!</p></center>
</div>
</div>
</body>
';


Во первых, описания стиля для каждого элемента нужно дописывать в нём с помощью тега style
Во вторых, интерпритатор на веб мэйлах, не читает % - так что старайтесь в коде их избегать.
В третьих $message .= "Content-type: text/html;\r\n"; - тут должно быть html вместо plain.
Единственное, ещё не знаю работает ли тэг media - потому что для мобильных устройств в частности для iphone отражается не правильное разрешение.

Спасибо большое за предыдущий комментарий, но я если честно не очень понимаю как применять это на практике? То есть задумка в том, чтобы выстроить "дерево" страницы и как-то передавать на почтовые агенты зашифрованный html (div-ов) ? Просто не понятно, на что влияют это режимы?
Ответить с цитированием
  #5 (permalink)  
Старый 18.08.2017, 13:24
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от Aleksandr Chirkov
описания стиля для каждого элемента нужно дописывать в нём с помощью тега style
Именно, по крайней мере для почтовых серверов есть некая гарантия, что будет так как задумано. А вот с почтовыми клиентами сложнее.

Сообщение от Aleksandr Chirkov
В третьих $message .= "Content-type: text/html;\r\n"; - тут должно быть html вместо plain.
Конечно, ибо тело сообщения, это html. Но отдавать так письмо можно в том случае, если вы уверены, что ваши адресаты получают письма как html. А корректно, письмо, это две его версии - одна текстовая, другая html, и клиент будет читать ту, которую определяют настройки его почтового клиента.

Что значит "зашифрованный html" ни чего не понял, да и зачем.
Ответить с цитированием
  #6 (permalink)  
Старый 18.08.2017, 14:02
Интересующийся
Отправить личное сообщение для Aleksandr Chirkov Посмотреть профиль Найти все сообщения от Aleksandr Chirkov
 
Регистрация: 24.06.2017
Сообщений: 14

Просто я когда экспериментировал, пытался передать в письме div элементы с собственным форматированием <div style и.т.д>
И у меня почтовые клиенты не принимали форматирование этих div элементов, вот я и подумал, что может это такой способ выстраивания

Content-type: multipart/mixed
Content-type: multipart/alternative
Content-type: text/plain //какой-то текстовый заголовок
Content-type: multipart/related //объединённый формат письма
и html + jpg + word
Content-type: text/html //Div элемент
Content-type: image/jpeg //в нём 2 картинки
Content-type: image/jpeg
Content-type: application/msword //ну тут понятно ворд
Ответить с цитированием
  #7 (permalink)  
Старый 18.08.2017, 14:11
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

<div style и.т.д> и прочее, то есть стили, не имеют отношения к Content-type. Уже говорилось, что объявленные стили в html сообщении не обязательно будут интерпретироваться ПО. Можете в сети поискать что почтовые сервера (конечно речь будет идти о крупных) и почтовые клиенты отображают из стилей.

Content-type задает структуру тела почтового отправления и она должна соответствовать документу. Если в отправлении есть строка не обрамленная html тегом, то это не означает, что одна не относится к этому отправлению, то есть не является Content-type: text/html и для нее надо отдельно указывать Content-type: text/plain. Это конечно же абсурд.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Диалог между HTML и внешним JS в контексте расширения GoogleChrome ev1lart Events/DOM/Window 0 26.04.2017 19:25
Отправка формы HTML через outlook Platypus Общие вопросы Javascript 2 18.07.2013 01:07
Отправка HTML AJAX'ом posta jQuery 5 20.04.2011 18:33
Очень нужно.. Отправка HTML куски в JSON от сервера используя Ajax bivnikus jQuery 8 26.10.2010 23:54
Отправка письма HTML mycoding Ваши сайты и скрипты 2 22.06.2010 18:27