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



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

#1 fedornabilkin
fedornabilkin
  • Модератор
  • 1 188 сообщений
  • Репутация: 206
2

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

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

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

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

kiss_82kb.1476860924.png

 

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

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

 

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


 

 

  • 0

Надо обсудить предложение. А тут знакосчиталка считает знаки. Про Yii2 написано.



#2 ShowPrint
ShowPrint
  • Пользователь PRO
  • 3 406 сообщений
  • Репутация: 1001

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

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

 

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


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


#3 miketomlin
miketomlin
  • Пользователь
  • 573 сообщений
  • Репутация: 119

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

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

base64_encode

chunk_split

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


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


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


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


  • 1


#4 miketomlin
miketomlin
  • Пользователь
  • 573 сообщений
  • Репутация: 119

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

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


Вот:

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

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


  • 0


#5 ShowPrint
ShowPrint
  • Пользователь PRO
  • 3 406 сообщений
  • Репутация: 1001

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

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

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

 

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


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


#6 miketomlin
miketomlin
  • Пользователь
  • 573 сообщений
  • Репутация: 119

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

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


  • 1


#7 miketomlin
miketomlin
  • Пользователь
  • 573 сообщений
  • Репутация: 119

Отправлено 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
  • 3 175 сообщений
  • Репутация: 849

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

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


  • 0


#9 miketomlin
miketomlin
  • Пользователь
  • 573 сообщений
  • Репутация: 119

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

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


  • 0


#10 Ixman
Ixman
  • Пользователь PRO
  • 3 175 сообщений
  • Репутация: 849

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

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

 

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


  • 0


#11 miketomlin
miketomlin
  • Пользователь
  • 573 сообщений
  • Репутация: 119

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

Неправильно использовали или сервер нормально не настроили. Я сторонними либами не пользуюсь. Возможно, там можно указать, какой метод отправки использовать. Но скорее всего вы через сетевой интерфейс обращались к ящику на том же сервере. Смысл сего действа весьма сомнительный. Разве что действительно из-за ограничений либы или неправильной настройки сервера для прямой отправки.


Или чисто потестить.


  • 0


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


Похожие темы
  Название темы Автор Статистика Последнее сообщение

Пользователь месяца
BLIK BLIK 1-й за Июль
Очков активности: 81 0 тем, 27 сообщений, 2 балла репутации
ТОП самых активных за этот месяц
  • Фотография Megoydagi
    #1

    Megoydagi (24ho.ru)
    Очков активности: 10.5 1 тема, 4 сообщения, 1 балл репутации

  • Фотография heisenberg
    #2

    heisenberg
    Очков активности: 10.5 1 тема, 4 сообщения, 1 балл репутации

  • Фотография sws
    #3

    sws
    Очков активности: 6 0 тем, 4 сообщения, 1 балл репутации

  • Фотография Totti
    #4

    Totti
    Очков активности: 6 0 тем, 4 сообщения, 1 балл репутации

  • Фотография kartuzzz
    #5

    kartuzzz
    Очков активности: 6 1 тема, 1 сообщение, 1 балл репутации

  • Фотография Chaser
    #6

    Chaser (majento.ru)
    Очков активности: 4.5 1 тема, 0 сообщений, 1 балл репутации

  • Фотография kuprum
    #7

    kuprum
    Очков активности: 4.5 1 тема, 0 сообщений, 1 балл репутации

  • Фотография Cpatoday
    #8

    Cpatoday
    Очков активности: 4.5 1 тема, 0 сообщений, 1 балл репутации

  • Фотография 2kwkw
    #9

    2kwkw
    Очков активности: 4.5 1 тема, 0 сообщений, 1 балл репутации

  • Фотография zyzy
    #10

    zyzy
    Очков активности: 3 0 тем, 2 сообщения, 1 балл репутации

  • Показать весь ТОП 10

Поддержите форум! =)
Топ 5 участников по репутации

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