Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отправка E-Mail с несколькими вложениями 
V
    Опции темы
InfMag
Дата 4.3.2008, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


…
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 1
Всего: 4



Я всяко пытался разобраться как это сделать из примеров, но все не то, пытался порыться в поиске, ничего не нашел, может конечно плохо ищу, но ничего намекающего на то что мне нужно.

Я отправляю всяко письма, с заголовками разными и т.п. Но никак не могу понять как отправить несколько файлов с письмом...
PM   Вверх
GeneralElectric
Дата 4.3.2008, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



несколько файлов отправляются точно так же, как и один.
поэтому в поиске ищи, как отправить файл с одним вложением.
PM MAIL   Вверх
flashaa
Дата 4.3.2008, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 19
Всего: 25



Ну во-первых необходимо знать протокол Mime. Хотя, эту задачу можно отнести к задачам типа "посмотрел код, воткнул у себя, забыл", так что особо настаивать не буду.
Суть писем с вложениями заключается в том, что в основном заголовке письма указывается Content-Type: multipart/mixed. В том же заголовке указывается разделитель (boundary) различных частей письма - текстовой части, файлов-вложений.
Теперь письмо строится таким образом, что идет разделитель с двумя дефисами впереди(boundary), за ним после переноса строки идут заголовки, относящиеся к этой части письма. Если после одного из заголовков идут уже 2 переноса строки, то тогда следующая часть текста будет расценена не как служебная а как текст данного раздела письма.
Будет считано все содержимое, до того как встретиться разделитель с двумя дефисами вначале.
И так для всех частей письма, кроме последней. У нее 2 дефиса также написано после разделителя.

Код

MIME-Version: 1.0
Content-Type: multipart/mixed;
    boundary="=_ce20cc438c04ca9bcdcd236fe4d85228"
From: [email protected]
Reply-to: [email protected]
To: [email protected]

Date: 4 Mar 2008 11:40:32 Tue, 04 Mar 2008 11:40:32 +0300
Subject: =?cp1251?B?aGVsbG8=?=

--=_ce20cc438c04ca9bcdcd236fe4d85228
Content-Transfer-Encoding: 8bit
Content-Type: text/plain; charset="cp1251"

123

--=_ce20cc438c04ca9bcdcd236fe4d85228
Content-Transfer-Encoding: base64
Content-Type: application/octet-stream;
 name="my.txt"; 
Content-Disposition: attachment;
 filename="my.txt"; 

c29tZXRoaW5n
--=_ce20cc438c04ca9bcdcd236fe4d85228
Content-Transfer-Encoding: base64
Content-Type: application/octet-stream;
 name="my.txt"; 
Content-Disposition: attachment;
 filename="my.txt"; 

c29tZXRoaW5n
--=_ce20cc438c04ca9bcdcd236fe4d85228--



Можно реализовать эту идею вручную, можно воспользоваться готовыми решениями, например PEAR::Mail_Mime
PM MAIL   Вверх
InfMag
Дата 4.3.2008, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


…
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 1
Всего: 4



flashaa, Не понял одного, куда пихать контент файла?

Добавлено через 1 минуту и 31 секунду
И еще получается текстовую часть при функции mail() тоже пихать в заголовки:
Код

--=_ce20cc438c04ca9bcdcd236fe4d85228
Content-Transfer-Encoding: 8bit
Content-Type: text/plain; charset="cp1251"
123

PM   Вверх
flashaa
Дата 4.3.2008, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 19
Всего: 25



Цитата(InfMag @  4.3.2008,  12:16 Найти цитируемый пост)
куда пихать контент файла?

Код

--=_ce20cc438c04ca9bcdcd236fe4d85228
Content-Transfer-Encoding: base64
Content-Type: application/octet-stream;
 name="my.txt"; 
Content-Disposition: attachment;
 filename="my.txt"; 

c29tZXRoaW5n
--=_ce20cc438c04ca9bcdcd236fe4d85228

Контент файла здесь "c29tZXRoaW5n", только сделано преобразование base64_encode() от него.
Т.е. вы можете взять base64_encode(file_get_contents('file.txt')); и впихнуть после заголовков данного вложения, но перед вторым разделителем.
Если контент получается очень большой, то файл необходимо разбить переносами строк. Так, чтобы на одной строке было  определенное число символов, например, по умолчанию используется 998.
Цитата(InfMag @  4.3.2008,  12:16 Найти цитируемый пост)
И еще получается текстовую часть при функции mail() тоже пихать в заголовки:

Совершенно верно, она и не была расчитана на письма с вложениями. Но надо различать заголовки письма и заголовки каждого его фрагмента - это вещи друг с другом не связанные. Заголовки каждой части письма - это для большинства инструментов по работе с емейл - просто текст в теле письма. А вот заголовки в самом начале обычно обособляются.
Ещё стоит увидеть закономерность - в заголовках письма в Content-Type: указан boundary, который будет использован в теле письма для разделей фрагментов письма.

Это сообщение отредактировал(а) flashaa - 4.3.2008, 12:58
PM MAIL   Вверх
InfMag
Дата 4.3.2008, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


…
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 1
Всего: 4



flashaa, стоп, я чего-то недопонял. Строка сама себя разбивать будет на 998 символов в полоску или нужно ручками это делать??
PM   Вверх
flashaa
Дата 4.3.2008, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 19
Всего: 25



Если говорить о структуре модуля для создания писем с вложениями,
то думаю он должен быть таким:
1) Сбор параметров письма(заголовков)
2) Сбор вложений
3) Построение результирующих заголовков и тела письма
4) Отправка полученного письма адресатам

Например можно сделать класс, у которого будет внутренний член - массив вложений.
Каждое вложение само по себе будет представлено массивом (имя файла, Content-Type файла).
При добавлении аттачей через класс, массив вложений будет дополняться.
На этапе построения письма будет проверка на пустоту массива вложений,
затем (если вложения есть), генерация разделителя частей письма. Затем обход всего массива вложений и генерация
текста по ним, того текста, который будет вставлен в тело письма.
Затем будет подправлен массив заголовков письма (туда будет добавлен разделитель boundary).
Дальше передаем полученные заголовки и тело письма например функции mail.
Я бы мог написать это, но к сожалению, слишком объемно для написания за 10-30 мин, скорее всего где-то полдня.

Добавлено @ 13:13
Цитата(InfMag @  4.3.2008,  13:11 Найти цитируемый пост)
Строка сама себя разбивать будет на 998 символов в полоску или нужно ручками это делать?? 

Это надо сделать руками. Я не уверен требуется ли это по спецификации, но всевозможные классы так делают.

Это сообщение отредактировал(а) flashaa - 4.3.2008, 13:14
PM MAIL   Вверх
GeneralElectric
Дата 4.3.2008, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



InfMag, оффтопик - со строкой, которая сама себя разбивает отжог нипадецки       smile   smile 

flashaa, требуется. причем лучше не на 998, а на 76
PM MAIL   Вверх
Dave
Дата 4.3.2008, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 17.6.2004

Репутация: -1
Всего: 1



заюзай PEARовский класс для отсылки почты и не мучайся, там есть все что тебе может понадобится.
PM MAIL   Вверх
InfMag
Дата 5.3.2008, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


…
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 1
Всего: 4



flashaa, Большое спапасибо! smile +1
PM   Вверх
flashaa
Дата 12.3.2008, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 19
Всего: 25



По поводу разделения на строки, откопал в стандарте.
http://www.faqs.org/rfcs/rfc2045
Цитата

2.7.  7bit Data

   "7bit data" refers to data that is all represented as relatively
   short lines with 998 octets or less between CRLF line separation
   sequences [RFC-821].  No octets with decimal values greater than 127
   are allowed and neither are NULs (octets with decimal value 0).  CR
   (decimal value 13) and LF (decimal value 10) octets only occur as
   part of CRLF line separation sequences.

2.8.  8bit Data

   "8bit data" refers to data that is all represented as relatively
   short lines with 998 octets or less between CRLF line separation
   sequences [RFC-821]), but octets with decimal values greater than 127
   may be used.  As with "7bit data" CR and LF octets only occur as part
   of CRLF line separation sequences and no NULs are allowed.

2.9.  Binary Data

   "Binary data" refers to data where any sequence of octets whatsoever
   is allowed.

2.10.  Lines

   "Lines" are defined as sequences of octets separated by a CRLF
   sequences.  This is consistent with both RFC 821 and RFC 822.
   "Lines" only refers to a unit of data in a message, which may or may
   not correspond to something that is actually displayed by a user
   agent.

Cказано, что в форматах 7bit, 8bit данные должны передаваться строками не более 998 байтов на строке (можно меньше).
Разделителями строк является пара символов \r\n.
   
Цитата

The quoted-printable and base64 encodings transform their input from
   an arbitrary domain into material in the "7bit" range, thus making it
   safe to carry over restricted transports.  The specific definition of
   the transformations are given below.

base64 перекодирует данные, как бы перенося их в семи-битное измерение, т.е. base64  - та же 7bit, только с дополнительным преобразованием.

Это сообщение отредактировал(а) flashaa - 12.3.2008, 15:31
PM MAIL   Вверх
InfMag
Дата 21.3.2008, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


…
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 1
Всего: 4



flashaa, а вот вопрос - если разбивать на строки - разбивать уже закодированую строку или еще целый текст а потом кодировать каждую строчку?
PM   Вверх
Feldmarschall
Дата 21.3.2008, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 22
Всего: 32



InfMag, а если подумать немножко?
Ну просто, на один ход вперед? представить себе строку до кодирования и после кодирования. и вспомнить, по каким причинам мы обрезаем.
PM   Вверх
InfMag
Дата 3.4.2008, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


…
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 1
Всего: 4



Всем спасибо, все работает.

Но как-то странно получилось, я проверял, строку не разбивал на 998 там символов и т.п. Закачал джпег в метр с копейками и все прошло нормально, файл нормально скачивался и т.п.
PM   Вверх
flashaa
Дата 3.4.2008, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 19
Всего: 25



InfMag, возможно,  т.к. rfc - это рекомендации, а не стандарты, но для уверенности, лучше их соблюдать.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0618 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.