Я искал, но похоже, что синтаксис изменился с тех пор, как были опубликованы сообщения, которые я нашел. Я пытаюсь найти электронные письма с нескольких адресов. Это работает:
UIDs = conn.search([
['FROM','[email protected]'],
[u'SINCE', datetime.date(2022, 3, 6)],
])
Я надеялся на что-то вроде этого:
UIDs = conn.search([
'OR'[
['FROM','[email protected]'],['FROM','[email protected]']
],
[u'SINCE', datetime.date(2022, 3, 6)],
])
Но я не могу найти какой-либо вариант ИЛИ, который работает. Я попробовал пример из «Автоматизировать скучные вещи», и он рекомендует это:
imapObj.search(['OR FROM [email protected] FROM [email protected]']
Это тоже не работает для меня. Я проверил страницу imapclient и не нашел там ответа: https://imapclient.readthedocs.io/en/master/index.html
Любое руководство будет оценено!
@Max Я пробовал это: UIDs=conn.search(['OR (FROM [email protected]) (FROM [email protected])']) и выдает следующую ошибку: Эта ошибка могла быть вызвана синтаксической ошибкой в критериях: ['ИЛИ (ОТ [email protected]) (ОТ [email protected])'] Пожалуйста, обратитесь к документации для получения дополнительной информации о синтаксисе критериев поиска. imapclient.readthedocs.io/en/master/… Я использую Python 3.8.8, imapclient 2.2.0, pyzmail 1.0.4, подключаюсь к imap.gmail.com
Почему вы используете [ ]? Это часть imapclient? Просто отправьте необработанную строку, в том числе с кавычками. conn.search('OR (FROM "[email protected]") (FROM "[email protected]")'. (Обновление: Ах, я вижу, imapclient использует синтаксис, немного отличающийся от imaplib, если вы передаете необработанную строку, она будет использовать ее необработанно. Я бы попробовал это)
@Max Кажется, это часть синтаксиса: messages = server.search(['FROM', '[email protected]']), из библиотечная документация. Если я использую ваш метод, я получаю следующую ошибку:<br> ConnectionAbortedError: [WinError 10053] Установленное соединение было прервано программным обеспечением на вашем хост-компьютере. К сожалению, я не могу вставить сюда полную ошибку, но может показаться, что это просто невозможно на основе ответа об ошибке.
It is also possible (but not recommended) to pass the combined criteria as a single string. In this case IMAPClient won’t perform quoting, allowing lower-level specification of criteria. Хотя вам лучше убедиться, что все ваши скобки и тому подобное совпадают!
@Макс, ты легенда. Это сработало: searchstring='OR (FROM "[email protected]") (FROM "[email protected]")' UIDs=conn.search(searchstring) Кажется глупым обходным путем, но я так рад, что он работает! Примечание: что такое этикет - я разрешаю вам опубликовать ответ, а затем голосую?
ну конечно. Я не совсем уверен, как правильно это сделать, но я могу дать свой обходной путь в качестве ответа. Рад, что это помогло.






Я не знаком с библиотекой imapclient, но вижу, что API позволяет отправлять необработанные строки, поэтому, если он отправляет не совсем то, что вы хотите, вы можете переопределить его.
Это должно сделать это за вас, сделав его максимально однозначным:
conn.search('OR (FROM "[email protected]") (FROM "[email protected]")')
OR FROM [email protected] FROM [email protected]- правильный синтаксис. Для уверенности можно попробоватьOR (FROM "[email protected]") (FROM "[email protected]"). Однако вполне возможно, что программное обеспечение вашего сервера на самом деле не поддерживает должным образом язык поиска IMAP. Какой сервер вы используете?