Перебор почты Яндекс по циклу и отправка уведомлений в Телеграм

Ruslan.nut

PHP:
  1. /* connect to yandex */
  2. $hostname = ‘{imap.yandex.ru:993/imap/ssl}INBOX’;
  3. $username = ‘почта’;
  4. $password = ‘пароль’;
  5.  
  6. /* try to connect */
  7. $imap = imap_open($hostname,$username,$password) or die(‘Cannot connect to Yandex: ‘ . imap_last_error());
  8. $mails_id = imap_search($imap, ‘UNSEEN’); #Извляем только не прочитанные сообщения
  9.  
  10.  
  11. foreach ($mails_id as $num) {
  12.  
  13.     ### Подготавливаем тело письма
  14.    $body = preparing_body($imap, $num); #Получаем тело письма и декодируем его
  15.    $check_mail = check_mail($body); #Проверяем то ли письмо нам пришло
  16.    if ($check_mail == true) {
  17.         $result_text = preparing_body_mail($body); #Разделяем части текста
  18.        $client_name = search_client_name($result_text[«client_id»][1][0]);
  19.         include(«plugins/Telegram/index.php»); #Отправляем в Телеграм
  20.    }
  21.     //imap_delete($imap, $num); #Помечаем письмо как удаленное
  22.     imap_setflag_full ($imap, $num, ‘\seen’); #устанавливаем, что прочитано
  23.  
  24.     ### Дебаг
  25.    echo «<br><br><br><br><br><br><br><br><br><br><br><br>»;
  26.     echo «Рекламная система: « . $result_text[«system»][1][0] . «<br>»;
  27.     echo «Email клиента: « . $result_text[«client_email»][1][0] . «<br>»;
  28.     echo «Имя клиента: « . $client_name . «<br>»;
  29.     echo «Elama ID: « . $result_text[«client_id»][1][0] . «<br>»;
  30.     echo «Проверка mail: « . var_dump($check_mail) . «<br>»;
  31.  
  32.     ### Само сообщение
  33.    echo «<br><br><br><br><br><br><br><br><br><br><br><br>»;
  34.     echo $body;
  35.  
  36.     #Логика обработчика
  37.    /*
  38.      * 1) Проверяем это письмо о расходе средств?
  39.      * 2) Подготавливаем письмо для обработки
  40.      * 3) Обрабатываем письмо
  41.      * 4) Отправляем в Телеграм
  42.      * 5) Удаляем письмо
  43.      *
  44.      * Срабатывают письма с заголовками:
  45.      * 1) Яндекс.Директ/Деньги на счету логина e-16714111 в Яндекс.Директе Уведомление о РАСХОДЕ средств
  46.      *
  47.      * */
  48.     //imap_expunge($imap); #Удаляем сообщения
  49.  
  50. }
  51.  
  52. imap_close($imap);
  53.  
  54.  
  55. #Функции
  56. function decode_utf8($str)
  57. {
  58.  
  59.     #Функция раскодирования текста из base64 в utf8
  60.    $parts = preg_split(«/=?UTF-8?B?/i», $str);
  61.  
  62.     $res_str = »;
  63.     foreach ($parts as $p) {
  64.         if ($p) {
  65.             $parts2 = preg_split(«/?=/i», $p);
  66.             $s = base64_decode($parts2[0]);
  67.             if (count($parts2) > 1)
  68.                 $s .= $parts2[1];
  69.  
  70.             $res_str .= $s . ‘ ‘;
  71.         }
  72.     }
  73.  
  74.     return trim($res_str);
  75. }
  76.  
  77. function preparing_body($imap, $num)
  78. {
  79.     #Получаем тело письма и декодируем его
  80.    $body = imap_body($imap, $num); // Получаем письма
  81.     $body = decode_utf8($body); // Декодируем из base64 в utf8
  82.     return $body;
  83.  
  84. }
  85.  
  86. function check_mail($body)
  87. {
  88.     #Проверяем письмо от Яндекс Директ
  89.    preg_match_all(‘#поэтому показ (.+?) приостановлен#su’, $body, $check_mail); // Извлекаем текст
  90.     if ($check_mail[1][0] == «его рекламы») {
  91.         return true; // Письмо определено
  92.     } else {
  93.         return false; // Письмо не определено
  94.     }
  95. }
  96.  
  97. function preparing_body_mail($body)
  98. {
  99.  
  100.     #Разделяем части текста
  101.  
  102.     preg_match_all(‘#балансе (.+?), поэтому#su’, $body, $result[«system»]); // Извлекаем систему
  103.     preg_match_all(‘#аккаунт клиента (.+?) и пополните#su’, $body, $result[«client_email»]); // Извлекаем email клиента
  104.     preg_match_all(‘#(ID: (.+?)) з#su’, $body, $result[«client_id»]); // Извлекаем ID клиента в Elama
  105.  
  106.     $result[«client_id»][1][0] = substr($result[«client_id»][1][0], 4, 1); // Удаляем лишний символ у id
  107.  
  108.     return $result;
  109.  
  110. }
  111.  
  112. function search_client_name($client_id)
  113. {
  114.  
  115.     include «clients.php»;
  116.  
  117.     foreach ($clients as $key => $value){
  118.         if($clients[$key][«id»] == $client_id){
  119.             return $clients[$key][«name»];
  120.             break;
  121.         }
  122.     }
  123.  
  124. }

Этапность выполнения такая:

  1. Подключаемся к почтовому ящику
  2. Берём оттуда не прочитанные письма
  3. Проверяем подходит ли письмо по условию
  4. Если письмо подходит по условию, то через регулярки извлекаем данные
  5. Отправляем данные в телеграм
  6. Ставим письмо статус прочитано

Проблема в том, что при пересылке письма себе на почту вручную, либо с другой почты, то письмо нормально обрабатывается и отправляется уведомление. Если письмо приходит с другого ящика, то уведомление не отправляются. Письма одинаковой структуры. Никак не могу понять в чём проблема

 

ADSoft

значит не одинаковой…
отлаживайте пошагово
1) попадает ли «странное» письмо в цикл
2) срабатывает ли на данном письме $check_mail
в зависимости от результата — копаете дальше

P.S

PHP:
  1. if ($check_mail == true) {

эквивалентно

PHP:
  1. if ($check_mail) {
 

Ruslan.nut

Да в том то и прикол, что оно одинаковое. Попробую конечно ещё дополнительно посмотреть

 

ADSoft

как вы определяете «одинаковость»?
выводите содержимое письма через var_dump() и смотрите … мб где кодировки не те, может непечатаемые символы… 100500 причин

 

Ruslan.nut

Понял, спасибо!)
Сейчас буду пробовать

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *