Гость
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Сделать пьсьмо не прочитанным / 8 сообщений из 8, страница 1 из 1
03.03.2017, 13:39
    #39413651
Jonnik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сделать пьсьмо не прочитанным
Добрый день.
Я с помощью ddeboer/imap получаю все входящие письма с gmail. Все письма сохраняются в базу с их вложениями.
Так вот у писем в которых есть вложение ставится флаг о том, что письмо прочитано. Видимо когда я получаю вложение письма если оно есть, то письмо становится прочитанным. Если у письма нет вложения, то оно остается не прочитанным.
Письма я получаю с учетом того, что они не должны быть отмечены прочитанными.

Вопрос в том как получить вложения, что бы письмо не оказалось потом прочитанным. Или как потом это письмо отметить как не прочитанное ?

Вот сам код

Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
require_once __DIR__.'/vendor/autoload.php';
require_once __DIR__.'/config.php';

$accounts = file(
    __DIR__.'/accounts.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES
);


foreach ($accounts as $account) {
    list($provider, $name, $password, $date, $seen) = explode(';', $account);

    Stats::printPrimaryInfo($name);
    $database = new Database(DB_HOST, DB_NAME, DB_USER, DB_PASS);

    $producer = new GmailProvider($name, $password);
    $producer->setDate($date)->setSeen($seen);
	
	//$database->DeleteDBTable();
	$id_check_email = $database->insert_check_email($provider, 1);
	
    //get inbox message
    foreach ($producer->getMessageList('INBOX') as $message) {
        $mid = str_replace(['<', '>'], '', $message->getId());
        if (!$database->isMessageExist($provider, $mid)) {
            $type = 'inbox';
           // $provider = 'gmail';         
			$subject = empty($message->getSubject()) ? 'Без темы' : $message->getSubject();
            $date = $message->getDate()->format('Y-m-d H:i:s');
            $sender = $message->getFrom()->getAddress();
	    $recipient = empty($message->getTo()[0]) ? $recipient = $provider : $message->getTo()[0]->getAddress();			
            $body_text = strip_tags($message->getBodyText());
            $body_html = empty($message->getBodyHtml()) ? $message->getBodyText() : $message->getBodyHtml();
            //insert new message in to database
            $id = $database->insertMessage(
                [$type, $provider, $mid, $subject, $date, $sender, $recipient, $body_text, $body_html]
            );

            //download attachments and save in to database
            $check_name_company = false;
	    $name_company = "";
	    $attachments = $message->getAttachments();
            foreach ($attachments as $attachment) {
                if ($filename = $attachment->getFilename()) {
                    
			$filename = str_replace(['?'], '_', $filename);
			if ($check_name_company == false) 
			{	
				$name_company = $database->get_name_company_to_email($sender);
				$check_name_company = true;
			}
		    $dt = new DateTime($date);
                    $date = $dt->format('Y/m/d');
                    $path_filename = __DIR__."/attachments/{$provider}/{$type}/{$sender}/{$date}/{$mid}/{$filename}";
                    if (!is_dir(dirname($path_filename))) {
                        mkdir(dirname($path_filename), 0775, true);
                    }
                    file_put_contents(
                        mb_convert_encoding($path_filename, "Windows-1251", "UTF-8"), $attachment->getDecodedContent()
                    );
                    //insert new attachment in to database
                    $database->insertAttachment($id, $filename, $path_filename);
					
					
		    $path_parts = pathinfo($filename);
		    $ext_file = mb_convert_case($path_parts['extension'], MB_CASE_LOWER, "UTF-8");
		    if (($name_company != "") && (($ext_file == "xls") || ($ext_file == "xlsx") || ($ext_file == "ods")))
			{
			$new_filename = $database->get_name_file_company($name_company);
			if ($new_filename != "") {$path_filename = __DIR__."/Setki/".$new_filename.".".$ext_file;}
			else 
			{$path_filename = __DIR__."/Setki/!".$name_company."_".$filename;}	
			//Stats::printInfo("--", $new_filename, "--");
						
			if (!is_dir(dirname($path_filename))) { mkdir(dirname($path_filename), 0775, true); }
              
						
			file_put_contents(mb_convert_encoding($path_filename, "Windows-1251", "UTF-8"), $attachment->getDecodedContent());
						
											
					}	
                }
            }

            Stats::printInfo($sender, $subject, $date);
        }
    } 
	
	$database->update_check_email($id_check_email);



А это источник
...
Рейтинг: 0 / 0
04.03.2017, 05:56
    #39414012
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сделать пьсьмо не прочитанным
JonnikИли как потом это письмо отметить как не прочитанное ?Вообще, в IMAP отметка о прочтении - это флаг \Seen. Убрать его можно, чтоб отметить непрочитанным (команда STORE, если не ошибаюсь).

В коде вот этоавтор
Код: php
1.
$producer->setDate($date)->setSeen($seen);

не лишнее?
...
Рейтинг: 0 / 0
05.03.2017, 20:40
    #39414382
Jonnik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сделать пьсьмо не прочитанным
vkleJonnikИли как потом это письмо отметить как не прочитанное ?Вообще, в IMAP отметка о прочтении - это флаг \Seen. Убрать его можно, чтоб отметить непрочитанным (команда STORE, если не ошибаюсь).

В коде вот этоавтор
Код: php
1.
$producer->setDate($date)->setSeen($seen);

не лишнее?
Не лишнее. Этот параметр используется когда надо получить список только непрочитанных писем.

А не подскажите куда эту команду STORE вставлять и как использовать? В инете вообще ничего не нашел.
...
Рейтинг: 0 / 0
05.03.2017, 21:13
    #39414391
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сделать пьсьмо не прочитанным
JonnikА не подскажите куда эту команду STORE вставлять и как использовать?Это команда протокола IMAP. Описание протокола есть в инете. Возможно, интерфейс команды реализован где-то в классе GmailProvider, посмотрите, что там внутри.


JonnikНе лишнее. Этот параметр используется когда надо получить список только непрочитанных писем.Не угадал, значит. Предполагал, что setSeen - это "отметить как прочитанное".
...
Рейтинг: 0 / 0
06.03.2017, 02:09
    #39414441
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сделать пьсьмо не прочитанным
JonnikЯ с помощью ddeboer/imap получаю все входящие письмаЗаглянул по ссылке. Не оно?

https://packagist.org/packages/ddeboer/imap Reading the message body marks the message as seen. If you want to keep the message unseen:

$message-> keepUnseen ()->getBodyHtml();
...
Рейтинг: 0 / 0
06.03.2017, 15:29
    #39414806
Jonnik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сделать пьсьмо не прочитанным
vkleJonnikЯ с помощью ddeboer/imap получаю все входящие письмаЗаглянул по ссылке. Не оно?

https://packagist.org/packages/ddeboer/imap Reading the message body marks the message as seen. If you want to keep the message unseen:

$message-> keepUnseen ()->getBodyHtml();

Да я тоже такое нашел.
Но дело в том, что он и сейчас у меня не делает письма прочитанными, если в них только только текст. Он делает письмо прочитанным когда получает вложенные файлы. Проблема в этом.
Написать просто
Код: php
1.
 $message->keepUnseen()->getBodyHtml(); 


После получения файлов результата не дает. Письмо все равно остается прочитанным.
...
Рейтинг: 0 / 0
06.03.2017, 16:11
    #39414847
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сделать пьсьмо не прочитанным
JonnikПосле полученияСдается мне, заклинание "keepUnseen()" нужно сказать до начала работы с письмом, а не после. Собственно, в примере именно так и показано. Дословно имя метода можно перевести как "оставить непрочитанным" или "сохранить непрочитанным", или, иначе говоря, "не ставить отметку о прочтении". Но никак не "отметить как непрочитанное", которое в классе может быть чем-то вроде setUnseen().
...
Рейтинг: 0 / 0
08.03.2017, 13:57
    #39415828
carrotik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сделать пьсьмо не прочитанным
Jonnik,

.. если бы был доступ к внутренностям библиотеки (или это в самом php5-imap ?), то можно было бы при выборе почтового ящика (getMailbox) использовать вместо SELECT команду EXAMINE, которая устанавливает режим READ-ONLY для почтового ящика .. Но как до этого добраться - не знаю (я писал IMAP-клиента, но не на РНР) ...
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Сделать пьсьмо не прочитанным / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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