Skip to content

Email Gathering with Fetchmail

To enable the fetchmail service to retrieve e-mails, set the environment variable ENABLE_FETCHMAIL to 1. Your compose.yaml file should look like following snippet:

environment:
  - ENABLE_FETCHMAIL=1
  - FETCHMAIL_POLL=300

Generate a file called fetchmail.cf and place it in the docker-data/dms/config/ folder. Your DMS folder should look like this example:

├── docker-data/dms/config
│   ├── dovecot.cf
│   ├── fetchmail.cf
│   ├── postfix-accounts.cf
│   └── postfix-virtual.cf
└── compose.yaml

Configuration

Configuration options for fetchmail.cf are covered at the official fetchmail docs (see the section "The run control file" and the table with "keyword" column for all settings).

Basic fetchmail.cf configuration

Retrieve mail from remote-user@somewhere.com and deliver it to dms-user@example.com:

poll 'mail.somewhere.com'
proto imap
user 'remote-user'
pass 'secret'
is 'dms-user@example.com'
  • poll sets the remote mail server to connect to retrieve mail from.
  • proto lets you connect via IMAP or POP3.
  • user and pass provide the login credentials for the remote mail service account to access.
  • is configures where the fetched mail will be sent to (eg: your local DMS account in docker-data/dms/config/postfix-accounts.cf).

proto imap will still delete remote mail once fetched

This is due to a separate default setting no keep. Adding the setting keep to your config on a new line will prevent deleting the remote copy.

Multiple users or remote servers

The official docs config examples show a common convention to indent settings on subsequent lines for visually grouping per server.

poll 'mail.somewhere.com' proto imap
  user 'john.doe' pass 'secret' is 'johnny@example.com'
  user 'jane.doe' pass 'secret' is 'jane@example.com'

poll 'mail.somewhere-else.com' proto pop3
  user 'john.doe@somewhere-else.com' pass 'secret' is 'johnny@example.com'
  • # for adding comments.
  • The config file may include "noise" keywords to improve readability.
# Retrieve mail for users `john.doe` and `jane.doe` via IMAP at this remote mail server:
poll 'mail.somewhere.com' with proto imap wants:
  user 'john.doe' with pass 'secret', is 'johnny@example.com' here
  user 'jane.doe' with pass 'secret', is 'jane@example.com' here

# Also retrieve mail from this mail server (but via POP3).
# NOTE: This could also be all on a single line, or with each key + value as a separate line.
# Notice how the remote username includes a full email address,
# Some mail servers like DMS use the full email address as the username:
poll 'mail.somewhere-else.com' with proto pop3 wants:
  user 'john.doe@somewhere-else.com' with pass 'secret', is 'johnny@example.com' here

FETCHMAIL_POLL ENV: Override default polling interval

By default the fetchmail service will check every 5 minutes for new mail at the configured mail accounts.

environment:
  # The fetchmail polling interval in seconds:
  FETCHMAIL_POLL: 60

Debugging

To debug your fetchmail.cf configuration run this setup debug command:

docker exec -it dms-container-name setup debug fetchmail
Sample output of setup debug fetchmail
fetchmail: 6.3.26 querying outlook.office365.com (protocol POP3) at Mon Aug 29 22:11:09 2016: poll started
Trying to connect to 132.245.48.18/995...connected.
fetchmail: Server certificate:
fetchmail: Issuer Organization: Microsoft Corporation
fetchmail: Issuer CommonName: Microsoft IT SSL SHA2
fetchmail: Subject CommonName: outlook.com
fetchmail: Subject Alternative Name: outlook.com
fetchmail: Subject Alternative Name: *.outlook.com
fetchmail: Subject Alternative Name: office365.com
fetchmail: Subject Alternative Name: *.office365.com
fetchmail: Subject Alternative Name: *.live.com
fetchmail: Subject Alternative Name: *.internal.outlook.com
fetchmail: Subject Alternative Name: *.outlook.office365.com
fetchmail: Subject Alternative Name: outlook.office.com
fetchmail: Subject Alternative Name: attachment.outlook.office.net
fetchmail: Subject Alternative Name: attachment.outlook.officeppe.net
fetchmail: Subject Alternative Name: *.office.com
fetchmail: outlook.office365.com key fingerprint: 3A:A4:58:42:56:CD:BD:11:19:5B:CF:1E:85:16:8E:4D
fetchmail: POP3< +OK The Microsoft Exchange POP3 service is ready. [SABFADEAUABSADAAMQBDAEEAMAAwADAANwAuAGUAdQByAHAAcgBkADAAMQAuAHAAcgBvAGQALgBlAHgAYwBoAGEAbgBnAGUAbABhAGIAcwAuAGMAbwBtAA==]
fetchmail: POP3> CAPA
fetchmail: POP3< +OK
fetchmail: POP3< TOP
fetchmail: POP3< UIDL
fetchmail: POP3< SASL PLAIN
fetchmail: POP3< USER
fetchmail: POP3< .
fetchmail: POP3> USER user1@outlook.com
fetchmail: POP3< +OK
fetchmail: POP3> PASS *
fetchmail: POP3< +OK User successfully logged on.
fetchmail: POP3> STAT
fetchmail: POP3< +OK 0 0
fetchmail: No mail for user1@outlook.com at outlook.office365.com
fetchmail: POP3> QUIT
fetchmail: POP3< +OK Microsoft Exchange Server 2016 POP3 server signing off.
fetchmail: 6.3.26 querying outlook.office365.com (protocol POP3) at Mon Aug 29 22:11:11 2016: poll completed
fetchmail: normal termination, status 1

Troubleshoot with this reference compose.yaml

A minimal compose.yaml example demonstrates how to run two instances of DMS locally, with one instance configured with fetchmail.cf and the other to simulate a remote mail server to fetch from.