Как скачать все письма с помощью FETCH по IMAP используя pycurl

Я пытаюсь получить все письма в директории IMAP с помощью pycurl.

К примеру таким образом я получаю список директорий:

import pycurl
import certifi

with open('mail.txt', 'wb') as f:
    c = pycurl.Curl()
    c.setopt(pycurl.CAINFO, certifi.where())
    c.setopt(c.URL, 'imaps://imap.example.com/')
    c.setopt(c.USERPWD, '[email protected]:password')
    c.setopt(c.WRITEDATA, f)
    c.perform()
    c.close()

Далее, мне необходимо получить все письма каждой дериктории. Это делается, с помощью команды FETCH 1:* С помощью curl команда которая мне нужна выглядит следующим образом:

curl imaps://imap.example.com/ --user "[email protected]:password" -X "FETCH 1:* (BODY[TEXT])" --ssl --verbose

Насколько я понял, то параметр -X в pycurl это POSTFIELDS

Получается, что запрос вышенаписанной мною команды с помощью pycurl будет выглядеть так:

with open('mail.txt', 'wb') as f:
    c = pycurl.Curl()
    c.setopt(pycurl.CAINFO, certifi.where())
    c.setopt(c.URL, 'imaps://imap.example.com/INBOX')
    c.setopt(c.USERPWD, '[email protected]:password')
    c.setopt(c.POSTFIELDS, 'FETCH 1:* (BODY[TEXT])')
    c.setopt(c.WRITEDATA, f)
    c.perform()
    c.close()

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


Ответы (1 шт):

Автор решения: Roman Isakov

Нашел ответ на собственный вопрос. Согласно документации по libcurl API, параметр -X это не POSTFIELDS а CUSTOMREQUEST https://curl.haxx.se/libcurl/c/curl_easy_setopt.html

То есть конечный код будет выглядеть так:

with open('mail.txt', 'wb') as f:
    c = pycurl.Curl()
    c.setopt(pycurl.CAINFO, certifi.where())
    c.setopt(c.URL, 'imaps://imap.example.com/INBOX')
    c.setopt(c.USERPWD, '[email protected]:password')
    c.setopt(c.CUSTOMREQUEST, 'FETCH 1:* (BODY[TEXT])')
    c.setopt(c.WRITEDATA, f)
    c.perform()
    c.close()

Другое дело, что curl возвращает только заголовки писем. Само тело писем он возвращает, только при включенном c.setopt(c.VERBOSE, 1) И то, не пишет в файл, а просто принтит в терминал

→ Ссылка