0

This question has been replicated under suggestion from this one at StackOverflow, as long as it is a programming issue, but seems to depend on Linux tools. I will post the link to the solution (if found) on both places.

I don't know much about IMAP mail, since I have always used POP3. But deleting emails from the POP3 mail server was possible by using tools included on Windows eMail clients like The Bat!.

But now on my job I have a new IMAP account with a stupid problem: sometimes emails from outside my domain (the @myenterprise.com part) do not arrive, and would like to script some method to detect it.

Just a simple shell script (Linux is highly preferred for me on scripting) that sends periodical emails from an external account and checks for the correct arrival of them would be enough, but if I schedule it to run once each hour... well, after a few days I will have lots of Subject:Test emails on trash. So the solution would be to delete them from IMAP server after the checks.

How can I delete specific emails from my IMAP server from Linux shell in a scriptable manner?

Bash shell preferred, if solutions are specific.

  • What email client are you using? Creative filter rules and auto-delete rules may work for you. Also, remember email isn't designed to be instant, and it is designed for "best effort" delivery. I've had mails arrive a few weeks after they were sent. – ivanivan May 01 '18 at 00:01
  • @ivanivan , why should the email client be relevant here? The shell script must do its work whatever program the users install as an email client. It is even possible that different stations could use different email clients. – Sopalajo de Arrierez May 01 '18 at 00:49
  • Because as I said creative filtering in the client could take care of the issue for you. But since this is multiple users, multiple clients, etc. that won't work. Instead I'll ask - is the server storing in mbox format or maildir format? I'm now assuming that you'll be running this on the server via shell access.... if I'm wrong, feel free to ignore – ivanivan May 01 '18 at 00:52
  • No, @ivanivan , I have no direct shell access to the IMAP server, just the config data and the password that I use on the client program for downloading/sending mails. I was rather thinking about a remote tool for the job. – Sopalajo de Arrierez May 01 '18 at 01:50

1 Answers1

2

I would go for a Python script. The following script asks for the IMAP-Server, a username and password and subject string. It then lists all mails where the subject contains the given subject string.

Comment in the line imapserver.store(num, '+FLAGS', '\Deleted') when you are satisfied with the behavior. The shown mails will then be flagged for deletion.

#!/usr/bin/python3

import getpass

def del_imap(server, port, login, password, search):
    import imaplib, email

    # NOTE: According to RFC 1730 the SEARCH commands searches for 'messages that
    # CONTAIN the specified string. When multiple keys are specified, the result
    # is the intersection (AND function) of all the messages that match those
    # keys.
    # _search_command = '(FROM ' + search + ')'
    # _search_command = '(SUBJECT "testmail" FROM ' + search + ')'
    _search_command = '(SUBJECT ' + search + ')'

    imapserver = imaplib.IMAP4_SSL(server, port)
    imapserver.login(login, password)
    imapserver.select()

    typ, data = imapserver.search(None, _search_command)
    for num in data[0].split():
        typ, data = imapserver.fetch(num, '(RFC822.HEADER)')
        print (data[0][1].decode())
        # Uncomment the following line if the listed files should also be
        # flagged for deletion
        # imapserver.store(num, '+FLAGS', '\\Deleted')
    imapserver.close()
    imapserver.logout()

del_imap(input("IMAP Server: "), 993, input("Username: "), getpass.getpass(), input("Search: "))

I also created a Github-Gist where further improvements will be made: https://gist.github.com/jkirk/39dc64747a9d78accde49de2e8dbdc6d

dpat
  • 322
  • Could you please expand with some usage examples? Some more details about what data should be changed for each specific configuration could be a good idea too. – Sopalajo de Arrierez May 01 '18 at 00:46
  • I've tried to improve my answer. The Python3 script can be used as is. It will show all mails which where the subject contains the given subject string (i.e. "testmail").

    If you want to delete the shown mails, just comment in the mentioned line.

    – dpat May 01 '18 at 10:41
  • Is this method supposed to delete the shown mails, or just move them to the Thrash mailbox? – Sopalajo de Arrierez May 01 '18 at 15:14
  • @SopalajodeArrierez: the mails should be deleted. If you want to move them to the trash you have to use a the move function. – dpat May 03 '18 at 12:24
  • @SopalajodeArrierez: actually you have to add the copy function before deletion. – dpat May 03 '18 at 12:32