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



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

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

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

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

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

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

kiss_82kb.1476860924.png

 

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

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

 

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


 

 

  • 0

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



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

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

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

 

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


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


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

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

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

base64_encode

chunk_split

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


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


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


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


  • 1


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

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

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


Вот:

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

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


  • 0


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

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

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

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

 

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


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


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

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

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


  • 1


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

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

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

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


  • 0


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

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

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


  • 0


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

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

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

 

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


  • 0


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

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

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


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


  • 0


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


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

Пользователь месяца
FIvYUr FIvYUr 1-й за Декабрь
Очков активности: 2 062 0 тем, 125 сообщений, 11 баллов репутации
Сайт: moy-evroopt.ru
ТОП самых активных за этот месяц
  • Фотография albedo
    #1

    albedo (online24news.ru)
    Очков активности: 630 5 тем, 69 сообщений, 5 баллов репутации

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

    Totti
    Очков активности: 174 2 темы, 23 сообщения, 4 балла репутации

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

    Bilish
    Очков активности: 147 20 тем, 38 сообщений, 1 балл репутации

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

    BLIK
    Очков активности: 51 Вне конкурса за определение пользователя месяца

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

    ShowPrint (ShowPrint.ru)
    Очков активности: 48 0 тем, 8 сообщений, 4 балла репутации

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

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

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

    Megoydagi (24ho.ru)
    Очков активности: 31.5 3 темы, 12 сообщений, 1 балл репутации

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

    NataliaAntalia (zdorovemedicina.ru)
    Очков активности: 28.5 Вне конкурса за определение пользователя месяца

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

    Santey
    Очков активности: 28.5 4 темы, 7 сообщений, 1 балл репутации

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

    MattCutts (dmitrylee.ru)
    Очков активности: 24 Вне конкурса за определение пользователя месяца

  • Показать весь ТОП 10
Поддержите форум! =)
Апдейты
  • Яндекс ИКС: 27.12.2019
  • Яндекс выдача: 17.01.2020
Топ 5 участников по репутации

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