Автоуведомление в получении и прочтении писем

Тема в разделе "Обо всём", создана пользователем vikaharkov, 13 дек 2016.

  1. vikaharkov

    vikaharkov Продвинутый пользователь

    Сообщения:
    676
    Симпатии:
    71
    СУТЬ ВОПРОСА

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

    ВВОДНАЯ

    1. Не стану описывать важность понимания - получено ваше письмо клиентом или нет, прочитал ли клиент оформленный заказ или он попал в спам. Это, как бы, типа аксиомы - важно знать и всё тут.

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

    3. Мнения о якобы незаконности подобного (а такие были встречены в Сети) должны быть подкреплены такими железными аргументами, которые убедили бы в незаконности программы MailTrack для Gmail (она также использует технологию вставки гиф-картинок в тело письма).

    РЕАЛИЗАЦИЯ

    Ну вот тут и тупик в понимании. Однако, это и есть непаханное поле для творчества, вашей самореализации и роста.

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

    Видится какаая-то такая схема:
    1. В тело письма вставляется какая нить однопиксельная гифка, при открытии которой (вместе с письмом) идёт сигнал на почту сайта.

    2. В теле письма вставляется некая штука, которая уведомит нас об открытии письма (мать чесная, я даже не знаю, как правильно сформулировать название всех этих штук и команд, или просто боюсь ошибиться, поэтому называю их штуками... стыдно, но факт)

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

    Уведомление о прочтении письма PHP, mod_rewrite.
    Для того чтобы получить уведомление о прочтении письма PHP, mod_rewrite, наш сервер должен получить уведомление об открытии. А заставим мы уведомить нас отправителя через скрытое изображение в тексте письма:
    Код:
    '<img style="width:1px;height:1px;" src="http://'.$_SERVER['SERVER_NAME'].'/'.base64_encode($email).'/'.  rand(1, 999).'/email.gif">';
    
    $_SERVER['SERVER_NAME'];//  здесь хранится имя нашего домена, например example.com
    base64_encode($email);// шифруем email пользователя
    rand(1, 999);// добавляем случайное число, или же это может быть id вашей рассылки
    
    Это нужно для того чтобы почтовые сервера не кешировали наше изображение и всегда обращались к нашему серверу. О том как можно отправить изображение в теле письма PHPMailer Вы можете прочитать здесь.

    Теперь нам понадобится модуль mod_rewrite, как его установить вы можете прочитать в отдельной статье. Настройка mod_rewrite. Он нам нужен для переадресации внутри index.php и обработки URL. Все CMS поддерживают и требуют наличие этого модуля.

    Обрабатывать URL можно например так:
    Код:
    $action = '';
    
    if(strpos($_SERVER['REQUEST_URI'], 'email.gif')!==false){
        $action = 'veryfi';
        $email = explode('/', $_SERVER['REQUEST_URI']);
        $email = base64_decode($email[1]); //расшифровываем наш email
    }
    $_SERVER['REQUEST_URI'];// в этой переменной хранится URL запроса после имени домена
    
    switch ($action) {
        case 'veryfi':
            /* Блок обработки входящего запроса.
               Обрабатываем здесь полученный $email и регистрируем открытие письма */
    
    // на всякий случай запрещаем кешировать изображение
            Header('Cache-Control: no-store,no-transform, no-cache, must-revalidate,proxy-revalidate, post-check=0, pre-check=0,max-age=2,s-maxage=2' );
            Header("Pragma: no-cache"); // для протокола HTTP/1.1
            Header("Last-Modified: " . gmdate("D, d M Y H:i:s") . "GMT");
            Header("Expires: " . date("r"));
            Header("Content-Type: image/gif");
            echo base64_decode('R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs='); //выводим email.gif
    
            break;
    }
    
    Теперь вы будете знать открывали ли ваше письмо.
    Источник

    P.S. Родственный модуль - Комментарии к заказу (в будущем может быть объединение функций)
     
    Последнее редактирование: 14 дек 2016
  2. Vlad

    Vlad Эксперт

    Сообщения:
    4.161
    Симпатии:
    1.013
    А что интересно )) Есть в опенкарте по умолчанию апи (да и без него можно) в этом изображении сформировать адрес для запроса, который будет менять статус заказа.

    Но думаю можно пока, в начале письма разместить ссылку, типа "подтвердите получения письма перейдя по ссылке, иначе мы вас задолбаем звонками и письмами ))"
     
  3. Chukcha

    Chukcha Специалист

    Сообщения:
    3.013
    Симпатии:
    687
    Самый простой путь :)

    Создать картинку-скрипт
    src="read-mail.php?letter_id=NNNNN"
    В котором отдавать картинку и апдейтить табличку прочитанных писем :)
     
  4. vikaharkov

    vikaharkov Продвинутый пользователь

    Сообщения:
    676
    Симпатии:
    71
    А теперь, если можно, на человеческом языке поясните пожалуйста чего и как.
    Правильно ли я понимаю - картинка-скрипт, это тоже самое, что картинка-гифка однопиксельная или это нечто другое?

    Мною проверено - прозрачная картинка вот с этого сервиса проходит все проверки почтовиками (яндексом и гмайлом) и работает. Но есть другие сервисы, картинки с которых не проходят такую проверку, они попадают на почте в спам или каким-то образом блокируются (тут доступная в понимании статья о почтовиках и, в частности, о работе Санитайзера, блокирующего скрипты)
     
  5. Chukcha

    Chukcha Специалист

    Сообщения:
    3.013
    Симпатии:
    687
    Вот приблизительный алгоритм - лень писать все

    Код:
    <img src="site.rua/?index=tool/read_mail&letter_id=NNNNN" />
    /tool/read-mail.php



    Ну да, перед отправкой письма где-то вставляем в табличку запись, чтобы получить NNNN
    Код:
    <?php
    if (isset(this->request->get['lletter_id']) {
    $this->db->query('UPDATE oc_readmail SET read=1 WHERE later_id = (int)his->request->get['lletter_id'])');
    header("Content-type:  image/png");
    readfile('MY_IMAGE.PNG');
    }
     
    Последнее редактирование: 14 дек 2016
    vikaharkov нравится это.
  6. vikaharkov

    vikaharkov Продвинутый пользователь

    Сообщения:
    676
    Симпатии:
    71
    А можно сначала без всякой автоматики попробовать проверить? Ну, в смысле, скажите:
    Вика, отэто вставь туда ...
    Создай то-то и то-то, и отправь для пробы своему знакомому клиенту.

    Я всё сделаю, шоб проверить чего надо в черновом варианте.

    P.S. да, и на счет лени... Та тут же нет обязов. Ну лень щас клаву тискать - ну и не надо, можно кино какое посмотреть вместо этого. А придёт вдохновение, так тогда сразу сюда, мыслю выдать в народ. :)
     
  7. Chukcha

    Chukcha Специалист

    Сообщения:
    3.013
    Симпатии:
    687
    А давайте-ка сама, а я за спиной постою, если что не так - указкой по рукам :)

    Вопрос первый

    Вы может вставить картинку в текст письма?
     
  8. vikaharkov

    vikaharkov Продвинутый пользователь

    Сообщения:
    676
    Симпатии:
    71
    Да, могу (если с почты Яндекса отправлять)
    А если с почты сайта - не знаю, не пробовала пока.

    P.S. Я вам и предлагаю за спиной постоять, треуголку одеть и подзорную трубу взять. Если чего не так - командуйте, всю черновую работу на меня грузите, а сами весь в белом - я не против, даже лавры наполеоновские вам отдам :(:)
     
  9. Chukcha

    Chukcha Специалист

    Сообщения:
    3.013
    Симпатии:
    687
    Вводная
    В каких местах вы отправляете письма?
    На какие письма вы хотите получать уведомления?
    Как вы формируете эти письма?
    Какой формат этих писем? html? plain?
     
  10. vikaharkov

    vikaharkov Продвинутый пользователь

    Сообщения:
    676
    Симпатии:
    71
    С сайта? Ну буду считать, что да, имеется ввиду с сайта...

    - Не отправляю, они автоматом отправляются, когда клиент заказа делает - к нему идёт уведомление и сама заказа.

    - Нет, ещё всё же отправляю - если клиент сверку делает со мной (или я с клиентом) или выяснение какое. Но то уже с почтовика мы переписываемся.

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

    Сказала уже - никак - Опенкарт их сам там как-то формирует (даже не вникала)

    Чего полегше спросите. Думаю html (но то я думаю шо думаю, а то машина формирует - две большие разницы - так шо не знаю)
     
  11. vikaharkov

    vikaharkov Продвинутый пользователь

    Сообщения:
    676
    Симпатии:
    71
    Вот, вспомнила - на рекламные, на рассылку о новых товарах.
    Щас пока не делаю, но ведь хочу!
     
  12. Chukcha

    Chukcha Специалист

    Сообщения:
    3.013
    Симпатии:
    687
    Ок.. Уровень понятен
    Внимание! открываются курсы по изучению ЙОпенКарт. Подписывайтесь на тему. Только здесь, только поздними зимними вечерами.

    Это вычеркиваем На данном этапе это за рамками курса :)

    Ну конечно автоматически. Но ваша сайт = Вы.
    Вы ведь хотите получать уведомления о прочтении письма.

    Ну.. Поехали (с)
    Создаем табличку для учета отправляемых писем
    Код:
                CREATE TABLE IF NOT EXISTS `'.DB_PREFIX.'letter` (
                  `letter_id` int(11) NOT NULL auto_increment,
                  `status` int(1) DEFAULT 0,
                  KEY `letter_id` (`letter_id`)
                ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin ;
    
    В каких местах отправляются письма..

    Основное место - catalog/model/checkout/order.php
    Там происходит отправка писем при создании письма

    вот оно!!!!
    Код:
    $mail->send();
    Но.. чуть выше видим
    Код:
                   $mail->setHtml($this->load->view('mail/order', $data));
                   $mail->setText($text);
    
    html - это говорит, что внутри письмо будет содержать html
    Text - это и есть то plain - (предназначается для самостоятельного изучения)

    Как видим шаблон письма вот ТУТ
    mail/order , что означает catalog/view/theme/YOUT_THEME/template/mail/order.tpl (на данный момент, в след версиях будет, скорее всего иначе)

    В шаблон передаются переменные , которые формируются ЧУТЬ выше
    Смотрите как заполняется массив $data

    И что в результате мы видим в шаблоне

    Например вот это
    Код:
    <p style="margin-top: 0px; margin-bottom: 20px;"><?php echo $text_footer; ?></p>

    А что в этом текст_футере?

    Код:
                    $data['text_footer'] = $language->get('text_new_footer');
    
    Но ведь мы можем ит нам нужно вставить свою картинку

    Та лекго
    Код:
    <p style="margin-top: 0px; margin-bottom: 20px;"><?php echo $text_footer; ?>
    <img src="<?php echo $my_image_url; ?>" alt="" />
    </p>
    Код:
                    $data['text_footer'] = $this->url->link('tool/read_mal', 'letter_id=' . $last_letter_id);
    
    Ой!!! Вы внимательно следите за моими словами/пальцами
    Все переменные есть?
    Это мы обсудим в следующем задании.
     
    Последнее редактирование: 14 дек 2016
    Ravilr, RoS и Romans нравится это.
  13. vikaharkov

    vikaharkov Продвинутый пользователь

    Сообщения:
    676
    Симпатии:
    71
    Не, ну лучше дурочкой прикинуться, чем Колобком скакать. :)
    Скажем так, я ваша чернорабочая, хоть и с почти двумя вышами, и несколькими сайтами за спиной (начинала с юКоза, потом MODX, сейчас ОК)
     
  14. vikaharkov

    vikaharkov Продвинутый пользователь

    Сообщения:
    676
    Симпатии:
    71
    Товарищь прохффесор, де табличку создаём?o_O
     
  15. Chukcha

    Chukcha Специалист

    Сообщения:
    3.013
    Симпатии:
    687
    В базе.
    Всеми доступными средствами
     
  16. vikaharkov

    vikaharkov Продвинутый пользователь

    Сообщения:
    676
    Симпатии:
    71
    Я не встретила уже знакомых и родных до боли буковок NNNNN, о которых вы писали в третьем и пятом сообщении... Они уже не нужны?
     
  17. vikaharkov

    vikaharkov Продвинутый пользователь

    Сообщения:
    676
    Симпатии:
    71
    А табличку - это обязательно? Меня пугает слово - "БАЗА".
    Один раз лазила туда, когда сайт глюканул. Почти рабочий сайт. Было страшно. Преодолела. Но осадок страха остался...
     
  18. Chukcha

    Chukcha Специалист

    Сообщения:
    3.013
    Симпатии:
    687
    Это был тест на внимательность!!!!
    Как это не нужны, еще как нужны..

    Смотреть самый последний кусок кода и последний вопрос.
     
  19. Chukcha

    Chukcha Специалист

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

    Не надо бояться

    Есть бекап. Нужно бекап
    Я привел пример СОЗДАНИЯ, а не удаления
     
  20. vikaharkov

    vikaharkov Продвинутый пользователь

    Сообщения:
    676
    Симпатии:
    71
    Ура! Перехетрила препода и прошла тест! :)