Перейти к содержимому

Сервис обмена электронных валют


Отправка писем php

#1 fedornabilkin

fedornabilkin
  • Пользователь
  • 696 сообщений
  • Репутация: 91
2

Отправлено 19 Октябрь 2016 - 10:25

Здравствуйте. Самый мой больной вопрос. Почта вроде кое-ка отправляется, но надо отправлять как положено.

Проблема в том, что почтовики вставляют пробел или ! в тело письма в любом месте, а при кодировке utf-8 получается разрыв символа и в тексте письма встречается кракозябринка. Погуглил, предлагают вставлять переносы строк в разных местах в теле письма, если оно большое. Сделал вставку после каждого тега <td>, но так и не понял, помогло или нет. Иногда есть кракозябринки, а иногда их нету. Пока не нашел от чего это зависит.

Дальше решил посмотреть исходники писем от разных крупных проектов в том числе и от Яндекса. Увидел вот такую картину.

kiss_82kb.1476860924.png

 

Если с заголовками еще можно разобраться, то как закодировать тело письма я не понял. Вычитал на просторах, что при base64 необходимо разбивать на строки по 76 символов и в конце высчитывать по байтам размер. Если не хватает одного, то добавлять =, а если не хватает двух, то == или ничего не добавлять, если байт хватает.

Посмотрел библиотеку libmail, но там кодирование происходит только при вложении файлов. При этом тело письма не кодируется.

 

Подскажите как сделать отправку писем в base64 с кодированием всего тела письма. Давайте разберемся с этим раз и навсегда.


 

 

  • 0
Как часто в горестной разлуке,В моей блуждающей судьбе, ФО, я думал о тебе.


#2 ShowPrint

ShowPrint
  • Пользователь PRO
  • 1 700 сообщений
  • Репутация: 405

Отправлено 19 Октябрь 2016 - 11:11

@fedornabilkin, та же фигня, я пока оставил как есть. Раз ты сам не победил, то куда уж мне =)

 

Есть повод последить за темой  :rolleyes:


  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#3 miketomlin

miketomlin
  • Пользователь
  • 261 сообщений
  • Репутация: 35

Отправлено 19 Октябрь 2016 - 11:28

Текстовое содержимое кодировать не обязательно. Хотя основная используемая мной библиотечная ф-ция это делает, если не ошибаюсь (эту либу писал не я, а моя подруга). Почитайте описание след. ф-ций:

base64_encode

chunk_split

Там все просто. У последней ф-ции есть параметр, позволяющий указать длину строки и по умолчанию равный как раз 76, хотя его все равно часто приходится указывать явно, чтобы явно определить следующий за ним параметр «разрыв строки» (спеки требуют значения "\r\n", но используемый линуксовый софт может внести свои коррективы).


Т.е. иногда приходится писать просто "\n", если настроена подмена.


Кстати, текст часто еще кодируется в quoted-printable-кодировке.


В php для этого тоже есть ф-ция.


  • 1

#4 miketomlin

miketomlin
  • Пользователь
  • 261 сообщений
  • Репутация: 35

Отправлено 19 Октябрь 2016 - 11:50

Странно, что на скрине тема письма не закодирована. Это косяк отправителя. Там в самом коде указывается кодировка и способ кодирования. B – означает base64.


Вот:

$subject='=?UTF-8?B?'.base64_encode('Привет!').'?=';

При условии, что исходник в UTF-8 представлен.


  • 0

#5 ShowPrint

ShowPrint
  • Пользователь PRO
  • 1 700 сообщений
  • Репутация: 405

Отправлено 19 Октябрь 2016 - 13:06

base64_encode chunk_split
@miketomlin, у себя я эти функции использую для кодировки файлов (подсмотрел где-то на просторах):
chunk_split(base64_encode($_File))

Правильно я понимаю что и текст может аналогично кодироваться?

 

@fedornabilkin, если будешь пробовать - сообщи о результатах, плз...


  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#6 miketomlin

miketomlin
  • Пользователь
  • 261 сообщений
  • Репутация: 35

Отправлено 19 Октябрь 2016 - 13:22

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


  • 1

#7 miketomlin

miketomlin
  • Пользователь
  • 261 сообщений
  • Репутация: 35

Отправлено 19 Октябрь 2016 - 13:45

Вы можете даже тот же самый Content-Type: multipart/mixed использовать с единственным закодированным фрагментом с текстом сообщения. Фрагмент снабжаете теми же заголовками, только Content-Disposition тут без надобности, а в Content-Type пишете просто кодировку и тип представления. Т.е. к примеру если для файла было:

Content-Transfer-Encoding: base64
Content-Type: application/zip; name="archive.zip"
Content-Disposition: attachment; filename="archive.zip"

то к примеру для текста может быть:

Content-Transfer-Encoding: base64
Content-Type: text/html; charset=utf-8

  • 0

#8 Ixman

Ixman
  • Пользователь PRO
  • 2 159 сообщений
  • Репутация: 432

Отправлено 19 Октябрь 2016 - 16:05

Что-то я ни разу с такой проблемой не сталкивался, хотя с отправкой писем работаю очень часто. Но я использую PHPmailer, может в нём изначально всё как надо реализовано. Не вникал в принципы его работы.


  • 0

#9 miketomlin

miketomlin
  • Пользователь
  • 261 сообщений
  • Репутация: 35

Отправлено 19 Октябрь 2016 - 18:01

Речь о более низком уровне работы с данными. Насколько я понимаю, мы говорим о формате данных, скармливаемых ф-ции вроде mail(). А вы с вашей либой небось еще и совсем др. метод отправки писем используете – через промежуточный почтовый ящик, а не напрямую.


  • 0

#10 Ixman

Ixman
  • Пользователь PRO
  • 2 159 сообщений
  • Репутация: 432

Отправлено 19 Октябрь 2016 - 18:07

Это зависит от требований заказчика. Да в основном или через яндекс или через google почту. А так бывает и со своих серверов. Хотя я же говорю, я особо не смотрел как сама либа отсылает письма.

 

Ранее тоже использовал mail(), были проблемы с доставкой. Поэтому решил её не использовать. 


  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru