Как стать автором
Обновить

Большие письма в Gmail

Время на прочтение3 мин
Количество просмотров2.5K
Как вы знаете, Gmail не позволяет сортировать письма, в частности по размеру.
Есть сервис, который помечает большие письма меткой — www.findbigmail.com, но не все хотят давать не понятно кому свой пароль.

Я написал скрипт (на груви ), который создаёт метку «Big Mail» и маркирует ей все письма размером больше чем 4Мб. В скрипте надо заменить имя юзера и пароль в Gmail, а также, если хотите, размер «больших» мейлов.

Для работы скрипта в classpath должны быть jars отсюда.

Итерация по сообщениям медленная (1-2 в секунду), так что я поставил печать номера просматриваемого письма, чтобы вы знали, что скрипт не застрял.
Забрать все сообщения даже при моём количестве (ок 20000) занимает мало времени. Но при обращении к аттрибутам сообщения (getSize()) Message пойдет на сервер.
Можно настроить это на Pre Fetch, тогда общее время может уменьшиться, но вырастет (и серьезно) время получения списка сообщений (т.е. будете ждать не зная жив ли он вообще)

Еще интересный момент: copyMessages() в применении к Gmail ничего не копирует или переносит, а просто добавляет метку.

Сообщения я помечаю по одному, так, чтобы не получилось, что скрипт упал (например потому что упала сеть) и ничего не сделал.

Вообще есть куда улучшать — интерактивно спрашивать имя и пароль, не помечать те, которые уже помечены и т.д. Кому нужно — допилит :)

Не забудьте сделать IMAP — enable в Settings Гмаила.



// Mark large email messages in Gmail by "Bim Mail" label.
// (c) Pavel :)
// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY

import java.security.NoSuchProviderException
import javax.mail.*

final int BIG_MAIL_SIZE = ** 22 //4Mb
final String username = "xxx"
final String password = "xxx"

Properties props = System.getProperties()
props.setProperty("mail.store.protocol""imaps")
props.setProperty("mail.imap.socketFactory.class""javax.net.ssl.SSLSocketFactory")
props.setProperty("mail.imap.socketFactory.fallback""false")


Folder all, big
Store store

try {
  Session session = Session.getDefaultInstance(props, null)
  store = session.getStore("imaps")
  final String mailaddress = "$username@gmail.com"



  store.connect("imap.gmail.com", mailaddress, password)
  def folderName = "[Gmail]/All Mail"
  all = store.getFolder(folderName)
  all.open(Folder.READ_WRITE);

  println("Creating BigMail ...")
  big = store.getFolder("BigMail")
  if (big.create(Folder.HOLDS_MESSAGES))
    println "Ok."
  else
    println "Failure. Already exists?"

  big.open(Folder.READ_WRITE);

  println "Downloading from folder $folderName ...."
  List<Message> messages = all.getMessages()
  println "Got ${messages.size()} messages"


  int count = 0
  messages.each {
    int size = it.getSize();

    if (size > BIG_MAIL_SIZE) {
      println "$count: Big mail: ${it.getSubject()} (${it.getSize()})"
      all.copyMessages([it].toArray(new Message[1]), big)

    }
    else {
      println count
    }
    count++

  }


catch (NoSuchProviderException e) {
  e.printStackTrace();
  System.exit(1);
catch (MessagingException e) {
  e.printStackTrace();
  System.exit(2);
}
finally {
  // Close connection
  all.close(false)
  big.close(false)
  store.close()
}


Java2html




Теги:
Хабы:
+28
Комментарии27

Публикации

Изменить настройки темы

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн