За последние 24 часа нас посетили 23018 программистов и 1225 роботов. Сейчас ищут 885 программистов ...

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

Тема в разделе "PHP для новичков", создана пользователем Ruslan.nut, 7 апр 2021.

  1. Ruslan.nut

    Ruslan.nut Новичок

    С нами с:
    16 фев 2021
    Сообщения:
    13
    Симпатии:
    1
    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. Ставим письмо статус прочитано
    Проблема в том, что при пересылке письма себе на почту вручную, либо с другой почты, то письмо нормально обрабатывается и отправляется уведомление. Если письмо приходит с другого ящика, то уведомление не отправляются. Письма одинаковой структуры. Никак не могу понять в чём проблема
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.825
    Симпатии:
    738
    Адрес:
    Татарстан
    значит не одинаковой...
    отлаживайте пошагово
    1) попадает ли "странное" письмо в цикл
    2) срабатывает ли на данном письме $check_mail
    в зависимости от результата - копаете дальше

    P.S
    PHP:
    1. if ($check_mail == true) {
    эквивалентно
    PHP:
    1. if ($check_mail) {
     
  3. Ruslan.nut

    Ruslan.nut Новичок

    С нами с:
    16 фев 2021
    Сообщения:
    13
    Симпатии:
    1
    Да в том то и прикол, что оно одинаковое. Попробую конечно ещё дополнительно посмотреть
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.825
    Симпатии:
    738
    Адрес:
    Татарстан
    как вы определяете "одинаковость"?
    выводите содержимое письма через var_dump() и смотрите ... мб где кодировки не те, может непечатаемые символы... 100500 причин
     
  5. Ruslan.nut

    Ruslan.nut Новичок

    С нами с:
    16 фев 2021
    Сообщения:
    13
    Симпатии:
    1
    Понял, спасибо!)
    Сейчас буду пробовать