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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почта и PHP . Часть 3, Заголовки 
V
    Опции темы
ArNic
Дата 15.5.2008, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Итак все классно но теперь появилась очередная проблема. Точнее прийти к решению ее я не могу
Целиком письмо выходит в таком виде:
Цитата

Return-path: <[email protected]>

Envelope-to: [email protected]

Delivery-date: Thu, 15 May 2008 10:33:22 +0400

Received: from [89.232.124.51] (helo=Albina)

    by mail.hoster.ru with esmtpa (Exim 4.69 (FreeBSD))

    (envelope-from <[email protected]>)

    id 1JwX1l-0009VB-M5

    for [email protected]; Thu, 15 May 2008 10:33:22 +0400

From: <[email protected]>

To: <[email protected]>

Subject: 014-012-02

Date: Thu, 15 May 2008 10:35:33 +0400

Message-ID: <000001c8b655$e11208b0$a3361a10$@ru>

MIME-Version: 1.0

Content-Type: text/plain;

    charset="koi8-r"

Content-Transfer-Encoding: base64

X-Mailer: Microsoft Office Outlook 12.0

Thread-Index: Aci2VdkPGLlwcyNKSfGNsEtwyNaq0w==

Content-Language: ru

x-cr-hashedpuzzle: ARfL BP9D B94S CYux DZcc DlN4 FBIu FKQ2 GO+E GwtX G6yx In24 LExG MAQM Mu5U Myra;1;dwBlAGIAXwBuAGUAdwBzAEAAYQBiAGEAZwBhAG4ALgByAHUA;Sosha1_v1;7;{2ED0BA43-F760-47F2-BE94-E2117D86BA1E};dwBlAGIAQABhAGIAYQBnAGEAbgAuAHIAdQA=;Thu, 15 May 2008 06:35:21 GMT;MAAxADQALQAwADEAMgAtADAAMgA=

x-cr-puzzleid: {2ED0BA43-F760-47F2-BE94-E2117D86BA1E}

X-ACL-Warn: Adress not find



8NLP18XSy8Eg08/Pwt3FzsnRPM7FyQ0K



.


И вот тут вопрос: как же гибко (если вдруг количество строк заголовков будет плавающим) отделить само сообщение и заголовки?
PM MAIL ICQ   Вверх
Feldmarschall
Дата 15.5.2008, 16:11 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



Слушай, а ты не можешь писать в одну и ту же тему?
А еще лучше - хоть что-нибудь почитать про формат почтовых писем, а не спрашивать про каждую запятую?
PM   Вверх
ArNic
Дата 15.5.2008, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Отходя от темы:
Заголовки писем и отделение их от содержимого - это одно.
Декодирование письма - это другое (между прочим я туда дописывать буду результаты деятельности своей)
А вот если говорить вообще о заборе письма это другая часть.
Я понимаю что много текста в одном топике это удобно. Но удобно для чего? Если при появлении того или иного решения сообщение будет писаться на подтему обсуждаемую в n сообщении, после которого обсуждено несколько подтем.
Тогда зачем же форум дробить на темы. Давайте сделаем одну страницу, выложим 5 тем со всеми сообщениями и пускай ищут (поиск ведь есть smile )
Я могу ошибаться это чисто субъективное мнение.
И если что-то я не понимаю или где-то ошибаюсь - может и другой  smile  головой об ту же стену биться. 
Я могу не спрашивать. Зачем же? Буду лупить эту тему сам 3 дня, а потом когда решение выложу, ты спросишь: "А зачем так, если проще можно."
Вот поэтому чтобы велосипед не изборетать а сделать просто другую модель я прошу помощи.

Добавлено через 2 минуты и 14 секунд
Возращаясь к теме:
Про формат почтовых писем я прочел здесь.
но если я правильно понял - строк в заголовке может быть n и поэтому начало содержимого письма я определить не смогу.

Добавлено через 4 минуты и 9 секунд
Как же это сделать универсально ума не приложу. И если обычно у меня в голове формируется модель поведения программы при обработке события то тут как в тумане
PM MAIL ICQ   Вверх
Feldmarschall
Дата 15.5.2008, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



Элементарно заголовки от тела отделяются. Пустой строкой.
Что в HTTP, что в почте.

Добавлено через 1 минуту и 43 секунды
еще можно вот здесь почитать http://phpfaq.ru/mail
PM   Вверх
ArNic
Дата 15.5.2008, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Заранее спасибо, результат сообщу, как реализую код.
PM MAIL ICQ   Вверх
ArNic
Дата 15.5.2008, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо конечно я сказал, а теперь думаю, или я дурак... или одно из двух smile
Понятно что не пробелом отделяется, но как заметили пользователи данного форума, а также достопочтимый Фельдмаршал ;) почему-то каждый заголовок отделяется друг от друга пустой строкой. Почему? Сам понят не могу.

Добавлено через 6 минут и 34 секунды
Тут конечно есть два решения (которые у меня сформированы в голове)
1. при формировании кода держать в действии 3 переменные например $str1 $str2 $str3 которые будут содержать 3 строки подряд и если они будут все равны "" так можно будет отделить содержание от заголовков.
2. После того, как все внутренности письма будут загружены в переменную, нужно будет найти три подряд пустых строки. В идеале представив их разделителем массива.

Все это занимает системные ресурсы.

Кое кто скажет : "Ха решил муравья сэкономить!" А вообще зачем тогда оптимизировать код? И упрощать его алгоритм.
PM MAIL ICQ   Вверх
Feldmarschall
Дата 15.5.2008, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



Это у тебя оно так выводится.

PM   Вверх
ArNic
Дата 15.5.2008, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Поэтому если не трудно помогите найти наиболее простое решение (с точки зрения написания и обработки)

Добавлено через 3 минуты и 28 секунд
У меня smile Так выводится я согласен. Не  отрицаю. Но почему тогда у меня выводится так? Я ведь просто перебираю строки и добавляю их к строке $FullStr .= fgets($conn);
PM MAIL ICQ   Вверх
Feldmarschall
Дата 15.5.2008, 19:36 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



Ты не представляешь, сколько здесь - в этом форуме - топиков, у которых вначале "я ведь просто перебираю", а заканчивающихся фразой "ой, я просмотрел, у меня там не то".
кроме выборки и добавления есть вывод. 
PM   Вверх
ArNic
Дата 15.5.2008, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



??? не совсем понял поясни пожалуйста балбесу, что до меня не дошло ???  smile 
PM MAIL ICQ   Вверх
Feldmarschall
Дата 15.5.2008, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



убедись, что линие переводы строки не при выводе появляются.
и вообще разберись, откуда они у тебя берутся
PM   Вверх
ArNic
Дата 16.5.2008, 07:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ок, как разберусь - сообщу о результате.
PM MAIL ICQ   Вверх
ArNic
Дата 16.5.2008, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



На разобрался откуда они появлялись, потому что пропали они. Скорее всего массовая миграция на юг ;)

А вот в общем результат того, что я сделал.

Код

<?php
$N = $_GET['N']; // В данном случае номер письма задается через переменную GET
if (!$N){$N = 3;} // а вдруг не задано

$connection = fsockopen("mail.domen.ru",110,$errno, $errstr, 10); //Соединяемся
if($connection) {
    fgets($connection,1024); //смотрим результат соединения
    fputs($connection,"USER [email protected]\r\n"); //Вводим логин
    fgets($connection,1024); 
    fputs($connection,"PASS password\r\n"); //Вводим пароль
    fgets($connection,1024);
//формируем список писем
    fputs($connection,"LIST\r\n");
    $FullMsg = "";
    while (!feof($connection)) //пробегаем весь поток
    {
        $StrMsg = fgets($connection);
        $FullMsg .= $StrMsg."<br>";
        if(trim($StrMsg) == ".") {break;}//пока не дойдем до точки
    } ;
    print $FullMsg."<hr>";//покажем весь результат и разделительную линию
//закончили выводить список писем
//Начало обработки письма и разделения по заголовкам
    $FullMsg = ""; //Опустошим переменную $FullMsg
    fputs($connection,"RETR $N\r\n");//Запросим нужное нам письмо по порядковому номеру
    $MsgI = 0; //т.к. я буду делить на части письмо, введу этот индекс и навсякий случай задам ему значение 0
    while (!feof($connection)) //Работаем пока есть поток
    {
        $StrMsg = fgets($connection); //$Str для нас будет вре'менной переменной, в котрую мы будем каждый раз заносить следующую в потоке строку, заменяя предыдущую
        if(trim($StrMsg) == ".") {break;} //Ну если вдруг конец письма наступит тогда он кончается строкой с точкой. А значит нам нечего тут будет делать.
        if (trim($StrMsg) == ""){ //Если пустая строка переходим к следующей части письма (в данном случае прибавляем 1 к индексу, который будем использовать в массиве.
            $MsgI += 1;
        }
        if ($MsgI == "1") { //если это чать с индексом 1 значит это текст письма.
            $FullMsg[$MsgI] .= $StrMsg; //Тогда массив с индексом 1 будет содержать текст письма.
        } else { // а иначе это заголовок. Займемся работой с заголовками
            $ArrStrMsg = split(":",$StrMsg); //преобразуем строку с разделителем ":" в массив $ArrStrMsg
            if (count($ArrStrMsg) == 2){ //Если массив разделился ровно на 2 части...
                $FullMsg[$MsgI][($ArrStrMsg[0])] = $ArrStrMsg[1];//Загоняем в многомерный массив содержание параметра заголовка, в котором воторой индекс будет названием параметра.
                $BackUpArrStrMsg = $ArrStrMsg; //Делаем откат массива - он нам пригодится для добавления данных, если следующая строка не будет с заголовком параметра
            } else { //если строка разделился не на 2 части а на 1 или больше 2-х, тогда...
                $FullMsg[$MsgI][($BackUpArrStrMsg[0])] .= $StrMsg; //... добавляем к последнему введенному параметру
            }
        }
    } ;
//Конец обработки письма и разбора заголовков
//Начало работы с содержанием письма
    if (trim($FullMsg[0]['Content-Transfer-Encoding']) == 'base64'){//проверяем параметр заголовка "Content-Transfer-Encoding" и если он равен base64
        $FullMsg[1] = base64_decode($FullMsg[1]);        //декодируем по base64
    } elseif (trim($FullMsg[0]['Content-Transfer-Encoding']) == 'quoted-printable'){ //но если вдруг quoted-printable
        $FullMsg[1] = quoted_printable_decode($FullMsg[1]); //декодируем по quoted-printable
    } //другого не дано
    $ConTySpl = split(";",trim($FullMsg[0]['Content-Type'])); //Content-Type в котором заданы 2 подпараметра разделяем на массив
    if (trim($ConTySpl[1]) == "charset=\"koi8-r\""){ //если второй подпараметр исключив пробелы (функция trim) будет равна koi8-r
        $FullMsg[1] = convert_cyr_string($FullMsg[1],"k","w"); //тогда конвертируем
    }
//    print_r ($FullMsg[0]); //Эта строка чтобы псмотреть значения заголовков. Его я закоментировал.
    print ($FullMsg[1]); //выводим обработанное содержание письма
    fputs($connection,"QUIT\r\n"); //отключаемся от pop сервера
    fclose($connection); //закрываем соединение
//Конец работы с содержанием
}
else {echo "Не получилось подключиться!";}; //без коментариев.
?>


Прошу ругать скрипт (я к критике нормально отношусь), но и не забывать после критики выносить свои предложения по замечаниям. 
PM MAIL ICQ   Вверх
Pokoinik
Дата 16.5.2008, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 17.3.2007
Где: /dev/null

Репутация: 2
Всего: 3



Есть вот такой замечательный класс,
возможно будет полезен

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  phpMailer.txt 45,58 Kb


--------------------
ICQ: 490-993
Существует только 10 типов людей: те, которые понимают двоичную систему, и которые ее не понимают!!!
Опасайтесь людей верующих, ибо у них есть боги, которые им все прощают.

Делай или не делай! Никаких попробую!
Йода (Yoda), мастер-джедай
PM MAIL ICQ   Вверх
ArNic
Дата 16.5.2008, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо большое, посмотрел но че-то не разобрался. Старательно разбираюсь.
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0557 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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