Отписка на php парсингом FBL письма с использованием imap функций


Содержание

Отписка на php парсингом FBL письма с использованием imap функций

Есть файл с письмом(сырой, так как он ходит через smtp). Надо как то его обработать, чтобы получить текст письма отдельно в человекочитаемом формате, от кого, кому и т.п.

Идея — автоматический заказ пропусков. Т.е. человек пишет письмо с текстом

ф: Иванов
и: Петр
о: Иванович
д: 21.03.2014

Система его получает, обрабатывает извлекая из письма поля от кого, а также данные после ф:, и:, о:

1. Забрать сообщение c POP3/IMAP сервера
2. Обработать сообщение — получить в BASH-скрипте поля от, кому, и, самое главное, тело письма в человеческом варианте, чтобы потом его обработать awk, sed-ами, grep-ами и т.д.

Первый пункт реализован с помощью fetchmail, далее postfix+передача письма скрипту. Скрипт на bash письмо получает, но в сыром формате.
Хочется некое универсальную программу, которая бы независимо от кодировки и формата (простой текст/html) выдавала на выходе простой текст тела письма, без форматирования и всего остального.

В гугл пожалуйста сразу не отправляйте, вчера 5 часов убил, так до истины и не добрался. Есть какие-то парсеры на php и python, туманно описаные, но может как-то иначе?

Ответить | Правка | Cообщить модератору

Оглавление

  • Парсинг входящих писем, михалыч, 17:43 , 02-Апр-14, (1)
    • Парсинг входящих писем, Олег, 21:43 , 02-Апр-14, (2)
      • Парсинг входящих писем, ALex_hha, 00:00 , 03-Апр-14, (3)
        • Парсинг входящих писем, Аноним, 05:11 , 03-Апр-14, (4)
        • Парсинг входящих писем, Pahanivo, 06:30 , 03-Апр-14, (5)
        • Парсинг входящих писем, Oleg, 07:34 , 03-Апр-14, (6)
          • Парсинг входящих писем, Pahanivo, 09:32 , 03-Апр-14, (7) +1
          • Парсинг входящих писем, Аноним, 21:12 , 03-Апр-14, ( 10 )
          • Парсинг входящих писем, ALex_hha, 01:00 , 05-Апр-14, ( 16 ) +1
            • Парсинг входящих писем, Аноним, 07:42 , 05-Апр-14, ( 17 )
              • Парсинг входящих писем, ALex_hha, 11:28 , 05-Апр-14, ( 18 )
                • Парсинг входящих писем, ALex_hha, 15:51 , 05-Апр-14, ( 19 )
  • Парсинг входящих писем, Sabakwaka, 16:16 , 03-Апр-14, ( 8 )
    • Парсинг входящих писем, Mr. Mistoffelees, 17:29 , 03-Апр-14, ( 9 )
      • Парсинг входящих писем, Pahanivo, 09:04 , 04-Апр-14, ( 11 )
        • Парсинг входящих писем, Mr. Mistoffelees, 11:06 , 04-Апр-14, ( 12 )
          • Парсинг входящих писем, Pahanivo, 13:23 , 04-Апр-14, ( 13 )
  • Парсинг входящих писем, ShyLion, 15:44 , 04-Апр-14, ( 14 )
    • Парсинг входящих писем, михалыч, 19:31 , 04-Апр-14, ( 15 )

Сообщения по теме [Сортировка по времени | RSS]

> В гугл пожалуйста сразу не отправляйте

Сразу не будем, будем постепенно ))

> вчера 5 часов убил, так до истины и не добрался

значит мало убил, надо 10

Теперь по существу.
В теле могут быть любые строки?
Или только те, что вы привели в качестве примера, а именно
ф: Иванов
и: Петр
о: Иванович
д: 21.03.2014
HTML теги могут присутствовать и быть где угодно?
Кодировка различная?

1. «Парсинг входящих писем» + / –
Сообщение от михалыч (ok) on 02-Апр-14, 17:43
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. «Парсинг входящих писем» + / –
Сообщение от Олег (??) on 02-Апр-14, 21:43

>[оверквотинг удален]
> значит мало убил, надо 10
> Теперь по существу.
> В теле могут быть любые строки?
> Или только те, что вы привели в качестве примера, а именно
> ф: Иванов
> и: Петр
> о: Иванович
> д: 21.03.2014
> HTML теги могут присутствовать и быть где угодно?
> Кодировка различная?

Касаемо полей будет только ф: и: о: д: и п:(номер проходной) восприниматься.
Да, в теле могут быть любые доп. строки, так же как и html-теги, так же как и кодировка — почтовые клиенты то разные. И у кого-то подпись добавлена, кто-то после ф: забыл пробел поставить и т.п.

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. «Парсинг входящих писем» + / –
Сообщение от ALex_hha (ok) on 03-Апр-14, 00:00

Не проще ли сделать простенькую веб форму с 4 полями на том же php и не изобретать костыли и велосипеды?

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. «Парсинг входящих писем» + / –
Сообщение от Аноним (??) on 03-Апр-14, 05:11

> Не проще ли сделать простенькую веб форму с 4 полями на том
> же php и не изобретать костыли и велосипеды?

Ну чтож ты на взлёте то . спортил пiсню :(


Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. «Парсинг входящих писем» + / –
Сообщение от Pahanivo (ok) on 03-Апр-14, 06:30

> Не проще ли сделать простенькую веб форму с 4 полями на том
> же php и не изобретать костыли и велосипеды?

Ну дак это же логично, просто, понятно, проверено, работает.
Это же нифига не путь война^Wизобретателя велосипедов.

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

6. «Парсинг входящих писем» + / –
Сообщение от Oleg (??) on 03-Апр-14, 07:34

> Не проще ли сделать простенькую веб форму с 4 полями на том
> же php и не изобретать костыли и велосипеды?;

Для меня завести для 50 фирм логин и пароль каждой не проще. Тем более пароль от какой то формы можно легко передать подружке.

Нужна именно.авторизация по емайл адресу.

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

7. «Парсинг входящих писем» +1 + / –
Сообщение от Pahanivo (ok) on 03-Апр-14, 09:32

> Для меня завести для 50 фирм логин и пароль каждой не проще.
> Тем более пароль от какой то формы можно легко передать подружке.
> Нужна именно.авторизация по емайл адресу.

че ж вы такое курите на своей фирме.

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

10 . «Парсинг входящих писем» + / –
Сообщение от Аноним (??) on 03-Апр-14, 21:12

> Нужна именно.авторизация по емайл адресу.

Ой мамо . какой эпичекий . хммм . долбоклюй!

Эффект от внедрения будет — ворота открытые всем :)
Почему — думай сам.

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

16 . «Парсинг входящих писем» +1 + / –
Сообщение от ALex_hha (ok) on 05-Апр-14, 01:00

>> Не проще ли сделать простенькую веб форму с 4 полями на том
>> же php и не изобретать костыли и велосипеды?;
> Для меня завести для 50 фирм логин и пароль каждой не проще.
> Тем более пароль от какой то формы можно легко передать подружке.

Каких 50 фирм? Один сайт на все офисы/филиалы

> Нужна именно.авторизация по емайл адресу.

ну если так важно именно email, кто вам мешает создать на этом сайте аутентификацию через почту?

http://storage.sys-adm.org.ua/form/ формочка набрасывается за 10-15 минут, ну и на php что то типа

Для упрощения понимания примера $imap_user/$imap_password сделал переменными, но никто не мешает получать их из формы. Чтоб совсем секурно вешаем форму на https. итого с отладкой и вылизыванием тратим 1-2 часа времени и спим спокойно. Если фирм много и каждая использует свой почтовый сервер, добавляем комбобокс выбора домена, как сделано в том же mail.ru

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

17 . «Парсинг входящих писем» + / –
Сообщение от Аноним (??) on 05-Апр-14, 07:42

> ну если так важно именно email, кто вам мешает создать на этом
> сайте аутентификацию через почту?
> http://storage.sys-adm.org.ua/form/ формочка набрасывается за 10-15 минут, ну и на php что то типа

Действительно удобно! У лохов все пароли соберёшь :)

Ответить | Правка | ^ к родителю #16 | Наверх | Cообщить модератору

18 . «Парсинг входящих писем» + / –
Сообщение от ALex_hha (ok) on 05-Апр-14, 11:28

>> ну если так важно именно email, кто вам мешает создать на этом
>> сайте аутентификацию через почту?
>> http://storage.sys-adm.org.ua/form/ формочка набрасывается за 10-15 минут, ну и на php что то типа
> [. код скипнут . ]
> Действительно удобно! У лохов все пароли соберёшь :)

Если лохи тебе не доверяют, тогда аб чем вообще речь :D

Ответить | Правка | ^ к родителю #17 | Наверх | Cообщить модератору

19 . «Парсинг входящих писем» + / –
Сообщение от ALex_hha (ok) on 05-Апр-14, 15:51

>>> ну если так важно именно email, кто вам мешает создать на этом
>>> сайте аутентификацию через почту?
>>> http://storage.sys-adm.org.ua/form/ формочка набрасывается за 10-15 минут, ну и на php что то типа
>> [. код скипнут . ]
>> Действительно удобно! У лохов все пароли соберёшь :)
> Если лохи тебе не доверяют, тогда аб чем вообще речь :D

Кстати никто ж не запрещает сделать аутентификацию по сертификатам, чтобы не было потом претензий и не поняток

Ответить | Правка | ^ к родителю #18 | Наверх | Cообщить модератору

8 . «Парсинг входящих писем» + / –
Сообщение от Sabakwaka (ok) on 03-Апр-14, 16:16

> Всем доброго времени суток!
> Проблема вкратце:
> Есть файл с письмом(сырой, так как он ходит через smtp). Надо как
> то его обработать, чтобы получить текст письма отдельно в человекочитаемом формате,
> от кого, кому и т.п.

Мне пришлось парсить несколько разноформатных выдач и при помощи пехепе дом елементс, а далее ручками, я навалял фреймворк, до которого ввв:меканайзу — как до Китая пешком.

Полагаю, что на фрешпортс есть пара перловых или на пхп классес несколько заготовок, из которых за день спилится искомое. Выбери инструмент и читай его мануал.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

9 . «Парсинг входящих писем» + / –
Сообщение от Mr. Mistoffelees on 03-Апр-14, 17:29

Делал подобное тыщу лет тому назад. Реализация была через .qmail- файл на почтовом сервере, который позволяет прогнать все тело письма через внешний фильтр (скрипт); ну, а он уже сделает то, что вам нужно. Возможно, что-то подобное есть и в других почтовиках, не знаю — мне qmail вполне хватает на все случаи жизни.

Ответить | Правка | ^ к родителю #8 | Наверх | Cообщить модератору

11 . «Парсинг входящих писем» + / –
Сообщение от Pahanivo (ok) on 04-Апр-14, 09:04

> Привет,
> Делал подобное тыщу лет тому назад. Реализация была через .qmail- файл на
> почтовом сервере, который позволяет прогнать все тело письма через внешний фильтр
> (скрипт); ну, а он уже сделает то, что вам нужно. Возможно,
> что-то подобное есть и в других почтовиках, не знаю — мне
> qmail вполне хватает на все случаи жизни.
> WWell,

очень интересно, только dot-qmail это про вынос тела, а топик стартер ведет разговор о парсинге тела.

Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

12 . «Парсинг входящих писем» + / –
Сообщение от Mr. Mistoffelees on 04-Апр-14, 11:06

>> Привет,
>> Делал подобное тыщу лет тому назад. Реализация была через .qmail- файл на
>> почтовом сервере, который позволяет прогнать все тело письма через внешний фильтр
>> (скрипт); ну, а он уже сделает то, что вам нужно. Возможно,
>> что-то подобное есть и в других почтовиках, не знаю — мне
>> qmail вполне хватает на все случаи жизни.
>> WWell,
> очень интересно, только dot-qmail это про вынос тела, а топик стартер ведет
> разговор о парсинге тела.

Посмотрите как работает | оператор в .qmail файлах. Он не мешает последующему local delivery.

Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

13 . «Парсинг входящих писем» + / –
Сообщение от Pahanivo (ok) on 04-Апр-14, 13:23

>> очень интересно, только dot-qmail это про вынос тела, а топик стартер ведет
>> разговор о парсинге тела.
> Посмотрите как работает | оператор в .qmail файлах. Он не мешает последующему
> local delivery.

NAME
dot-qmail — control the delivery of mail messages

DESCRIPTION
Normally the qmail-local program delivers each incoming
message to your system mailbox, homedir/Mailbox, where
homedir is your home directory.

It can instead write the mail to a different file or
directory, forward it to another address, distribute it to a
mailing list, or even execute programs, all under your
control.

где тут хоть слово про парсинг непосредственно сообщения?

Ответить | Правка | ^ к родителю #12 | Наверх | Cообщить модератору

14 . «Парсинг входящих писем» + / –
Сообщение от ShyLion (ok) on 04-Апр-14, 15:44


> Идея — автоматический заказ пропусков. Т.е. человек пишет письмо с текстом
> ф: Иванов
> и: Петр
> о: Иванович
> д: 21.03.2014

Все твое рабочее время будет посвящено допиливанию скрипта/программы для совместимости с тем или иным почтовым клиентом опеределенной версии а также с разгребанием необработанных писем всвязи с дебильными, автоматически добавляемыми подписями, приветствиями и т.п.
А еще в HTML письма будут стили, скрипты, и прочая хрень.

И все это не считая того простого факта, что в поле From: в письме можно поставить хоть vv_putin, причем вариантов кодирования этого всего тоже масса.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

15 . «Парсинг входящих писем» + / –
Сообщение от михалыч (ok) on 04-Апр-14, 19:31

>[оверквотинг удален]
>> о: Иванович
>> д: 21.03.2014
> Все твое рабочее время будет посвящено допиливанию скрипта/программы для совместимости
> с тем или иным почтовым клиентом опеределенной версии а также с
> разгребанием необработанных писем всвязи с дебильными, автоматически добавляемыми подписями,
> приветствиями и т.п.
> А еще в HTML письма будут стили, скрипты, и прочая хрень.
> И все это не считая того простого факта, что в поле From:
> в письме можно поставить хоть vv_putin, причем вариантов кодирования этого всего
> тоже масса.

А я согласен с вами.
Теоретически, в принципе, можно было бы попробовать написать.
Я на perl’е, в частности, было начал, но плюнул. ))
И даже не самое страшное, что кодировка будет различная, или подписи разные.
И то, что оформлено будет как html код — это решаемо.

Принципиально то, что вы не контролируете как будет указаны фио.
Вчера Иванов отправил заявку так:
ф: Иванов
сегодня Петров так:
ф:Петров
а завтра Сидоров так
фамилия: Сидоров или ф.-Сидоров
а Пупкин вообще пришлёт только
Пупкин Василий Иванович

Вариантов масса. И что тогда делать? Как это всё учесть?

Вот если бы была форма (на сайте, к примеру) с четырьмя полями для фио и даты и все, тогда бы другое дело. Грабли с кодировкой отпадут, с содержимым также.
Красота. Ешь — не хочу..))
Но тогда, как выше справедливо замечают, почему бы и не использовать разбор полученных данных через форму сразу, без писем?

Отправка писем через SMTP на PHP 2 способа

Функция mail() бывает блокируется на хостинге или самом сайте. Если писать в службу поддержки долго или не имеет смысла — придется отправлять письма через SMTP.

СПОСОБ 1 — просто вставляем этот код на сайте с некоторыми настройками:

\r\n»;
$SEND .= «To: $mail_to \r\n»;
$SEND .= «X-Priority: 3\r\n\r\n»;
>
$SEND .= $message.»\r\n»;
if( !$socket = fsockopen($config[‘smtp_host’], $config[‘smtp_port’], $errno, $errstr, 30) ) <
if ($config[‘smtp_debug’]) echo $errno.»
«.$errstr;
return false;
>

if (!server_parse($socket, «220», __LINE__)) return false;

fputs($socket, «HELO » . $config[‘smtp_host’] . «\r\n»);
if (!server_parse($socket, «250», __LINE__)) <
if ($config[‘smtp_debug’]) echo ‘

Не могу отправить HELO!

‘;
fclose($socket);
return false;
>
fputs($socket, «AUTH LOGIN\r\n»);
if (!server_parse($socket, «334», __LINE__)) <
if ($config[‘smtp_debug’]) echo ‘

Не могу найти ответ на запрос авторизаци.

‘;
fclose($socket);
return false;
>
fputs($socket, base64_encode($config[‘smtp_username’]) . «\r\n»);
if (!server_parse($socket, «334», __LINE__)) <
if ($config[‘smtp_debug’]) echo ‘

Логин авторизации не был принят сервером!

‘;
fclose($socket);
return false;
>
fputs($socket, base64_encode($config[‘smtp_password’]) . «\r\n»);
if (!server_parse($socket, «235», __LINE__)) <
if ($config[‘smtp_debug’]) echo ‘

Пароль не был принят сервером как верный! Ошибка авторизации!

‘;
fclose($socket);
return false;
>
fputs($socket, «MAIL FROM: \r\n»);
if (!server_parse($socket, «250», __LINE__)) <
if ($config[‘smtp_debug’]) echo ‘

Не могу отправить комманду MAIL FROM:

‘;
fclose($socket);
return false;
>
fputs($socket, «RCPT TO: \r\n»);

if (!server_parse($socket, «250», __LINE__)) <
if ($config[‘smtp_debug’]) echo ‘

Не могу отправить комманду RCPT TO:

‘;
fclose($socket);
return false;
>
fputs($socket, «DATA\r\n»);

if (!server_parse($socket, «354», __LINE__)) <
if ($config[‘smtp_debug’]) echo ‘

Не могу отправить комманду DATA

‘;
fclose($socket);
return false;
>
fputs($socket, $SEND.»\r\n.\r\n»);

if (!server_parse($socket, «250», __LINE__)) <
if ($config[‘smtp_debug’]) echo ‘

Не смог отправить тело письма. Письмо не было отправленно!

‘;
fclose($socket);
return false;
>
fputs($socket, «QUIT\r\n»);
fclose($socket);
return TRUE;
>

function server_parse($socket, $response, $line = __LINE__) <
global $config;
while (@substr($server_response, 3, 1) != ‘ ‘) <
if (!($server_response = fgets($socket, 256))) <
if ($config[‘smtp_debug’]) echo «

Проблемы с отправкой почты!

$response
$line
«;
return false;
>
>
if (!(substr($server_response, 0, 3) == $response)) <
if ($config[‘smtp_debug’]) echo «

Проблемы с отправкой почты!

Использовать код можно так-же как и обычную функцию mail:
windows-1251 «‘ . «\r\n»;
$headers .= ‘From: vasya@pupkin.ru’. «\r\n»;
smtpmail(’email-получателя@mail.ru’, ‘Тема письма’, ‘Текст письма’, $headers);
?>

СПОСОБ 2 — просто копируем его на сайт и нечего не настраиваем

smtp_username = $smtp_username;
$this->smtp_password = $smtp_password;
$this->smtp_host = $smtp_host;
$this->smtp_from = $smtp_from;
$this->smtp_port = $smtp_port;
$this->smtp_charset = $smtp_charset;
>

/**
* Отправка письма
*
* @param string $mailTo — получатель письма
* @param string $subject — тема письма
* @param string $message — тело письма
* @param string $headers — заголовки письма
*
* @return bool|string В случаи отправки вернет true, иначе текст ошибки *
*/
function send($mailTo, $subject, $message, $headers) <
$contentMail = «Date: » . date(«D, d M Y H:i:s») . » UT\r\n»;
$contentMail .= ‘Subject: =?’ . $this->smtp_charset . ‘?B?’ . base64_encode($subject) . «=?=\r\n»;
$contentMail .= $headers . «\r\n»;
$contentMail .= $message . «\r\n»;

try <
if(!$socket = @fsockopen($this->smtp_host, $this->smtp_port, $errorNumber, $errorDescription, 30)) <
throw new Exception($errorNumber.».».$errorDescription);
>
if (!$this->_parseServer($socket, «220»)) <
throw new Exception(‘Connection error’);
>

fputs($socket, «HELO » . $this->smtp_host . «\r\n»);
if (!$this->_parseServer($socket, «250»)) <
fclose($socket);
throw new Exception(‘Error of command sending: HELO’);
>

fputs($socket, «AUTH LOGIN\r\n»);
if (!$this->_parseServer($socket, «334»)) <
fclose($socket);
throw new Exception(‘Autorization error’);
>

fputs($socket, base64_encode($this->smtp_username) . «\r\n»);
if (!$this->_parseServer($socket, «334»)) <
fclose($socket);
throw new Exception(‘Autorization error’);
>

fputs($socket, base64_encode($this->smtp_password) . «\r\n»);
if (!$this->_parseServer($socket, «235»)) <
fclose($socket);
throw new Exception(‘Autorization error’);
>

fputs($socket, «MAIL FROM: «.$this->smtp_username.»\r\n»);
if (!$this->_parseServer($socket, «250»)) <
fclose($socket);
throw new Exception(‘Error of command sending: MAIL FROM’);
>


fputs($socket, «RCPT TO: » . $mailTo . «\r\n»);
if (!$this->_parseServer($socket, «250»)) <
fclose($socket);
throw new Exception(‘Error of command sending: RCPT TO’);
>

fputs($socket, «DATA\r\n»);
if (!$this->_parseServer($socket, «354»)) <
fclose($socket);
throw new Exception(‘Error of command sending: DATA’);
>

fputs($socket, $contentMail.»\r\n.\r\n»);
if (!$this->_parseServer($socket, «250»)) <
fclose($socket);
throw new Exception(«E-mail didn’t sent»);
>

fputs($socket, «QUIT\r\n»);
fclose($socket);
> catch (Exception $e) <
return $e->getMessage();
>
return true;
>

private function _parseServer($socket, $response) <
while (@substr($responseServer, 3, 1) != ‘ ‘) <
if (!($responseServer = fgets($socket, 256))) <
return false;
>
>
if (!(substr($responseServer, 0, 3) == $response)) <
return false;
>
return true;

Вызываем теперь класс с параметрами

require_once «SendMailSmtpClass.php»; // подключаем класс

$mailSMTP = new SendMailSmtpClass(‘zhenikipatov@yandex.ru’, ‘****’, ‘smtp.yandex.ru’, ‘Evgeniy’); // создаем экземпляр класса
// $mailSMTP = new SendMailSmtpClass(‘логин’, ‘пароль’, ‘хост’, ‘имя отправителя’);

Материал взят частично с сайтов:

imap парсинг темы письма

SimbiX

Новичок

Приветствую, есть задача получать письма с ящика пользователя по imap протоколу, возникла проблема с парсингом темы сообщения:

когда текст закодирована в base64 с прямым указанием кодировки:

то все нормально, imap_mime_header_decode работает отлично

но есть письма в которых тема идет plain текстом, на которую imap_mime_header_decode возвращает default, и нужно как-то пробовать самому верно узнать кодировку. Смотрю заголовок с Content-type где тоже можно получить кодировку, но есть письма в которого его нет, что делать тогда, как узнать кодировку ?
mb_detect_encoding работает как себе, и очень часто промахивается

Получение почты средствами PHP через IMAP

Доброго всем времени суток господа.

Есть E-mail’ы, логины и пассы к своей почте. Охота средствами PHP с каждой почты получать E-mail’ы. Просто подключиться к почте по IMAP, затолкать все письма в простой PHP массив. Без всяких извратов, без удалений писем, просто подключаемся -> делаем массив с письмами. Что то в роде:

И сам уже пытался, и гуголь мучал. Посте двух дней поисков, странно, но больше одного письма, из всего списка, получить не могу. Подскажете с кодом?

1 ответ 1

Порядок действий примерно такой:

  1. Устанавливаем соединение с почтовым сервером с помощью функции imap_open
  2. Получаем заголовки писем в ящике с помощью функции imap_fetch_overview. Теперь у нас есть массив писем, в котором содержится msgno, from, to, date, subject и другие параметры, которые мы обычно видим в почтовом клиенте, когда просматриваем ящик.
  3. Ну дальше, зная msgno каждого письма получаем его содержимое (текст, вложения) с помощью функций imap_fetchbody, imap_fetchheader, imap_headerinfo, imap_fetch_overview и другие. Все функции здесь.

Приводить пример кода не буду, в оф. документации достаточно примеров для каждой из функций. Если не получиться, пишите, будем думать дальше вместе :)

OpenRate.us

Сайт про CRM-маркетинг, рассылки и вот это всё

Как работает FBL Яндекс Почты

Feedback Loop (FBL) Яндекс Почты заработал еще в сентябре 2014 (руки не доходили написать).

FBL использует функционал Return Path, предоставляется по запросу и доступен только отправителям, использующим выделенные IP. Заявки проходят ручную модерацию.

Представитель Яндекса рассказал в сообщении в тематической группе Фейсбука:

«Мы в Яндекс.Почте совместно с нашими партнёрами, компанией ReturnPath, запускаем публичный FBL для жалоб пользователей, с выбором источника по IP-адресу. Это сервис для больших рассыльщиков, владеющих собственными блоками IP-адресов.
Если вы рассылаете много писем со своих серверов, то с помощью этого механизма сможете получать информацию о жалобах на них от пользователей Яндекс.Почты.

Во время подачи заявки вам нужно будет подтвердить владение определёнными IP-адресами или диапазонами, указываемыми в формате CIDR. Для этого мы высылаем письма на адреса, которые указаны в WHOIS-данных каждого их запрашиваемых IP-адресов. Для подтверждения необходимо перейти по ссылке из письма.
Все заявки проходят ручную модерацию.»

Также он уточнил, что «…никакого количественного ценза нет, то есть «много» — это сколько угодно, если с собственных айпишников. Хотим пока именно поработать на уровне ESP. В планах конечно есть развитие возможностей.»

Не забудьте подключить postoffice Yandex, чтобы отслеживать доставку писем и поведение читателей с почтой на Яндексе.

Как работает FBL Яндекс Почты : 6 комментариев

Она по умолчанию отображается в письмах отправителей, которые поддержали формат такой отписки на своей стороне. В противном случае, Вы можете как и раньше нажимать кнопку Это Спам на нежелательных рассылках.

пользуемся юнисендер, как настроить fbl в яндексе? требует ip серверов

Анна, скорее всего никак. Но на всякий случай переспросите у поддержки Юнисендера.
Можно периодически извлекать из Почтового офиса Яндекса список пожаловавшихся на спам и исключать их вручную.

мы рассылаем через mailchimp
как сделать, что бы яндекс учитывал жалобы наших пользователей?

Вы можете периодически извлекать из Почтового офиса Яндекса список пожаловавшихся на спам и исключать их вручную.

Настройка FBL для ваших доменов

Зачем это нужно?

Настройка FBL для вашего домена необходима для автоматической отписки подписчиков, которые жмут кнопку СПАМ в ваших письмах.

Если вы этого не делали, то по умолчанию будут использоваться настройки FBL сервиса JustClick и ваши подписчики будут отписываться от вашей рассылки без вашего участия.

Как настроить?

Если вы создавали e-mail для настроек FBL на своем хостинге, то алгоритм настройки зависит от вашего хостинга. Настройки протокола IMAP могут быть доступны либо в панели управления либо после обращения в поддержку хостинга.

Настройки FBL для Mail.ru

    Зарегистрируйтесь в сервисе Postmaster от mail.ru по этой ссылке https://postmaster.mail.ru.


Создайте специальный e-mail вида fbl@ваш_сайт.ru, на который будут отправляться уведомления о нажатии кнопки СПАМ вашими подписчиками. Обратите внимание: на один домен может быть настроен только один адрес для получения FBL.

Перейдите на страницу настройки FBL https://postmaster.mail.ru/settings и укажите там созданный вами ранее e-mail — fbl@ваш_сайт.ru.

Настройки FBL для Google

  1. Зарегистрируйтесь на https://postmaster.google.com
  2. Указать домен и подтвердить право собственности на него, добавив запись DNS TXT или DNS CNAME.

Настройки FBL для Яндекс

К сожалению, Яндекс прекратил поддержку FBL, а значит и предоставление информации о подписчиках, нажавших на «спам». Настроить FBL для данного сервиса не представляется возможным.

Настройка почтового протокола IMAP на Mail.ru

Настраивать IMAP для почты на сервисе Mail.ru не нужно. Он включен по умолчанию и изменить эти настройки нельзя. Адрес IMAP-сервера Mail.ru — imap.mail.ru — именно его нужно будет сообщить в поддержку. В случае с Mail.ru, логин для e-mail совпадает с самим e-mail.

Настройка почтового протокола IMAP на Gmail.com

  1. Авторизуйтесь в своей почте на mail.google.com, которую вы создавали специально для настроек FBL. Кликните по кнопке Настройки ==>Настройки
  2. Убедитесь, что в строке «Доступ по протоколу IMAP:» у вас стоит « IMAP включен », как показано на скриншоте выше. Если же это не так, то поставьте галочку напротив этого пункта и нажмите «Сохранить изменения».

Адрес IMAP-сервера для почты от Google — imap.gmail.com — именно его нужно будет сообщить в поддержку. В случае с Gmail, логин для e-mail совпадает с самим e-mail.

Настройка почтового протокола IMAP на Yandex.ru

  1. Авторизуйтесь в своей почте на mail.yandex.ru, которую вы создавали специально для настроек FBL. Кликните по кнопке Настройки ==>Все настройки
  2. В левом меню перейдите на вкладку Почтовые программы и поставьте галочку возле « С сервера imap.yandex.ru по протоколу IMAP »

Адрес IMAP-сервера для почты от Yandex — imap.yandex.ru — именно его нужно будет сообщить в поддержку. В случае с Yandex, логин для e-mail совпадает с самим e-mail.

Что сообщить в поддержку?

Для завершения настроек сообщите нам в поддержку support@justclick.ru следующие данные:

  • адрес вашего почтового IMAP сервера
  • логин для e-mail, который вы делали для FBL Обратите внимание: зачастую он совпадает с e-mail, но может и отличаться
  • пароль для доступа к e-mail fbl@ваш_сайт.ru

Отписка на php парсингом FBL письма с использованием imap функций

Initially released in December 2012, the PHP IMAP Mailbox is a powerful and open source library to connect to a mailbox by POP3, IMAP and NNTP using the PHP IMAP extension. This library allows you to fetch emails from your email server. Extend the functionality or create powerful web applications to handle your incoming emails.

  • Connect to mailbox by POP3/IMAP/NNTP, using PHP IMAP extension
  • Get emails with attachments and inline images
  • Get emails filtered or sorted by custom criteria
  • Mark emails as seen/unseen
  • Delete emails
  • Manage mailbox folders
  • PHP 5.6, 7.0, 7.1, 7.2 or 7.3
  • PHP imap extension must be present; so make sure this line is active in your php.ini: extension=php_imap.dll
  • PHP mbstring extension must be present; so make sure this line is active in your php.ini: extension=php_mbstring.dll
  • PHP iconv extension must be present, if mbstring is not available; so make sure this line is active in your php.ini: extension=php_iconv.dll

Installation by Composer

Install the latest available and stable source code from master , which is may not released / tagged yet:

Install the latest available and may unstable source code from develop , which is may not properly tested yet:

Before you can run the PHPUnit tests you may need to run composer install to install all (development) dependencies.

You can run all PHPUnit tests by running the following command (inside of the installed php-imap directory): php vendor/bin/phpunit —testdox


Integration with frameworks

Getting Started Example

Below, you’ll find an example code how you can use this library. For further information and other examples, you may take a look at the wiki.

Method imap() allows to call any imap function in a context of the the instance:

Some request require much time and resources:

Работа с SMTP в Synapse.

Приветствую всех читателей блога WebDelphi.ru! Очень надеюсь, что затянувшаяся вынужденная пауза в работе блога подходит к концу. И в скором времени те, кто ожидает продолжение постов про DevExpress и Google Календарь получат пищу для размышлений в виде статьи (черновой вариант уже недели две как пылится в блоге). Этот пост я решил снова посвятить библиотеке Synapse и снова рассмотреть несколько вопросов относительно работы с почтой. В качестве отправной точки для написания статьи я решил использовать тему с форума и один из последних комментариев в статье, посвященной использованию Synapse для работы с GMail.

Про Synapse я рассказываю в блоге уже довольно давно (и, что интересно, в «пиаре» Synapse обвинен ещё не был). И хоть и стараюсь обычно рассказывать так, чтобы было не только интересно и с картинками, но и понятно, вопросы все равно появляются самые разные. На некоторые вопросы отвечаю сразу, где-то сам долго «туплю» прежде, чем смогу найти решение, а какие-то вопросы по Synapse коплю до тех пор, пока не наберется «критическая масса» для отдельного поста и свободная минутка как, например, для этого поста.

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

      • используется последний на момент написания статьи релиз Synapse (Release 40, rev. 182)
      • для работы с почтой используются сервера mail.ru, yandex.ru и gmail.com. Работу с другими серверами проверяйте самостоятельно.
      • Весь исходный код написан в Delphi XE3 со всеми установленными апдейтами.
      • НЕТ я НЕ использую Delphi 7 и версии Delphi младше XE2. Нет, у меня нет установленной Delphi 7
      • Код проверялся на Windows 7

Теперь, покончив с формальностями, перейдем к сути статьи. Сегодня на повестке дня снова работа с SMTP и рассматриваются следующие моменты работы:

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

Для работы нам потребуются следующие модули Synapse: smtpsend, pop3send, blcksock, ssl_openssl, mimemess, mimepart, synautil, synachar.

Отправка писем с вложениями

Отправка писем с использованием Synapse рассматривалась в следующих статьях:

Начнем с отправки c самого простого. Открываем Delphi (желательно XE3, т.к. см. выше), создаем новый проект VCL Application и бросаем на форму компоненты, как показано на рисунке ниже:

Вид главной формы приложения

Теперь разберемся как происходит отправка писем с помощью Synapse. По большому счёту, отправку любого письма (хоть с вложением, хоть без) выполняется в пять шагов, которые можно представить в виде вот такой небольшой таблички:

Операция
Команды SMTP Метод TSmtpSend Примечание
Авторизация ESMTP EHLO или HELO
Установка обратного адреса MAIL FROM Используется для отправки необработанных писем
Установка получателей сообщения RCPT TO Если получателей несколько, то команда выполняется отдельно для каждого получателя
Отправка данных (тела сообщения) DATA
Закрытие сессии QUIT

Для того, чтобы облегчить нам работу с Synapse, разработчики написали несколько вспомогательных методов для отправки писем и поместили их все в тот же модуль SmtpSend.pas. В этих методах нет ничего «сверхъестественного», все они используют в работе TsmtpSend:

Удобно пользоваться этими функциями — пользуйтесь. Хочется, чтобы все было «по уму» — отображение прогресса отправки писем, лог работы клиента и все такое прочее — используем класс TSmtpSend без всяких функций-обёрток.

Сегодня мы будем пользоваться только классом TSmtpSend. Для начала, напишем обработчик события OnClick для кнопки «Проверить подключение». Вполне возможно, что, если Вы впервые сталкиваетесь с SMTP в Synapse, то могли проверять подключение так:

НО мы, используя код выше проверили только соединение с сервером (хотя и задали и логин и пароль пользователя), но не авторизацию пользователя на сервере. В итоге можно получить такую ситуацию: пользователь вводит правильный хост/порт/логин, но в пароле случайно допускает небольшую ошибочку. Ваша программа сообщает на проверке, что все в порядке, а письмо не отправляется…Чтобы такого не произошло и Вы были уверены, что заданные пользователем данный корректны, а письма будут отправляться

То есть, окончательный вариант кода проверки соединения с сервером должен выглядеть так:

Вот теперь можно двигаться далее. А далее пройдемся сразу по нескольким вопросам, которые в разное время задавались по несколько раз в разных постах разными людьми :)

Как отправить письмо с вложением нескольким адресатам?

Здесь, на самом деле, нет ничего сложного. Про то как собрать и закодировать письмо с вложением я рассказывал в статье «Synapse в Delphi. Отправка писем с вложениями«. И, если посмотреть внимательно на приведенный в статье код, то мы можем там увидеть такие строчки:

В Synapse, как и полагается, список получателей — это действительно список. ToList — это обычный TStringList и создается без каких-либо изменений, т.е. в качестве разделителя используется запятая. Так что, никаких проблем, по факту-то нет. Если список получателей письма у вас также как и у меня в программке пишется в Edit, то достаточно записать список строку с получателями вот так:

«Иван Иванов» , «Петя Петров»

И при отправке письма записать эту строку с свойство ToList вот так:

С адресами разобрались, теперь о самой отправке. Как было сказано в табличке выше, если получателей несколько, то на каждый адрес получателя должна выполняться команда MAIL TO. Так мы и сделаем. Пишем код обработчика OnClick для кнопки «Отправить»:

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

Как отправлять копии писем (использовать поля CC и BCC в email)?

Вначале небольшая справка о том, чем отличается поле CC от BCC в Email.

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

С полями To все понятно — все получатели у нас пишутся в свойство Header.ToList у класса TMimeMess. И этими полями мы пользовались выше при отправке писем.

С полями CC тоже проблем быть не должно — у того же класса есть свойство Header.ССList. Заполняется свойство также как и ToList.

Остается вопрос по тому как записать поля BCC? В принципе, я уже много-много раз говорил, но повторюсь ещё раз (повторение — мать учения) — Synapse очень простая библиотека. Достаточно взглянуть чуть по-внимательнее на класс TMessHeader (заголовки сообщения), чтобы увидеть такое свойство:

И никто нам не запрещает им пользоваться. Ради проверки, изменим в нашей процедуре отправки письма строку:

и снова попробуем отправить письмо на несколько адресов. В итоге на каждый ящик, указанный в BCC придёт отдельная копия письма. Видео-ролик я выкладывать здесь уже не буду, просто поверьте, что это работает :) Двигаемся далее.

Как получать отчёты о доставке писем?

Вот этот вопрос уже по-интереснее. Дело в том, что есть как минимум три возможности сделать доставку уведомлений:

  • с использованием заголовков типа Return-Receipt-To, Errors-To, Status и т.д. Все эти заголовки указаны в RFC 2076, но помечены как не стандартные и не рекомендуемые к использованию. Следовательно сервер может просто «не понимать», что от него хотят.
  • Использование заголовка Disposition-Notification-To, которому посвящен RFC 2298. Вроде бы и стандарт есть и использовать можно, но элементарная проверка без Delphi и Synapse показала, что то же mail.ru никаких уведомлений не получает, хотя при отправке писем и на yandex.ru и на gmail.com я ставил в интерфейсе mail.ru галку «С уведомлением»
  • Использовать DSN (Delivery Status Notifications). Опять же, этот механизм хоть и может использоваться почтовыми серверами, но используется он далеко не всегда…

В общем, в поисках ответа на этот вопрос я перерыл довольно не малое количество всяческих RFC, админских форумов и т.д. и т.п., но абсолютно надежного, со 100% гарантией способа получать уведомления о доставке писем не нашел — практически с каждым почтовым сервером приходится разбираться отдельно и выбирать тот или иной способ работы. Вот такая вот печалька

Но нет худа без добра. Зато появилась возможность по-глубже закопаться в Synapse и посмотреть как можно «прикрутить» использование DSN к TSMTPSend.

Итак, как использовать DSN? Для того, чтобы мы могли воспользоваться этой возможностью, чтобы получать уведомления о доставке/задержке/ошибке сообщения мы, в первую очередь обязаны убедиться в том, что сервер поддерживает DSN.

Чтобы запросить дополнительные возможности SMTP-сервера мы можем отправить на сервер команду EHLO. Если сервер понимает эту команду, то он вернет нам список дополнительных расширений, например, максимальный размер сообщения (SIZE), способы авторизации пользователя и, в том числе, «скажет» поддерживается ли DSN.

Я уже говорил, что Synapse это очень простая библиотека? По-моему говорил. Дело в том, что команда EHLO используется при выполнении метода Login у TSmtpSend. И, если сервер поддерживает эту команду, то заполняется свойство:

Чтение писем IMAP через PHP

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

Здесь я расскажу только про IMAP.

Подключение к IMAP через PHP выглядит следующим образом:

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

Параметр ssl указывает на то, что нужно использовать SSL для шифрования.
Параметр novalidate-cert указывает на то, что сертификат проверять не нужно. Если у Вас на сервере самоподписанный сертификат — это то, что вам нужно!
Больше параметров вы можете найти в официальной документации, не будем заострять на этом внимание.

Кстати, пока я не использовал SSL с параметром novalidate-cert, я получал вот такую вот ошибку.

Давайте получим все непрочитанные письма в ящике и выведем их на экран.

Вот и всё, собственно. В этом нет ничего сложного. Если будут какие-то вопросы — задавайте их в комментариях. )

Перекидывание почты в базу: PHP, IMAP, MySQL

Возникла необходимость перелить в базу данных содержимое почтового ящика. По получившемуся архиву должен осуществляться относительно быстрый поиск. Следующий скрипт забирает письма по IMAP, парсит их, помещает в MySQL, и при необходимости удаляет обработанную почту (отвечающий за удаление кусок кода нужно раскомментировать). Если удалять письма не нужно, то для более быстрой работы можно использовать опцию readonly при инициализации соединения с почтовым сервером.

В скрипте не предусмотрена обработка писем во вложенных папках, так как это не требовалось. Данные собираются в поля: дата, отправитель, получатели (to, cc и bcc скомбинированы в одну строку) и тема письма. Полная копия письма также сохраняется в BLOB.

Код писался на скорую руку и при определённых условиях фэйлит, но задачу свою он в итоге с нескольких попыток всё же выполнил. Так что отсюда можно выдрать несколько полезных моментов, в частности, обработку темы письма.

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

Илон Маск рекомендует:  Iis назначение операторов веб узла
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL