2016-09-15 3 views
1

Я создаю приложение для перемещения сообщений во входящих почтовых ящиках. В настоящее время я использую API Gmail для этого, но я заметил, что выполнение запросов к API заметно медленнее, чем использование IMAP.Сообщения API Gmail.modify 40x медленнее, чем IMAP?

Метод прост: я отправляю пакет запросов на изменение для изменения меток в группе писем, чтобы их перемещать. Пропускная способность моего сообщения с использованием API Gmail составляет 3,3 сообщения в секунду. Для сравнения, пропускная способность IMAP составляет 130 сообщений в секунду.

Вот как я в настоящее время с помощью BatchHttpRequests:

batch = BatchHttpRequest() 
for gmailId in gmailIds: 
    batch.add(self.service.users().messages().modify(userId=self.user.email, id=gmailId, body=labels)) 
try: 
    batch.execute() 
except errors.HttpError, error: 
    log_this_error(self.user.email, error.resp.status) 

и вот мой IMAP код, который выполняет ту же задачу:

# imap_conn is the user's authed connection 
status, count = imap_conn.select(oldMailboxLabel) 
if status == "OK": 
    count = int(count[0]) 
    if count > 0: 
     messageNumbers = range(1, count + 1) 
     messageNumbers = ",".join(map(str, messageNumbers)) 
     imap_conn.copy(messageNumbers, newMailboxLabel) 
     imap_conn.close() 
     imap_conn.delete(oldMailboxLabel) 
    else: 
     imap_conn.close() 
else: 
    count = 0 

Я уже пакетирование и сжатие моих запросов, и Я попытался использовать поля, чтобы ограничить объем возвращаемой информации. Все это предлагается на их странице performance tips. Я изо всех сил пытаюсь понять, почему запросы так долго заканчиваются. Любые предложения будут ценны!

+0

Не могли бы вы показать свой код IMAP для сравнения? Кроме того, на каком языке вы пишете? Похоже, это может быть Python? – Schwern

+2

Привет @Schwern, я добавил код IMAP для сравнения. И да, я пишу на Python - мой плохой, если это было непонятно раньше! Мне очень странно, что IMAP имеет лучшую пропускную способность сообщений, чем API Gmail – frankjames

ответ

0

Чтение через API GMail, похоже, вы делаете это «правильно». Я собираюсь догадаться, что, поскольку GMail сам по себе является почтовым клиентом, GMail API предназначен для написания игрушечных почтовых клиентов, тогда как IMAP лучше разработан для эффективной работы полнофункционального почтового клиента.

Если вы перемещаете каждые сообщение со старой этикетки на новую этикетку, возможно, вместо этого rename the label using Users.labels.update?

Если нет, вы можете уменьшить количество запросов, выполнив команду by thread вместо сообщения.

Или просто используйте IMAP.

Смежные вопросы