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

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


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


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


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

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


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

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

Делите строку по вопросикам, декодируете base64_decode нужный фрагмент и получаете текст в указанной кодировке.
...
Рейтинг: 0 / 0
PHP, работа с почтой (прием/отправка)
    #38917078
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С первой строкой у меня без проблем справляется imap_mime_header_decode.
У меня проблема с тем, как получить значение полей после imap_headerinfo.
После нее получается "?KOI8-R?B?9MXT1DE=?=" и из этой строки извлечь данные не получается.
...
Рейтинг: 0 / 0
PHP, работа с почтой (прием/отправка)
    #38917097
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщем слепил такого кадавра:
Код: 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
PHP, работа с почтой (прием/отправка)
    #38917202
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
PHP, работа с почтой (прием/отправка)
    #38917292
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, не сообразил к imap_headerinfo еще одно преобразование применить.
Но почему KOI8-R? В исходном письме его вообще нигде нет.
...
Рейтинг: 0 / 0
PHP, работа с почтой (прием/отправка)
    #38918026
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не подскажите с еще одним моментом?
Не могу понять, как извлечь из письма список прикрепленных файлов.
Нужно обработать письма, получить текст письма и прикрепленные файлы.
Использую такой код:
Код: 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
PHP, работа с почтой (прием/отправка)
    #38918042
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас я использую такой алгоритм для извлечения данных:
Код: 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
PHP, работа с почтой (прием/отправка)
    #38918433
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите с еще одним вопросом.
Допустим письмо я принял, обработал, пометил для удаления, выполнил expunge.
Из входящих письмо удалилось, но в архиве осталось (на ящике GMail) и к этому письму я могу повторно обратиться с помощью uid.
Это особенность именно GMail? Или особенность IMAP и на такое поведение я могу рассчитывать на любом сервере?
...
Рейтинг: 0 / 0
PHP, работа с почтой (прием/отправка)
    #38918646
keinW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фишка 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
PHP, работа с почтой (прием/отправка)
    #38919777
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никак не пойму, можно ли с помощью протокола IMAP отправить почту? Или для отправки нужно использовать SMTP?
Соответствующие функции (imap_mail или imap_append) вроде бы есть, но мне ни разу не удалось отправить сообщение.
...
Рейтинг: 0 / 0
PHP, работа с почтой (прием/отправка)
    #38919802
kunaksergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alibek B.,
IMAP -это такой же клиентский протокол как и POP3. При POP3 сообщение закачивается на клиента,при IMAP4 закачиваются заголовки, а сообщение хранится на сервере. Отправкой сообщений занимается только SMTP сервер. С помощью IMAP вы можете отправить сообщение только на ваш SMTP сервер, который и будет заниматься отправкой почты дальше.
...
Рейтинг: 0 / 0
PHP, работа с почтой (прием/отправка)
    #38919808
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kunaksergeyС помощью IMAP вы можете отправить сообщение только на ваш SMTP сервер, который и будет заниматься отправкой почты дальше.
Мне это и надо.
Однако не получилось, по крайней мере на GMail.
То ли в GMail этот метод не разрешен, то ли нужно было добавлять письмо в папку "Исходящие", с учетом локализации имени.
...
Рейтинг: 0 / 0
PHP, работа с почтой (прием/отправка)
    #38920656
Фотография Areostar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Мне нужно из скрипта наладить работу с электронной почтой.
Используется GMail, поэтому обычный mail не подойдет, нужна полноценная работа с TLS.
Насколько я понял, для этого обычно используют PHPMailer.
Это оптимальный вариант или есть способы лучше?
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.

думаю да! правда у меня на GMail всё отсылалось обычным mail(). правда если заголовки прописать
...
Рейтинг: 0 / 0
PHP, работа с почтой (прием/отправка)
    #38921437
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После нескольких дней нормальной работы начались странные глюки.
Время от времени скрипт не может подключиться по 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
PHP, работа с почтой (прием/отправка)
    #38921550
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.даже если их увеличить до 5 минут, ничего не меняетсяНу а с другого клиента или с другого хоста есть коннект в это время?
...
Рейтинг: 0 / 0
PHP, работа с почтой (прием/отправка)
    #38921595
kunaksergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alibek B.,

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


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