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



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

#1

Поделиться сообщением #1



fedornabilkin

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

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

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

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

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

kiss_82kb.1476860924.png

 

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

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

 

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


 

 

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


robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85
Советую обратить внимание на следующее:
  1. Как сделать отправку почты если не работает mail()
  2. Заголовок From в функции mail()
  3. Вопрос по скрипту отправки писем
  4. Отправка формы на почту в php
  5. 2 письма в обратной связи на php

#2

Поделиться сообщением #2



ShowPrint

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

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

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

 

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


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


#3

Поделиться сообщением #3



miketomlin

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

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

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

base64_encode

chunk_split

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


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


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


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


  • 1

#4

Поделиться сообщением #4



miketomlin

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

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

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


Вот:

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

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


  • 0

#5

Поделиться сообщением #5



ShowPrint

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

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

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

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

 

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


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


#6

Поделиться сообщением #6



miketomlin

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

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

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


  • 1

#7

Поделиться сообщением #7



miketomlin

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

Отправлено 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

Поделиться сообщением #8



Ixman

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

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

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


  • 0


#9

Поделиться сообщением #9



miketomlin

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

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

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


  • 0

#10

Поделиться сообщением #10



Ixman

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

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

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

 

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


  • 0


robot

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


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