Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP, работа с почтой (прием/отправка) / 25 сообщений из 26, страница 1 из 2
08.03.2015, 10:33
    #38898240
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, работа с почтой (прием/отправка)
Мне нужно из скрипта наладить работу с электронной почтой.
Используется GMail, поэтому обычный mail не подойдет, нужна полноценная работа с TLS.
Насколько я понял, для этого обычно используют PHPMailer.
Это оптимальный вариант или есть способы лучше?

Ну и еще хотел бы уточнить, как это обычно делается.
Подозреваю, что делать прием или отправку почты прямо из скрипта страницы будет неправильно.
Видимо в скрипте страницы нужно помещать сообщение в очередь, а очередь будет обрабатывать другой скрипт, запускаемый планировщиком.
Как обычно такое делают?
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
08.03.2015, 10:54
    #38898246
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, работа с почтой (прием/отправка)
Alibek B.Мне нужно из скрипта наладить работу с электронной почтой.Что именно хотите реализовать?


Alibek B.обычный mail не подойдет, нужна полноценная работа с TLS.Функция mail() умеет только отправлять письма. Точнее, передавать письма для отправки локальному MTA. А дальше уже забота по доставке ложится на локального почтового агента. Конечно, если сервер никсовый.


Alibek B.Подозреваю, что делать прием или отправку почты прямо из скрипта страницы будет неправильно.По приёму, скорее всего, так и есть. Длительный это процесс. Отправку же десятка писем через mail() вполне можно делать из скрипта страницы.


Alibek B.Видимо в скрипте страницы нужно помещать сообщение в очередь, а очередь будет обрабатывать другой скрипт, запускаемый планировщиком.Для больших объёмов отправки так и делают обычно. Следует заметить, что хостеры нередко ограничивают количество отправляемых писем в единицу времени, например, не более 120 писем в час.
...
Рейтинг: 0 / 0
08.03.2015, 12:45
    #38898298
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, работа с почтой (прием/отправка)
Нужно проверять входящую почту и при получении определенного содержания от определенного отправителя обработать полученные данные (принять файл, обработать, загрузить в БД). Почта проверяется периодически или по запросу.
В некоторых случаях (по результатам обработки или по запросу) нужно отправить результаты обработки на определенный адрес. Размер ответа небольшой (пара килобайт).
Хостинг мой собственный, ОС Debian Linux.
...
Рейтинг: 0 / 0
08.03.2015, 13:29
    #38898343
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, работа с почтой (прием/отправка)
Alibek B., попробуйте посмотреть в сторону IMAP и Mailparse http://php.net/manual/ru/refs.remote.mail.php
...
Рейтинг: 0 / 0
08.03.2015, 14:27
    #38898388
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, работа с почтой (прием/отправка)
Спасибо, почитаю.
...
Рейтинг: 0 / 0
25.03.2015, 21:50
    #38917038
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, работа с почтой (прием/отправка)
Подскажите по imap-функциям.
А то я что-то запутался.

Подключаюсь (imap_open), получаю список сообщений (imap_fetch_overview).
Теперь мне нужно получить различную информацию по каждому элементу этого списка.
Для этого я с помощью imap_fetchheader получаю содержимое заголовков, разбиваю их по заголовкам, применяю к значениям imap_mime_header_decode и получаю заголовок письма в виде читаемого текста. Но это именно текст, из которого нужно извлечь данные в соответствии с несколькими RFC, а я бы не хотел это все изучать.
Еще есть функция imap_headerinfo, которая получает информацию из письма в структурированном виде. Но у нее не ладится с кодировками, во всяком случае кириллица не читается. А применять imap_mime_header_decode к данным в imap_headerinfo уже бесполезно, кодировка уже изменена.
Можно ли получить информацию из письма в структурированном виде и преобразованной в читаемый вид?
...
Рейтинг: 0 / 0
25.03.2015, 22:07
    #38917048
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, работа с почтой (прием/отправка)
Поясню.
Есть письмо, в кодировке UTF-8.
imap_fetchheader возвращает следующий текст:
Код: plaintext
Subject: =?UTF-8?B?0KLQtdGB0YIx?=
Это именно то, что в письме на самом деле, imap_fetchheader возвращает заголовки без каких-либо преобразований.
А вот imap_headerinfo осуществляет преобразования, вот ее результат:
Код: plaintext
[Subject] => =?KOI8-R?B?9MXT1DE=?=
Откуда тут взялся KOI8-R я не пойму, в исходном письме его нет.
И как с него получить нормальный текст я тоже пока не пойму.
...
Рейтинг: 0 / 0
25.03.2015, 22:42
    #38917070
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, работа с почтой (прием/отправка)
Alibek B.нужно извлечь данные в соответствии с несколькими RFC, а я бы не хотел это все изучатьА придётся. Хотя бы, по минимуму.


Alibek B.
Код: plaintext
Subject: =?UTF-8?B?0KLQtdGB0YIx?=

Alibek B.как с него получить нормальный текст
Здесь:
UTF-8 - кодировка текста
B - означает, что было использовано кодирование в base64
0KLQtdGB0YIx - собственно, текст в закодированном виде

Делите строку по вопросикам, декодируете base64_decode нужный фрагмент и получаете текст в указанной кодировке.
...
Рейтинг: 0 / 0
25.03.2015, 23:01
    #38917078
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, работа с почтой (прием/отправка)
С первой строкой у меня без проблем справляется imap_mime_header_decode.
У меня проблема с тем, как получить значение полей после imap_headerinfo.
После нее получается "?KOI8-R?B?9MXT1DE=?=" и из этой строки извлечь данные не получается.
...
Рейтинг: 0 / 0
25.03.2015, 23:40
    #38917097
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, работа с почтой (прием/отправка)
Вообщем слепил такого кадавра:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
        $hdr = imap_fetchheader($imap, $msg->msgno);
        preg_match_all('/([^: ]+): (.+?(?:\r\n\s(?:.+?))*)\r\n/m', $hdr, $hdr);
        $hdr = array_combine($hdr[1], $hdr[2]);
        $ret = "";
        foreach ($hdr as $field=>$value)
        {
                $value = imap_mime_header_decode($value);
                $hdr[$field] = array();
                foreach ($value as $item) $hdr[$field][] = $item->text;
                $hdr[$field] = implode('', $hdr[$field]);
                $ret .= $field . ": " . $hdr[$field] . "\r\n";
        }
        $hdr = imap_rfc822_parse_headers($ret);



Но хотелось бы знать, у меня не работает функция imap_headerinfo, которая по идее должна делать то же самое.
Вместо этого она невосстановимо портит кодировку, превращая "=?UTF-8?B?0KLQtdGB0YIx?=" в "?KOI8-R?B?9MXT1DE=?=".
Или это баг функции, или я неправильно ей пользуюсь.
...
Рейтинг: 0 / 0
26.03.2015, 07:26
    #38917202
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, работа с почтой (прием/отправка)
Alibek B.она невосстановимо портит кодировку, превращая "=?UTF-8?B?0KLQtdGB0YIx?=" в "?KOI8-R?B?9MXT1DE=?=".Где и что именно испорчено?

Код: php
1.
2.
$ php -r 'echo base64_decode("0KLQtdGB0YIx"), " ", iconv("koi8-r", "utf-8", base64_decode("9MXT1DE=")), "\n";'
Тест1 Тест1
...
Рейтинг: 0 / 0
26.03.2015, 09:15
    #38917292
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, работа с почтой (прием/отправка)
Спасибо, не сообразил к imap_headerinfo еще одно преобразование применить.
Но почему KOI8-R? В исходном письме его вообще нигде нет.
...
Рейтинг: 0 / 0
26.03.2015, 18:10
    #38918026
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, работа с почтой (прием/отправка)
Не подскажите с еще одним моментом?
Не могу понять, как извлечь из письма список прикрепленных файлов.
Нужно обработать письма, получить текст письма и прикрепленные файлы.
Использую такой код:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
$imap = imap_open...;
$status = imap_check($imap);
$list = imap_fetch_overview($imap, "1:{$status->Nmsgs}");
foreach ($list as $item)
{
        $mail = parseMessage($imap, $item);
        echo "Msg #$item->msgno, id $item->uid ($item->date) \n";
        echo "  from: " . $mail['from']['mailbox'] . "@" . $mail['from']['host'] . " to " . $mail['toaddress'] . "\n";
        echo "  subj: " . (empty($mail['subject']) ? '-none-' : '*' . $mail['subject'] . '*') . "\n";
        echo "  attachments: " . count($mail['attachments']) . "\n";
        foreach ($mail['attachments'] as $file)
        {
                echo "    [".$file['part']."] type ".$file['type'].", file ".$file['file'].", size ".$file['size']."\n";
        }
}
imap_close...;


Функция parseMessage извлекает заголовки из письма, тело письма и получает список прикрепленных файлов.
Этот код дает такой вывод:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
Msg #1, id 1018 (Tue, 24 Mar 2015 10:11:24 +0500 (YEKT)) 
  from: mail1@domain1.ru to mymail@domain.ru
  subj: *Registry 2015.03.23*
  attachments: 2
    [1.1] type 0, file , size 
    [2] type 0, file 2015-03-23.txt, size 510
Msg #2, id 1021 (Wed, 25 Mar 2015 04:26:25 +0500 (YEKT)) 
  from: mail1@domain1.ru to mymail@domain.ru
  subj: *Registry 2015.03.24*
  attachments: 2
    [1.1] type 0, file , size 
    [2] type 0, file 2015-03-24.txt, size 71
Msg #3, id 1022 (Wed, 25 Mar 2015 15:49:52 +0300) 
  from: mail2@domain2.ru to mymail@domain.ru
  subj: *Тест1*
  attachments: 4
    [1] type 0, file , size 364
    [2] type 0, file file.csv, size 60720
    [3] type 0, file book.csv, size 388
    [4] type 0, file template.csv, size 14186
Msg #4, id 1023 (Thu, 26 Mar 2015 10:43:24 +0300) 
  from: mail3@domain3.ru to mymail@domain.ru
  subj: -none-
  attachments: 3
    [1.1] type 0, file , size 299
    [1.2] type 0, file , size 2218
    [2] type 3, file 01SK0325.dbf, size 826

С письмами 1 и 2 все выглядит нормально, в них нет текстового тела письма, они содержат только прикрепленный файл.
К письму 3 прикреплены 3 файла. В нем 4 части, в первой тело письма, со второй по четвертую идут файлы. Но почему у них type=0?
И с письмом 4 мне тоже непонятно, почему у него такая структура. В письме HTML-текст с прикрепленной картинкой.
...
Рейтинг: 0 / 0
26.03.2015, 18:29
    #38918042
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, работа с почтой (прием/отправка)
Сейчас я использую такой алгоритм для извлечения данных:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
        $mail['attachments'] = array();
        $meta = imap_fetchstructure($imap, $uid, FT_UID);
        $parts = partList($meta->parts);
        foreach ($parts as $pn=>$part)
        {
                $pt = null;
                if ($part->ifdisposition == 1) $pt = $part->disposition;
                switch ($pt)
                {
                        case null:
                                if (in_array($part->type, array(0,2)))
                                {
                                        $mail['body'] = trim(strip_tags(partContent($imap, $uid, $pn, $part->encoding)));
                                }
                                break;
                        case 'ATTACHMENT':
                                if (in_array($part->type, array(0,3,4,5,6,7)))
                                {
                                        $filename = partFilename($part);
                                        $mail['attachments'][] = array('file'=>$filename, 'part'=>$pn, 'type'=>$part->type, 'size'=>(property_exists($part, 'bytes') ? $part->bytes : null));
                                }
                                break;
                }
        }


Пока что на моих письмах он сработал нормально.
Но может я еще какой нюанс не учел?
...
Рейтинг: 0 / 0
27.03.2015, 09:29
    #38918433
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, работа с почтой (прием/отправка)
Подскажите с еще одним вопросом.
Допустим письмо я принял, обработал, пометил для удаления, выполнил expunge.
Из входящих письмо удалилось, но в архиве осталось (на ящике GMail) и к этому письму я могу повторно обратиться с помощью uid.
Это особенность именно GMail? Или особенность IMAP и на такое поведение я могу рассчитывать на любом сервере?
...
Рейтинг: 0 / 0
27.03.2015, 11:14
    #38918646
keinW
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, работа с почтой (прием/отправка)
Фишка Gmail. Насколько я понимаю, это связано с организацией работы с "папками", которые в gmail заменены ярлыками. Описание imap_delete на php.net, а точнее коментарии содержат информацию по этому поводу. Ссылка .

Сам комментарий по теме:
This function seems not to work on "[Gmail]/All Mail" mailbox. This is because Gmails keeps only one copy of the message and mailboxes are no more than labels.
Deleting a message from a mailbox only removes that label (except for "All Mail" mailbox).
To delete from "All Mail" you have to use imap_mail_move() function and move the message to "[Gmail]/Trash" mailbox.

Note: Names of mailboxes in Gmail depends on the language you're using. E.g.: in Spanish "All Mail" is "Todos" and "Trash" is "Papelera".
...
Рейтинг: 0 / 0
28.03.2015, 13:04
    #38919777
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, работа с почтой (прием/отправка)
Никак не пойму, можно ли с помощью протокола IMAP отправить почту? Или для отправки нужно использовать SMTP?
Соответствующие функции (imap_mail или imap_append) вроде бы есть, но мне ни разу не удалось отправить сообщение.
...
Рейтинг: 0 / 0
28.03.2015, 13:57
    #38919802
kunaksergey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, работа с почтой (прием/отправка)
Alibek B.,
IMAP -это такой же клиентский протокол как и POP3. При POP3 сообщение закачивается на клиента,при IMAP4 закачиваются заголовки, а сообщение хранится на сервере. Отправкой сообщений занимается только SMTP сервер. С помощью IMAP вы можете отправить сообщение только на ваш SMTP сервер, который и будет заниматься отправкой почты дальше.
...
Рейтинг: 0 / 0
28.03.2015, 14:06
    #38919808
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, работа с почтой (прием/отправка)
kunaksergeyС помощью IMAP вы можете отправить сообщение только на ваш SMTP сервер, который и будет заниматься отправкой почты дальше.
Мне это и надо.
Однако не получилось, по крайней мере на GMail.
То ли в GMail этот метод не разрешен, то ли нужно было добавлять письмо в папку "Исходящие", с учетом локализации имени.
...
Рейтинг: 0 / 0
30.03.2015, 09:00
    #38920656
Areostar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, работа с почтой (прием/отправка)
Alibek B.Мне нужно из скрипта наладить работу с электронной почтой.
Используется GMail, поэтому обычный mail не подойдет, нужна полноценная работа с TLS.
Насколько я понял, для этого обычно используют PHPMailer.
Это оптимальный вариант или есть способы лучше?
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.

думаю да! правда у меня на GMail всё отсылалось обычным mail(). правда если заголовки прописать
...
Рейтинг: 0 / 0
30.03.2015, 16:50
    #38921437
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, работа с почтой (прием/отправка)
После нескольких дней нормальной работы начались странные глюки.
Время от времени скрипт не может подключиться по IMAP.
Код: plaintext
1.
2.
PHP Warning:  imap_open(): Couldn't open stream {imap.gmail.com:993/imap/ssl} in .../email.class.php on line 24
PHP Notice:  Error on access to mailbox: Can not authenticate to IMAP server: [CLOSED] IMAP connection broken (authenticate) in .../email.class.php on line 27
Таймауты по умолчанию выставлял в 15 секунд, но даже если их увеличить до 5 минут, ничего не меняется.
...
Рейтинг: 0 / 0
30.03.2015, 18:36
    #38921550
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, работа с почтой (прием/отправка)
Alibek B.даже если их увеличить до 5 минут, ничего не меняетсяНу а с другого клиента или с другого хоста есть коннект в это время?
...
Рейтинг: 0 / 0
30.03.2015, 19:48
    #38921595
kunaksergey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, работа с почтой (прием/отправка)
Alibek B.,

А как часто вы обращаетесь..smtp то чужой. Может стоять защита от роботов какая нибудь
...
Рейтинг: 0 / 0
30.03.2015, 21:36
    #38921678
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, работа с почтой (прием/отправка)
С другого хоста не пробовал, завтра попробую.
Скрипт запускается раз у час, иногда запускаю вручную (через 10-15 минут).
...
Рейтинг: 0 / 0
31.03.2015, 09:20
    #38921884
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP, работа с почтой (прием/отправка)
Похоже временный глюк был, сейчас уже все нормально работает.
Может конечно и защита от роботов, но я не так часто скрипт запускал.
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP, работа с почтой (прием/отправка) / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]