powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Сделать пьсьмо не прочитанным
8 сообщений из 8, страница 1 из 1
Сделать пьсьмо не прочитанным
    #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
Сделать пьсьмо не прочитанным
    #39414012
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JonnikИли как потом это письмо отметить как не прочитанное ?Вообще, в IMAP отметка о прочтении - это флаг \Seen. Убрать его можно, чтоб отметить непрочитанным (команда STORE, если не ошибаюсь).

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

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

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

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

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


JonnikНе лишнее. Этот параметр используется когда надо получить список только непрочитанных писем.Не угадал, значит. Предполагал, что setSeen - это "отметить как прочитанное".
...
Рейтинг: 0 / 0
Сделать пьсьмо не прочитанным
    #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
Сделать пьсьмо не прочитанным
    #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
Сделать пьсьмо не прочитанным
    #39414847
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JonnikПосле полученияСдается мне, заклинание "keepUnseen()" нужно сказать до начала работы с письмом, а не после. Собственно, в примере именно так и показано. Дословно имя метода можно перевести как "оставить непрочитанным" или "сохранить непрочитанным", или, иначе говоря, "не ставить отметку о прочтении". Но никак не "отметить как непрочитанное", которое в классе может быть чем-то вроде setUnseen().
...
Рейтинг: 0 / 0
Сделать пьсьмо не прочитанным
    #39415828
carrotik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jonnik,

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


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