![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| InfMag |
|
|||
|
… ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1037 Регистрация: 21.11.2004 Репутация: 1 Всего: 4 |
Я всяко пытался разобраться как это сделать из примеров, но все не то, пытался порыться в поиске, ничего не нашел, может конечно плохо ищу, но ничего намекающего на то что мне нужно.
Я отправляю всяко письма, с заголовками разными и т.п. Но никак не могу понять как отправить несколько файлов с письмом... |
|||
|
||||
| GeneralElectric |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 797 Регистрация: 11.1.2008 Репутация: 13 Всего: 16 |
несколько файлов отправляются точно так же, как и один.
поэтому в поиске ищи, как отправить файл с одним вложением. |
|||
|
||||
| flashaa |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 19 Всего: 25 |
Ну во-первых необходимо знать протокол Mime. Хотя, эту задачу можно отнести к задачам типа "посмотрел код, воткнул у себя, забыл", так что особо настаивать не буду.
Суть писем с вложениями заключается в том, что в основном заголовке письма указывается Content-Type: multipart/mixed. В том же заголовке указывается разделитель (boundary) различных частей письма - текстовой части, файлов-вложений. Теперь письмо строится таким образом, что идет разделитель с двумя дефисами впереди(boundary), за ним после переноса строки идут заголовки, относящиеся к этой части письма. Если после одного из заголовков идут уже 2 переноса строки, то тогда следующая часть текста будет расценена не как служебная а как текст данного раздела письма. Будет считано все содержимое, до того как встретиться разделитель с двумя дефисами вначале. И так для всех частей письма, кроме последней. У нее 2 дефиса также написано после разделителя.
Можно реализовать эту идею вручную, можно воспользоваться готовыми решениями, например PEAR::Mail_Mime |
|||
|
||||
| InfMag |
|
|||
|
… ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1037 Регистрация: 21.11.2004 Репутация: 1 Всего: 4 |
flashaa, Не понял одного, куда пихать контент файла?
Добавлено через 1 минуту и 31 секунду И еще получается текстовую часть при функции mail() тоже пихать в заголовки:
|
|||
|
||||
| flashaa |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 19 Всего: 25 |
Контент файла здесь "c29tZXRoaW5n", только сделано преобразование base64_encode() от него. Т.е. вы можете взять base64_encode(file_get_contents('file.txt')); и впихнуть после заголовков данного вложения, но перед вторым разделителем. Если контент получается очень большой, то файл необходимо разбить переносами строк. Так, чтобы на одной строке было определенное число символов, например, по умолчанию используется 998.
Совершенно верно, она и не была расчитана на письма с вложениями. Но надо различать заголовки письма и заголовки каждого его фрагмента - это вещи друг с другом не связанные. Заголовки каждой части письма - это для большинства инструментов по работе с емейл - просто текст в теле письма. А вот заголовки в самом начале обычно обособляются. Ещё стоит увидеть закономерность - в заголовках письма в Content-Type: указан boundary, который будет использован в теле письма для разделей фрагментов письма. Это сообщение отредактировал(а) flashaa - 4.3.2008, 12:58 |
||||
|
|||||
| InfMag |
|
|||
|
… ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1037 Регистрация: 21.11.2004 Репутация: 1 Всего: 4 |
flashaa, стоп, я чего-то недопонял. Строка сама себя разбивать будет на 998 символов в полоску или нужно ручками это делать??
|
|||
|
||||
| flashaa |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 19 Всего: 25 |
Если говорить о структуре модуля для создания писем с вложениями,
то думаю он должен быть таким: 1) Сбор параметров письма(заголовков) 2) Сбор вложений 3) Построение результирующих заголовков и тела письма 4) Отправка полученного письма адресатам Например можно сделать класс, у которого будет внутренний член - массив вложений. Каждое вложение само по себе будет представлено массивом (имя файла, Content-Type файла). При добавлении аттачей через класс, массив вложений будет дополняться. На этапе построения письма будет проверка на пустоту массива вложений, затем (если вложения есть), генерация разделителя частей письма. Затем обход всего массива вложений и генерация текста по ним, того текста, который будет вставлен в тело письма. Затем будет подправлен массив заголовков письма (туда будет добавлен разделитель boundary). Дальше передаем полученные заголовки и тело письма например функции mail. Я бы мог написать это, но к сожалению, слишком объемно для написания за 10-30 мин, скорее всего где-то полдня. Добавлено @ 13:13
Это надо сделать руками. Я не уверен требуется ли это по спецификации, но всевозможные классы так делают. Это сообщение отредактировал(а) flashaa - 4.3.2008, 13:14 |
|||
|
||||
| GeneralElectric |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 797 Регистрация: 11.1.2008 Репутация: 13 Всего: 16 |
InfMag, оффтопик - со строкой, которая сама себя разбивает отжог нипадецки
flashaa, требуется. причем лучше не на 998, а на 76 |
|||
|
||||
| Dave |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 17.6.2004 Репутация: -1 Всего: 1 |
заюзай PEARовский класс для отсылки почты и не мучайся, там есть все что тебе может понадобится.
|
|||
|
||||
| InfMag |
|
|||
|
… ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1037 Регистрация: 21.11.2004 Репутация: 1 Всего: 4 |
flashaa, Большое спапасибо!
|
|||
|
||||
| flashaa |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 19 Всего: 25 |
По поводу разделения на строки, откопал в стандарте.
http://www.faqs.org/rfcs/rfc2045
Cказано, что в форматах 7bit, 8bit данные должны передаваться строками не более 998 байтов на строке (можно меньше). Разделителями строк является пара символов \r\n.
base64 перекодирует данные, как бы перенося их в семи-битное измерение, т.е. base64 - та же 7bit, только с дополнительным преобразованием. Это сообщение отредактировал(а) flashaa - 12.3.2008, 15:31 |
||||
|
|||||
| InfMag |
|
|||
|
… ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1037 Регистрация: 21.11.2004 Репутация: 1 Всего: 4 |
flashaa, а вот вопрос - если разбивать на строки - разбивать уже закодированую строку или еще целый текст а потом кодировать каждую строчку?
|
|||
|
||||
| Feldmarschall |
|
|||
|
Новичок ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2641 Регистрация: 11.12.2007 Репутация: 22 Всего: 32 |
InfMag, а если подумать немножко?
Ну просто, на один ход вперед? представить себе строку до кодирования и после кодирования. и вспомнить, по каким причинам мы обрезаем. |
|||
|
||||
| InfMag |
|
|||
|
… ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1037 Регистрация: 21.11.2004 Репутация: 1 Всего: 4 |
Всем спасибо, все работает.
Но как-то странно получилось, я проверял, строку не разбивал на 998 там символов и т.п. Закачал джпег в метр с копейками и все прошло нормально, файл нормально скачивался и т.п. |
|||
|
||||
| flashaa |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 19 Всего: 25 |
InfMag, возможно, т.к. rfc - это рекомендации, а не стандарты, но для уверенности, лучше их соблюдать.
|
|||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |