Flush INBOX via IMAP


This is a simple script I wrote a while back to delete all emails in given IMAP inbox folder.

If I were you, I would treat it as a proof of concept (inspiration), not as a battle-tested solution.

Also available in plaintext.

#!/usr/bin/ruby

require 'net/imap'

# Simple script to delete all emails in given IMAP inbox folder
# * Supports multiple accounts
# * Supports ssl connect (provided you have 'openssl' extension)
# * Supports quiet/verbose operation
# * Configurable 'confirm' delay
#
# Author: Wejn (wejn at box dot cz)
# License: GPL version 2.0, no latter

# accounts to flush
accts = [
    ['imap.server1.tld', 'acct1', 'pass1', :ssl],
    ['imap.server2.tld', 'acct2', 'pass2', :normal],
]

# handle verbose flags
$VERBOSE = true unless (ARGV & %w[-v --verbose]).empty?

# delay for 3 secs to give user a chance to kill it via ^C
unless (ARGV & %w'-c --confirm').empty?
    begin
        $stdout.sync = true
        print "Flushing imap(s) in: "
        3.downto(1) { |i| print "#{i}, "; sleep(1) }
        puts "0."
    rescue Interrupt
        puts "cancelled."
        exit 1
    end
end

# now for the real work
for srv, login, pass, ssl in accts
    ssl = [true, :ssl, :SSL, "ssl", "SSL"].include?(ssl)

    puts "+ Connect: #{srv} (#{ssl ? '' : '!'}ssl) / #{login} ..." if $VERBOSE

    imap = if ssl
        Net::IMAP.new(srv, 993, true)
    else
        Net::IMAP.new(srv)
    end

    imap.authenticate('LOGIN', login, pass)

    imap.select('INBOX')
    wtd = false

    imap.search(["ALL"]).each do |msg_id|
        puts "Deleting: #{msg_id} ..." if $VERBOSE
        imap.store(msg_id, "+FLAGS", [:Deleted])
        wtd = true
    end

    if wtd
        puts "+ Expunge ..." if $VERBOSE
        imap.expunge
    else
        puts "- No messages." if $VERBOSE
    end

    puts "+ Logout." if $VERBOSE
    imap.logout
    puts if $VERBOSE
end