Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Кодирование тела письма


thentru

Recommended Posts

Почему в движке само сообщение письма (html, текст) не кодируется в base64 + chunk_split или quoted-printable.
Есть ли какой-то общепринятый стандарт?


Один из заказчиков столкнулся с проблемой ломаной кодировки в письме

https://prnt.sc/kotr0u
При присмотре исходника тела письма видно, что строка переносится на 998 символе, при этом некорректно

Надіслати
Поділитися на інших сайтах


Если бы покупатели умели вставлять текст в способ оплаты)

Надіслати
Поділитися на інших сайтах


  • 1 month later...
Надіслати
Поділитися на інших сайтах

  • 1 year later...

причина в том, что при большой строке происходит ее разбивка для соответствия стандарту RFC 821 (лимит 1000 символов на строку)

 

только разбивка средствами движка в system\library\mail.php сделана некорректно - без учета многобайтовых кодировок и самого места разбивки (т.е. может рубить и посреди тегов и посреди ссылки)

что и приводит к появлению кракозябр в письмах с длинными строками

  • +1 1
Надіслати
Поділитися на інших сайтах

В 13.10.2018 в 15:39, shoputils сказал:

 

а для ocStore 3 подскажете куда капать? Вторую замену я нашел, а вот этого кода там нет: 

 

	public function setHtml($html) {
		$this->html = $html;
		$this->html = chunk_split(base64_encode($html));
	}

Файлы прикрепил. Буду благодарен за помощь

smtp.php mail.php

Надіслати
Поділитися на інших сайтах


  • 1 year later...

Тоже столкнулся с пропаданием символов в письмах. Происходит из-за неправильного переноса.

Фикс для OC 3.0.3.7

 

1) Файл:

system/library/mail.php

Меняем:

public function setHtml($html) {
	$this->html = $html;
}

На:

public function setHtml($html) {
	$this->html = chunk_split(base64_encode($html));
}

 

 

 2) Файл:

system/library/mail/mail.php

Меняем:

$message .= 'Content-Transfer-Encoding: 8bit' . PHP_EOL . PHP_EOL;
$message .= $this->html . PHP_EOL;

На:

$message .= 'Content-Transfer-Encoding: base64' . PHP_EOL . PHP_EOL;
$message .= $this->html . PHP_EOL;

 

 

 3) Файл:

system/library/mail/smtp.php

Меняем:

$message .= 'Content-Transfer-Encoding: 8bit' . PHP_EOL . PHP_EOL;
$message .= $this->html . PHP_EOL;

На:

$message .= 'Content-Transfer-Encoding: base64' . PHP_EOL . PHP_EOL;
$message .= $this->html . PHP_EOL;

 

 

Модификатор:

<modification>
	<name>Fix ru line breaks in email html</name>
	<version>1.0</version>
	<code>fix_ru_base64</code>
	
	<file path="system/library/mail.php">
		<operation>
			<search><![CDATA[$this->html = $html;]]></search>
			<add position="replace"><![CDATA[$this->html = chunk_split(base64_encode($html));]]></add>
		</operation>
	</file>
	
	<file path="system/library/mail/mail.php">
		<operation>
			<search index="2"><![CDATA[$message .= 'Content-Transfer-Encoding: 8bit' . PHP_EOL . PHP_EOL;]]></search>
			<add position="replace"><![CDATA[$message .= 'Content-Transfer-Encoding: base64' . PHP_EOL . PHP_EOL;]]></add>
		</operation>
	</file>
	
	<file path="system/library/mail/smtp.php">
		<operation>
			<search index="2"><![CDATA[$message .= 'Content-Transfer-Encoding: 8bit' . PHP_EOL . PHP_EOL;]]></search>
			<add position="replace"><![CDATA[$message .= 'Content-Transfer-Encoding: base64' . PHP_EOL . PHP_EOL;]]></add>
		</operation>
	</file>
	
</modification>

 

fix-ru-line-breaks-in-email-html.ocmod.zip

  • +1 7
Надіслати
Поділитися на інших сайтах


  • 1 month later...
В 22.09.2021 в 18:02, reforket сказал:

Тоже столкнулся с пропаданием символов в письмах. Происходит из-за неправильного переноса.

Фикс для OC 3.0.3.7

 

1) Файл:


system/library/mail.php

Меняем:


public function setHtml($html) {
	$this->html = $html;
}

На:


public function setHtml($html) {
	$this->html = chunk_split(base64_encode($html));
}

 

 

 2) Файл:


system/library/mail/mail.php

Меняем:


$message .= 'Content-Transfer-Encoding: 8bit' . PHP_EOL . PHP_EOL;
$message .= $this->html . PHP_EOL;

На:


$message .= 'Content-Transfer-Encoding: base64' . PHP_EOL . PHP_EOL;
$message .= $this->html . PHP_EOL;

 

 

 3) Файл:


system/library/mail/smtp.php

Меняем:


$message .= 'Content-Transfer-Encoding: 8bit' . PHP_EOL . PHP_EOL;
$message .= $this->html . PHP_EOL;

На:


$message .= 'Content-Transfer-Encoding: base64' . PHP_EOL . PHP_EOL;
$message .= $this->html . PHP_EOL;

 

 

Модификатор:


<modification>
	<name>Fix ru line breaks in email html</name>
	<version>1.0</version>
	<code>fix_ru_base64</code>
	
	<file path="system/library/mail.php">
		<operation>
			<search><![CDATA[$this->html = $html;]]></search>
			<add position="replace"><![CDATA[$this->html = chunk_split(base64_encode($html));]]></add>
		</operation>
	</file>
	
	<file path="system/library/mail/mail.php">
		<operation>
			<search index="2"><![CDATA[$message .= 'Content-Transfer-Encoding: 8bit' . PHP_EOL . PHP_EOL;]]></search>
			<add position="replace"><![CDATA[$message .= 'Content-Transfer-Encoding: base64' . PHP_EOL . PHP_EOL;]]></add>
		</operation>
	</file>
	
	<file path="system/library/mail/smtp.php">
		<operation>
			<search index="2"><![CDATA[$message .= 'Content-Transfer-Encoding: 8bit' . PHP_EOL . PHP_EOL;]]></search>
			<add position="replace"><![CDATA[$message .= 'Content-Transfer-Encoding: base64' . PHP_EOL . PHP_EOL;]]></add>
		</operation>
	</file>
	
</modification>

 

fix-ru-line-breaks-in-email-html.ocmod.zip 481 \u0411 · 3 downloads

 

Спасибо! Версия ocStore 3.0.3.7 - всё помогло!

Тоже пропадали буквы или появлялись в середине слова символы ?%? в форме письма покупателю и администратору.

 

Надіслати
Поділитися на інших сайтах


  • 4 weeks later...
В 22.09.2021 в 18:02, reforket сказал:

Тоже столкнулся с пропаданием символов в письмах. Происходит из-за неправильного переноса.

Фикс для OC 3.0.3.7

 

1) Файл:


system/library/mail.php

Меняем:


public function setHtml($html) {
	$this->html = $html;
}

На:


public function setHtml($html) {
	$this->html = chunk_split(base64_encode($html));
}

 

 

 2) Файл:


system/library/mail/mail.php

Меняем:


$message .= 'Content-Transfer-Encoding: 8bit' . PHP_EOL . PHP_EOL;
$message .= $this->html . PHP_EOL;

На:


$message .= 'Content-Transfer-Encoding: base64' . PHP_EOL . PHP_EOL;
$message .= $this->html . PHP_EOL;

 

 

 3) Файл:


system/library/mail/smtp.php

Меняем:


$message .= 'Content-Transfer-Encoding: 8bit' . PHP_EOL . PHP_EOL;
$message .= $this->html . PHP_EOL;

На:


$message .= 'Content-Transfer-Encoding: base64' . PHP_EOL . PHP_EOL;
$message .= $this->html . PHP_EOL;

 

 

Модификатор:


<modification>
	<name>Fix ru line breaks in email html</name>
	<version>1.0</version>
	<code>fix_ru_base64</code>
	
	<file path="system/library/mail.php">
		<operation>
			<search><![CDATA[$this->html = $html;]]></search>
			<add position="replace"><![CDATA[$this->html = chunk_split(base64_encode($html));]]></add>
		</operation>
	</file>
	
	<file path="system/library/mail/mail.php">
		<operation>
			<search index="2"><![CDATA[$message .= 'Content-Transfer-Encoding: 8bit' . PHP_EOL . PHP_EOL;]]></search>
			<add position="replace"><![CDATA[$message .= 'Content-Transfer-Encoding: base64' . PHP_EOL . PHP_EOL;]]></add>
		</operation>
	</file>
	
	<file path="system/library/mail/smtp.php">
		<operation>
			<search index="2"><![CDATA[$message .= 'Content-Transfer-Encoding: 8bit' . PHP_EOL . PHP_EOL;]]></search>
			<add position="replace"><![CDATA[$message .= 'Content-Transfer-Encoding: base64' . PHP_EOL . PHP_EOL;]]></add>
		</operation>
	</file>
	
</modification>

 

fix-ru-line-breaks-in-email-html.ocmod.zip 481 \u0411 · 8 downloads

 

Немного доработал Ваш модификатор.
Для текстовых писем тоже добавил base64.
 

fix-ru-line-breaks-in-email-html.ocmod.zip

  • +1 1
Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.