Downloading email from mail server - HOW TO?

Fedora Core 6
Webmin version 1.334
Virtualmin version 3.37
Postfix version 2.3.3

I just did a fresh install of Fedora Core 6 and Virtualmin Pro. Created a new virtual server. Running the server from home with a static IP from my ISP.

eth0 uses 10.1.1.9
mydomain.com points to 10.1.1.9
mail.mydomain.com points to 10.1.1.9

Using Usermin to send and receive emails work OK. However, when I use Outlook Express or Thunderbird to download email from mail server, I get error message: "Could not connect to server mail.mydomain.com; the connection was refused".

Does anyone know why and how I can resolve this?

Is it something I need to do to the Postfix config file?

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Postfix Config File (main.cf)

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Global Postfix configuration file. This file lists only a subset

of all parameters. For the syntax, and for a complete parameter

list, see the postconf(5) manual page (command: "man 5 postconf").

For common configuration examples, see BASIC_CONFIGURATION_README

and STANDARD_CONFIGURATION_README. To find these documents, use

the command "postconf html_directory readme_directory", or go to

http://www.postfix.org/.

For best results, change no more than 2-3 parameters at a time,

and test if Postfix still works after every change.

SOFT BOUNCE

The soft_bounce parameter provides a limited safety net for

testing. When soft_bounce is enabled, mail will remain queued that

would otherwise bounce. This parameter disables locally-generated

bounces, and prevents the SMTP server from rejecting mail permanently

(by changing 5xx replies into 4xx replies). However, soft_bounce

is no cure for address rewriting mistakes or mail routing mistakes.

#soft_bounce = no

LOCAL PATHNAME INFORMATION

The queue_directory specifies the location of the Postfix queue.

This is also the root directory of Postfix daemons that run chrooted.

See the files in examples/chroot-setup for setting up Postfix chroot

environments on different UNIX systems.

The command_directory parameter specifies the location of all

postXXX commands.

command_directory = /usr/sbin

The daemon_directory parameter specifies the location of all Postfix

daemon programs (i.e. programs listed in the master.cf file). This

directory must be owned by root.

daemon_directory = /usr/libexec/postfix

QUEUE AND PROCESS OWNERSHIP

The mail_owner parameter specifies the owner of the Postfix queue

and of most Postfix daemon processes. Specify the name of a user

account THAT DOES NOT SHARE ITS USER OR GROUP ID WITH OTHER ACCOUNTS

AND THAT OWNS NO OTHER FILES OR PROCESSES ON THE SYSTEM. In

particular, don’t specify nobody or daemon. PLEASE USE A DEDICATED

USER.

The default_privs parameter specifies the default rights used by

the local delivery agent for delivery to external file or command.

These rights are used in the absence of a recipient user context.

DO NOT SPECIFY A PRIVILEGED USER OR THE POSTFIX OWNER.

#default_privs = nobody

INTERNET HOST AND DOMAIN NAMES

The myhostname parameter specifies the internet hostname of this

mail system. The default is to use the fully-qualified domain name

from gethostname(). $myhostname is used as a default value for many

other configuration parameters.

#myhostname = host.domain.tld
#myhostname = virtual.domain.tld
myhostname = www.mydomain.tld

The mydomain parameter specifies the local internet domain name.

The default is to use $myhostname minus the first component.

$mydomain is used as a default value for many other configuration

parameters.

#mydomain = domain.tld

SENDING MAIL

The myorigin parameter specifies the domain that locally-posted

mail appears to come from. The default is to append $myhostname,

which is fine for small sites. If you run a domain with multiple

machines, you should (1) change this to $mydomain and (2) set up

a domain-wide alias database that aliases each user to

user@that.users.mailhost.

For the sake of consistency between sender and recipient addresses,

myorigin also specifies the default domain name that is appended

to recipient addresses that have no @domain part.

#myorigin = $myhostname
#myorigin = $mydomain
myorigin = $mydomain

RECEIVING MAIL

The inet_interfaces parameter specifies the network interface

addresses that this mail system receives mail on. By default,

the software claims all active interfaces on the machine. The

parameter also controls delivery of mail to user@[[ip.address]].

See also the proxy_interfaces parameter, for network addresses that

are forwarded to us via a proxy or network address translator.

Note: you need to stop/start Postfix when this parameter changes.

#inet_interfaces = all
#inet_interfaces = $myhostname
#inet_interfaces = $myhostname, localhost
#inet_interfaces = localhost
#inet_interfaces = virtual.host.tld
inet_interfaces = all

The proxy_interfaces parameter specifies the network interface

addresses that this mail system receives mail on by way of a

proxy or network address translation unit. This setting extends

the address list specified with the inet_interfaces parameter.

You must specify your proxy/NAT addresses when your system is a

backup MX host for other domains, otherwise mail delivery loops

will happen when the primary MX host is down.

#proxy_interfaces =
#proxy_interfaces = 1.2.3.4

The mydestination parameter specifies the list of domains that this

machine considers itself the final destination for.

These domains are routed to the delivery agent specified with the

local_transport parameter setting. By default, that is the UNIX

compatible delivery agent that lookups all recipients in /etc/passwd

and /etc/aliases or their equivalent.

The default is $myhostname + localhost.$mydomain. On a mail domain

gateway, you should also include $mydomain.

Do not specify the names of virtual domains - those domains are

specified elsewhere (see VIRTUAL_README).

Do not specify the names of domains that this machine is backup MX

host for. Specify those names via the relay_domains settings for

the SMTP server, or use permit_mx_backup if you are lazy (see

STANDARD_CONFIGURATION_README).

The local machine is always the final destination for mail addressed

to user@[[the.net.work.address]] of an interface that the mail system

receives mail on (see the inet_interfaces parameter).

Specify a list of host or domain names, /file/name or type:table

patterns, separated by commas and/or whitespace. A /file/name

pattern is replaced by its contents; a type:table is matched when

a name matches a lookup key (the right-hand side is ignored).

Continue long lines by starting the next line with whitespace.

See also below, section "REJECTING MAIL FOR UNKNOWN LOCAL USERS".

#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain, mail.$mydomain, www.$mydomain, ftp.$mydomain

REJECTING MAIL FOR UNKNOWN LOCAL USERS

The local_recipient_maps parameter specifies optional lookup tables

with all names or addresses of users that are local with respect

to $mydestination, $inet_interfaces or $proxy_interfaces.

If this parameter is defined, then the SMTP server will reject

mail for unknown local users. This parameter is defined by default.

To turn off local recipient checking in the SMTP server, specify

local_recipient_maps = (i.e. empty).

The default setting assumes that you use the default Postfix local

delivery agent for local delivery. You need to update the

local_recipient_maps setting if:

- You define $mydestination domain recipients in files other than

/etc/passwd, /etc/aliases, or the $virtual_alias_maps files.

For example, you define $mydestination domain recipients in

the $virtual_mailbox_maps files.

- You redefine the local delivery agent in master.cf.

- You redefine the "local_transport" setting in main.cf.

- You use the "luser_relay", "mailbox_transport", or "fallback_transport"

feature of the Postfix local delivery agent (see local(8)).

Details are described in the LOCAL_RECIPIENT_README file.

Beware: if the Postfix SMTP server runs chrooted, you probably have

to access the passwd file via the proxymap service, in order to

overcome chroot restrictions. The alternative, having a copy of

the system passwd file in the chroot jail is just not practical.

The right-hand side of the lookup tables is conveniently ignored.

In the left-hand side, specify a bare username, an @domain.tld

wild-card, or specify a user@domain.tld address.

#local_recipient_maps = unix:passwd.byname $alias_maps
#local_recipient_maps = proxy:unix:passwd.byname $alias_maps
#local_recipient_maps =

The unknown_local_recipient_reject_code specifies the SMTP server

response code when a recipient domain matches $mydestination or

${proxy,inet}_interfaces, while $local_recipient_maps is non-empty

and the recipient address or address local-part is not found.

The default setting is 550 (reject mail) but it is safer to start

with 450 (try again later) until you are certain that your

local_recipient_maps settings are OK.

unknown_local_recipient_reject_code = 550

TRUST AND RELAY CONTROL

The mynetworks parameter specifies the list of "trusted" SMTP

clients that have more privileges than "strangers".

In particular, "trusted" SMTP clients are allowed to relay mail

through Postfix. See the smtpd_recipient_restrictions parameter

in postconf(5).

You can specify the list of "trusted" network addresses by hand

or you can let Postfix do it for you (which is the default).

By default (mynetworks_style = subnet), Postfix "trusts" SMTP

clients in the same IP subnetworks as the local machine.

On Linux, this does works correctly only with interfaces specified

with the "ifconfig" command.

Specify "mynetworks_style = class" when Postfix should "trust" SMTP

clients in the same IP class A/B/C networks as the local machine.

Don’t do this with a dialup site - it would cause Postfix to “trust”

your entire provider’s network. Instead, specify an explicit

mynetworks list by hand, as described below.

Specify "mynetworks_style = host" when Postfix should "trust"

only the local machine.

#mynetworks_style = class
#mynetworks_style = subnet
mynetworks_style = host

Alternatively, you can specify the mynetworks list by hand, in

which case Postfix ignores the mynetworks_style setting.

Specify an explicit list of network/netmask patterns, where the

mask specifies the number of bits in the network part of a host

address.

You can also specify the absolute pathname of a pattern file instead

of listing the patterns here. Specify type:table for table-based lookups

(the value on the table right-hand side is not used).

#mynetworks = 168.100.189.0/28, 127.0.0.0/8
#mynetworks = $config_directory/mynetworks
#mynetworks = hash:/etc/postfix/network_table

The relay_domains parameter restricts what destinations this system will

relay mail to. See the smtpd_recipient_restrictions description in

postconf(5) for detailed information.

By default, Postfix relays mail

- from "trusted" clients (IP address matches $mynetworks) to any destination,

- from "untrusted" clients to destinations that match $relay_domains or

subdomains thereof, except addresses with sender-specified routing.

The default relay_domains value is $mydestination.

In addition to the above, the Postfix SMTP server by default accepts mail

that Postfix is final destination for:

- destinations that match $inet_interfaces or $proxy_interfaces,

- destinations that match $mydestination

- destinations that match $virtual_alias_domains,

- destinations that match $virtual_mailbox_domains.

These destinations do not need to be listed in $relay_domains.

Specify a list of hosts or domains, /file/name patterns or type:name

lookup tables, separated by commas and/or whitespace. Continue

long lines by starting the next line with whitespace. A file name

is replaced by its contents; a type:name table is matched when a

(parent) domain appears as lookup key.

NOTE: Postfix will not automatically forward mail for domains that

list this system as their primary or backup MX host. See the

permit_mx_backup restriction description in postconf(5).

#relay_domains = $mydestination

INTERNET OR INTRANET

The relayhost parameter specifies the default host to send mail to

when no entry is matched in the optional transport(5) table. When

no relayhost is given, mail is routed directly to the destination.

On an intranet, specify the organizational domain name. If your

internal DNS uses no MX records, specify the name of the intranet

gateway host instead.

In the case of SMTP, specify a domain, host, host:port, [[host]]:port,

[[address]] or [[address]]:port; the form [[host]] turns off MX lookups.

If you’re connected via UUCP, see also the default_transport parameter.

#relayhost = $mydomain
#relayhost = [[gateway.my.domain]]
#relayhost = [[mailserver.isp.tld]]
#relayhost = uucphost
#relayhost = [[an.ip.add.ress]]

REJECTING UNKNOWN RELAY USERS

The relay_recipient_maps parameter specifies optional lookup tables

with all addresses in the domains that match $relay_domains.

If this parameter is defined, then the SMTP server will reject

mail for unknown relay users. This feature is off by default.

The right-hand side of the lookup tables is conveniently ignored.

In the left-hand side, specify an @domain.tld wild-card, or specify

a user@domain.tld address.

#relay_recipient_maps = hash:/etc/postfix/relay_recipients

INPUT RATE CONTROL

The in_flow_delay configuration parameter implements mail input

flow control. This feature is turned on by default, although it

still needs further development (it’s disabled on SCO UNIX due

to an SCO bug).

A Postfix process will pause for $in_flow_delay seconds before

accepting a new message, when the message arrival rate exceeds the

message delivery rate. With the default 100 SMTP server process

limit, this limits the mail inflow to 100 messages a second more

than the number of messages delivered per second.

Specify 0 to disable the feature. Valid delays are 0…10.

#in_flow_delay = 1s

ADDRESS REWRITING

The ADDRESS_REWRITING_README document gives information about

address masquerading or other forms of address rewriting including

username->Firstname.Lastname mapping.

ADDRESS REDIRECTION (VIRTUAL DOMAIN)

The VIRTUAL_README document gives information about the many forms

of domain hosting that Postfix supports.

"USER HAS MOVED" BOUNCE MESSAGES

See the discussion in the ADDRESS_REWRITING_README document.

TRANSPORT MAP

See the discussion in the ADDRESS_REWRITING_README document.

ALIAS DATABASE

The alias_maps parameter specifies the list of alias databases used

by the local delivery agent. The default list is system dependent.

On systems with NIS, the default is to search the local alias

database, then the NIS alias database. See aliases(5) for syntax

details.

If you change the alias database, run "postalias /etc/aliases" (or

wherever your system stores the mail alias file), or simply run

"newaliases" to build the necessary DBM or DB file.

It will take a minute or so before changes become visible. Use

"postfix reload" to eliminate the delay.

#alias_maps = dbm:/etc/aliases
alias_maps = hash:/etc/aliases
#alias_maps = hash:/etc/aliases, nis:mail.aliases
#alias_maps = netinfo:/aliases

The alias_database parameter specifies the alias database(s) that

are built with "newaliases" or "sendmail -bi". This is a separate

configuration parameter, because alias_maps (see above) may specify

tables that are not necessarily all under control by Postfix.

#alias_database = dbm:/etc/aliases
#alias_database = dbm:/etc/mail/aliases
alias_database = hash:/etc/aliases
#alias_database = hash:/etc/aliases, hash:/opt/majordomo/aliases

ADDRESS EXTENSIONS (e.g., user+foo)

The recipient_delimiter parameter specifies the separator between

user names and address extensions (user+foo). See canonical(5),

local(8), relocated(5) and virtual(5) for the effects this has on

aliases, canonical, virtual, relocated and .forward file lookups.

Basically, the software tries user+foo and .forward+foo before

trying user and .forward.

#recipient_delimiter = +

DELIVERY TO MAILBOX

The home_mailbox parameter specifies the optional pathname of a

mailbox file relative to a user’s home directory. The default

mailbox file is /var/spool/mail/user or /var/mail/user. Specify

"Maildir/" for qmail-style delivery (the / is required).

#home_mailbox = Mailbox
#home_mailbox = Maildir/

The mail_spool_directory parameter specifies the directory where

UNIX-style mailboxes are kept. The default setting depends on the

system type.

#mail_spool_directory = /var/mail
#mail_spool_directory = /var/spool/mail

The mailbox_command parameter specifies the optional external

command to use instead of mailbox delivery. The command is run as

the recipient with proper HOME, SHELL and LOGNAME environment settings.

Exception: delivery for root is done as $default_user.

Other environment variables of interest: USER (recipient username),

EXTENSION (address extension), DOMAIN (domain part of address),

and LOCAL (the address localpart).

Unlike other Postfix configuration parameters, the mailbox_command

parameter is not subjected to $parameter substitutions. This is to

make it easier to specify shell syntax (see example below).

Avoid shell meta characters because they will force Postfix to run

an expensive shell process. Procmail alone is expensive enough.

IF YOU USE THIS TO DELIVER MAIL SYSTEM-WIDE, YOU MUST SET UP AN

ALIAS THAT FORWARDS MAIL FOR ROOT TO A REAL USER.

#mailbox_command = /some/where/procmail
#mailbox_command = /some/where/procmail -a "$EXTENSION"

The mailbox_transport specifies the optional transport in master.cf

to use after processing aliases and .forward files. This parameter

has precedence over the mailbox_command, fallback_transport and

luser_relay parameters.

Specify a string of the form transport:nexthop, where transport is

the name of a mail delivery transport defined in master.cf. The

:nexthop part is optional. For more details see the sample transport

configuration file.

NOTE: if you use this feature for accounts not in the UNIX password

file, then you must update the "local_recipient_maps" setting in

the main.cf file, otherwise the SMTP server will reject mail for

non-UNIX accounts with "User unknown in local recipient table".

#mailbox_transport = lmtp:unix:/var/lib/imap/socket/lmtp

If using the cyrus-imapd IMAP server deliver local mail to the IMAP

server using LMTP (Local Mail Transport Protocol), this is prefered

over the older cyrus deliver program by setting the

mailbox_transport as below:

mailbox_transport = lmtp:unix:/var/lib/imap/socket/lmtp

The efficiency of LMTP delivery for cyrus-imapd can be enhanced via

these settings.

local_destination_recipient_limit = 300

local_destination_concurrency_limit = 5

Of course you should adjust these settings as appropriate for the

capacity of the hardware you are using. The recipient limit setting

can be used to take advantage of the single instance message store

capability of Cyrus. The concurrency limit can be used to control

how many simultaneous LMTP sessions will be permitted to the Cyrus

message store.

To use the old cyrus deliver program you have to set:

#mailbox_transport = cyrus

The fallback_transport specifies the optional transport in master.cf

to use for recipients that are not found in the UNIX passwd database.

This parameter has precedence over the luser_relay parameter.

Specify a string of the form transport:nexthop, where transport is

the name of a mail delivery transport defined in master.cf. The

:nexthop part is optional. For more details see the sample transport

configuration file.

NOTE: if you use this feature for accounts not in the UNIX password

file, then you must update the "local_recipient_maps" setting in

the main.cf file, otherwise the SMTP server will reject mail for

non-UNIX accounts with "User unknown in local recipient table".

#fallback_transport = lmtp:unix:/var/lib/imap/socket/lmtp
#fallback_transport =

The luser_relay parameter specifies an optional destination address

for unknown recipients. By default, mail for unknown@$mydestination,

unknown@[[$inet_interfaces]] or unknown@[[$proxy_interfaces]] is returned

as undeliverable.

The following expansions are done on luser_relay: $user (recipient

username), $shell (recipient shell), $home (recipient home directory),

$recipient (full recipient address), $extension (recipient address

extension), $domain (recipient domain), $local (entire recipient

localpart), $recipient_delimiter. Specify ${name?value} or

${name:value} to expand value only when $name does (does not) exist.

luser_relay works only for the default Postfix local delivery agent.

NOTE: if you use this feature for accounts not in the UNIX password

file, then you must specify "local_recipient_maps =" (i.e. empty) in

the main.cf file, otherwise the SMTP server will reject mail for

non-UNIX accounts with "User unknown in local recipient table".

#luser_relay = $user@other.host
#luser_relay = $local@other.host
#luser_relay = admin+$local

JUNK MAIL CONTROLS

The controls listed here are only a very small subset. The file

SMTPD_ACCESS_README provides an overview.

The header_checks parameter specifies an optional table with patterns

that each logical message header is matched against, including

headers that span multiple physical lines.

By default, these patterns also apply to MIME headers and to the

headers of attached messages. With older Postfix versions, MIME and

attached message headers were treated as body text.

For details, see "man header_checks".

#header_checks = regexp:/etc/postfix/header_checks

FAST ETRN SERVICE

Postfix maintains per-destination logfiles with information about

deferred mail, so that mail can be flushed quickly with the SMTP

"ETRN domain.tld" command, or by executing "sendmail -qRdomain.tld".

See the ETRN_README document for a detailed description.

The fast_flush_domains parameter controls what destinations are

eligible for this service. By default, they are all domains that

this server is willing to relay mail to.

#fast_flush_domains = $relay_domains

SHOW SOFTWARE VERSION OR NOT

The smtpd_banner parameter specifies the text that follows the 220

code in the SMTP server’s greeting banner. Some people like to see

the mail version advertised. By default, Postfix shows no version.

You MUST specify $myhostname at the start of the text. That is an

RFC requirement. Postfix itself does not care.

#smtpd_banner = $myhostname ESMTP $mail_name
#smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)

PARALLEL DELIVERY TO THE SAME DESTINATION

How many parallel deliveries to the same user or domain? With local

delivery, it does not make sense to do massively parallel delivery

to the same user, because mailbox updates must happen sequentially,

and expensive pipelines in .forward files can cause disasters when

too many are run at the same time. With SMTP deliveries, 10

simultaneous connections to the same domain could be sufficient to

raise eyebrows.

Each message delivery transport has its XXX_destination_concurrency_limit

parameter. The default is $default_destination_concurrency_limit for

most delivery transports. For the local delivery agent the default is 2.

#local_destination_concurrency_limit = 2
#default_destination_concurrency_limit = 20

DEBUGGING CONTROL

The debug_peer_level parameter specifies the increment in verbose

logging level when an SMTP client or server host name or address

matches a pattern in the debug_peer_list parameter.

debug_peer_level = 2

The debug_peer_list parameter specifies an optional list of domain

or network patterns, /file/name patterns or type:name tables. When

an SMTP client or server host name or address matches a pattern,

increase the verbose logging level by the amount specified in the

debug_peer_level parameter.

#debug_peer_list = 127.0.0.1
#debug_peer_list = some.domain

The debugger_command specifies the external command that is executed

when a Postfix daemon program is run with the -D option.

Use "command … & sleep 5" so that the debugger can attach before

the process marches on. If you use an X-based debugger, be sure to

set up your XAUTHORITY environment variable before starting Postfix.

debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
xxgdb $daemon_directory/$process_name $process_id & sleep 5

If you can’t use X, use this to capture the call stack when a

daemon crashes. The result is in a file in the configuration

directory, and is named after the process name and the process ID.

debugger_command =

PATH=/bin:/usr/bin:/usr/local/bin; export PATH; (echo cont;

echo where) | gdb $daemon_directory/$process_name $process_id 2>&1

>$config_directory/$process_name.$process_id.log & sleep 5

Another possibility is to run gdb under a detached screen session.

To attach to the screen sesssion, su root and run "screen -r

#[id_string>" where[id_string> uniquely matches one of the detached

sessions (from "screen -list").

debugger_command =

PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH; screen

-dmS $process_name gdb $daemon_directory/$process_name

$process_id & sleep 1

INSTALL-TIME CONFIGURATION INFORMATION

The following parameters are used when installing a new Postfix version.

sendmail_path: The full pathname of the Postfix sendmail command.

This is the Sendmail-compatible mail posting interface.

sendmail_path = /usr/sbin/sendmail.postfix

newaliases_path: The full pathname of the Postfix newaliases command.

This is the Sendmail-compatible command to build alias databases.

newaliases_path = /usr/bin/newaliases.postfix

mailq_path: The full pathname of the Postfix mailq command. This

is the Sendmail-compatible mail queue listing command.

mailq_path = /usr/bin/mailq.postfix

setgid_group: The group for mail submission and queue management

commands. This must be a group name with a numerical group ID that

is not shared with other accounts, not even with the Postfix account.

setgid_group = postdrop

html_directory: The location of the Postfix HTML documentation.

html_directory = no

manpage_directory: The location of the Postfix on-line manual pages.

manpage_directory = /usr/share/man

sample_directory: The location of the Postfix sample configuration files.

This parameter is obsolete as of Postfix 2.1.

sample_directory = /usr/share/doc/postfix-2.3.3/samples

readme_directory: The location of the Postfix README files.

readme_directory = /usr/share/doc/postfix-2.3.3/README_FILES
virtual_alias_maps = hash:/etc/postfix/virtual

canonical_maps = hash:/etc/postfix/canonical
sender_canonical_maps = hash:/etc/postfix/sender_canonical
recipient_canonical_maps = hash:/etc/postfix/virtual

Howdy A,

First up, forget about Postfix. It doesn’t come into play at all for picking up mail.

Since this is a pretty common type of question, I’m going to go through the whole troubleshooting process (but it sounds like you need to skip down to the firewall bit).

You want to talk about Dovecot (or whatever other IMAP/POP3 server you’ve chosen, if something else).

So, first up, make sure the pop/imap server is running:

/etc/init.d/dovecot status

Then, if it is, see that it’s listening where you think it ought to be:

netstat -l | grep pop3

And/or:

netstat -l | grep imap

If you get results from that, you’ve probably got a firewall in the way. So, open it:

iptables -I INPUT -p tcp --dport pop3 -j ACCEPT
iptables -I INPUT -p tcp --dport pop3s -j ACCEPT
iptables -I INPUT -p tcp --dport imap -j ACCEPT
iptables -I INPUT -p tcp --dport imaps -j ACCEPT

And then save it. How you save it depends on the OS (and SUSE uses its own very stupid firewall script format, so you have to use their tools to modify the firewall). On Red Hat based systems:

service iptables save

On some others, it’s “iptables-save”, but you might have to explicitly identify what file to save to. Debian and Ubuntu use a pretty clever per-interface firewall configuration system…but I don’t remember off-hand how to save it. You might find using the Webmin Linux Firewall module easier than figuring out how to use whatever your OS uses! (It does support most systems that use the standard firewall format. e.g. everything but SUSE.)

If after all of this you still get connection refused, we need to see the maillog!

Thanks Joe for your patience, help and guidance to a half-baked server administrator (me!). :slight_smile:

I enabled Dovecot*** and rebooted the server. Still unable to connect to mail server to retrieve mail via Thunderbird or Outlook Express.

(*** Shouldn’t this, together with Postfix, be enabled by default by Virtualmin Pro so that clueless users like me have the web/mail server up and running straightaway? Just a suggestion.)

I have the server firewall and SElinux switched off after the installation of Fedora Core 6. So firewall wasn’t the issue. Nevertheless, I went through:

iptables -I INPUT -p tcp --dport pop3 -j ACCEPT
iptables -I INPUT -p tcp --dport pop3s -j ACCEPT
iptables -I INPUT -p tcp --dport imap -j ACCEPT
iptables -I INPUT -p tcp --dport imaps -j ACCEPT
service iptables save

then rebooted the server. Still no luck!

I checked my router setting to ensure that no firewall is applied to the IP address (10.1.1.9) I point the server. The IP address is set as DMZ (Demilitarised Zone), so all ports are available.

I am stuck! Please help.

Here is my maillog:

Mar 23 00:54:00 www amavis[[2719]]: starting. /usr/sbin/amavisd at www.mydomain.com amavisd-new-2.4.4 (20061120), Unicode aware, LANG=“en_US.UTF-8”
Mar 23 00:54:00 www amavis[[2719]]: Perl version 5.008008
Mar 23 00:54:01 www amavis[[2720]]: Module Amavis::Conf 2.075
Mar 23 00:54:01 www amavis[[2720]]: Module Archive::Tar 1.30
Mar 23 00:54:01 www amavis[[2720]]: Module Archive::Zip 1.16
Mar 23 00:54:01 www amavis[[2720]]: Module BerkeleyDB 0.31
Mar 23 00:54:01 www amavis[[2720]]: Module Compress::Zlib 1.42
Mar 23 00:54:01 www amavis[[2720]]: Module Convert::TNEF 0.17
Mar 23 00:54:01 www amavis[[2720]]: Module Convert::UUlib 1.06
Mar 23 00:54:01 www amavis[[2720]]: Module DBD::Pg 1.49
Mar 23 00:54:01 www amavis[[2720]]: Module DBD::mysql 3.0007
Mar 23 00:54:01 www amavis[[2720]]: Module DBI 1.52
Mar 23 00:54:01 www amavis[[2720]]: Module DB_File 1.814
Mar 23 00:54:01 www amavis[[2720]]: Module Digest::MD5 2.36
Mar 23 00:54:01 www amavis[[2720]]: Module IO::Socket::INET6 2.51
Mar 23 00:54:01 www amavis[[2720]]: Module MIME::Entity 5.420
Mar 23 00:54:01 www amavis[[2720]]: Module MIME::Parser 5.420
Mar 23 00:54:01 www amavis[[2720]]: Module MIME::Tools 5.420
Mar 23 00:54:01 www amavis[[2720]]: Module Mail::Header 1.74
Mar 23 00:54:01 www amavis[[2720]]: Module Mail::Internet 1.74
Mar 23 00:54:01 www amavis[[2720]]: Module Mail::SPF::Query 1.999001
Mar 23 00:54:01 www amavis[[2720]]: Module Mail::SpamAssassin 3.001008
Mar 23 00:54:01 www amavis[[2720]]: Module Net::Cmd 2.26
Mar 23 00:54:01 www amavis[[2720]]: Module Net::DNS 0.59
Mar 23 00:54:01 www amavis[[2720]]: Module Net::SMTP 2.29
Mar 23 00:54:01 www amavis[[2720]]: Module Net::Server 0.94
Mar 23 00:54:01 www amavis[[2720]]: Module Razor2::Client::Version 2.82
Mar 23 00:54:01 www amavis[[2720]]: Module Time::HiRes 1.86
Mar 23 00:54:01 www amavis[[2720]]: Module Unix::Syslog 0.100
Mar 23 00:54:01 www amavis[[2720]]: Amavis::DB code loaded
Mar 23 00:54:01 www amavis[[2720]]: Amavis::Cache code loaded
Mar 23 00:54:01 www amavis[[2720]]: SQL base code NOT loaded
Mar 23 00:54:01 www amavis[[2720]]: SQL::Log code NOT loaded
Mar 23 00:54:01 www amavis[[2720]]: SQL::Quarantine NOT loaded
Mar 23 00:54:01 www amavis[[2720]]: Lookup::SQL code NOT loaded
Mar 23 00:54:01 www amavis[[2720]]: Lookup::LDAP code NOT loaded
Mar 23 00:54:01 www amavis[[2720]]: AM.PDP-in proto code loaded
Mar 23 00:54:01 www amavis[[2720]]: SMTP-in proto code loaded
Mar 23 00:54:01 www amavis[[2720]]: Courier proto code NOT loaded
Mar 23 00:54:01 www amavis[[2720]]: SMTP-out proto code loaded
Mar 23 00:54:01 www amavis[[2720]]: Pipe-out proto code NOT loaded
Mar 23 00:54:01 www amavis[[2720]]: BSMTP-out proto code NOT loaded
Mar 23 00:54:01 www amavis[[2720]]: Local-out proto code loaded
Mar 23 00:54:01 www amavis[[2720]]: OS_Fingerprint code NOT loaded
Mar 23 00:54:01 www amavis[[2720]]: ANTI-VIRUS code loaded
Mar 23 00:54:01 www amavis[[2720]]: ANTI-SPAM code loaded
Mar 23 00:54:01 www amavis[[2720]]: ANTI-SPAM-SA code loaded
Mar 23 00:54:01 www amavis[[2720]]: Unpackers code loaded
Mar 23 00:54:01 www amavis[[2720]]: Found $file at /usr/bin/file
Mar 23 00:54:01 www amavis[[2720]]: No $dspam, not using it
Mar 23 00:54:01 www amavis[[2720]]: Internal decoder for .mail
Mar 23 00:54:01 www amavis[[2720]]: Internal decoder for .asc
Mar 23 00:54:01 www amavis[[2720]]: Internal decoder for .uue
Mar 23 00:54:01 www amavis[[2720]]: Internal decoder for .hqx
Mar 23 00:54:01 www amavis[[2720]]: Internal decoder for .ync
Mar 23 00:54:01 www amavis[[2720]]: Found decoder for .F at /usr/bin/unfreeze
Mar 23 00:54:01 www amavis[[2720]]: Found decoder for .Z at /usr/bin/gzip -d
Mar 23 00:54:01 www amavis[[2720]]: Found decoder for .gz at /usr/bin/gzip -d
Mar 23 00:54:01 www amavis[[2720]]: Found decoder for .bz2 at /usr/bin/bzip2 -d
Mar 23 00:54:01 www amavis[[2720]]: Found decoder for .lzo at /usr/bin/lzop -d
Mar 23 00:54:01 www amavis[[2720]]: Found decoder for .rpm at /usr/bin/rpm2cpio
Mar 23 00:54:01 www amavis[[2720]]: Found decoder for .cpio at /usr/bin/pax
Mar 23 00:54:01 www amavis[[2720]]: Found decoder for .tar at /usr/bin/pax
Mar 23 00:54:01 www amavis[[2720]]: Found decoder for .deb at /usr/bin/ar
Mar 23 00:54:01 www amavis[[2720]]: Internal decoder for .zip
Mar 23 00:54:01 www amavis[[2720]]: No decoder for .rar tried: rar, unrar
Mar 23 00:54:01 www amavis[[2720]]: Found decoder for .arj at /usr/bin/arj
Mar 23 00:54:01 www amavis[[2720]]: Found decoder for .arc at /usr/bin/nomarch
Mar 23 00:54:01 www amavis[[2720]]: No decoder for .zoo tried: zoo, unzoo
Mar 23 00:54:01 www amavis[[2720]]: No decoder for .lha tried: lha
Mar 23 00:54:01 www amavis[[2720]]: Found decoder for .cab at /usr/bin/cabextract
Mar 23 00:54:01 www amavis[[2720]]: No decoder for .tnef tried: tnef
Mar 23 00:54:01 www amavis[[2720]]: Internal decoder for .tnef
Mar 23 00:54:01 www amavis[[2720]]: Found decoder for .exe at /usr/bin/arj
Mar 23 00:54:01 www amavis[[2720]]: Using internal av scanner code for (primary) ClamAV-clamd
Mar 23 00:54:01 www amavis[[2720]]: Found secondary av scanner ClamAV-clamscan at /usr/bin/clamscan
Mar 23 00:54:01 www amavis[[2720]]: Creating db in /var/spool/amavisd/db/; BerkeleyDB 0.31, libdb 4.3
Mar 23 00:54:01 www spamd[[2709]]: rules: meta test DIGEST_MULTIPLE has undefined dependency ‘DCC_CHECK’
Mar 23 00:54:01 www spamd[[2709]]: spamd: server started on port 783/tcp (running version 3.1.8)
Mar 23 00:54:01 www spamd[[2709]]: spamd: server pid: 2709
Mar 23 00:54:01 www spamd[[2709]]: spamd: server successfully spawned child process, pid 2749
Mar 23 00:54:01 www spamd[[2709]]: spamd: server successfully spawned child process, pid 2750
Mar 23 00:54:01 www spamd[[2709]]: prefork: child states: II
Mar 23 00:54:02 www postfix/postfix-script: starting the Postfix mail system

The only other thing I could think of that is stuffing it up is the DNS records.

I am hosting this server at home at the moment (while I set it up), with a static IP from my ISP. I point eth0 and all my virtual servers to 10.1.1.9.

I am not using the server to be the DNS server (yet?). Instead, I am using an external DNS server with these records:

@ NS ns1.mywebhost.com
@ NS ns2.mywebhost.com
@ A my.static.ip.address
www A my.static.ip.address
mail A my.static.ip.address
@ MX 25 mail
@ MX 5 mail.investmentcentre.com.au

Are they correct?

Hi Joe, any more ideas?

  • Postfix and Dovecot both started at boot and running

  • Dovecot set to "Serve mail protocols: POP3"

  • No problem sending and receiving mail using Usermin

  • Linux Firewall - turned off; but specifically set to:

Accept If protocol is TCP and destination port is 993
Accept If protocol is TCP and destination port is 143
Accept If protocol is TCP and destination port is 995
Accept If protocol is TCP and destination port is 110

  • Router Firewall - allow port 110; 10.1.1.9 set as DMZ

  • Used www.pingability.com to test connection to mail server - no problem

Server Name mail.mydomain.com
IP my.static.ip.address
Location MyCountry
Mail Server For *@mydomail.com
MX Priority 25
Connect Response Time 1192ms
Server ‘Hello’ Line 220 www.myhostname.com ESMTP Postfix
Open Relay? No Problems Found
RDNS Entry my-static-ip-address.static.myisp.com.

  • Used] Webmin] System] Running Processes to check port 110:

4414 root 0.0 % 00:24 /usr/sbin/dovecot
4419 dovecot 0.0 % 00:24 pop3-login
4420 dovecot 0.0 % 00:24 pop3-login
4421 dovecot 0.0 % 00:24 pop3-login

Everything seemed right but I just couldn’t get download my emails using Outlook or Thunderbird.

Mail server: mail.mydomain.com
Port: 110
Use Secure Authentication: Never

Scrap that. I could download email via Outlook, Thunderbird etc. if I use a dial-up connection.

Because I am hosting the server at home with my ISP’s static IP, I couldn’t access the websites hosted on the server from a browser unless I use an external proxy. That I knew.

Using the same rationale I set Thunderbird to use the same proxy. But that didn’t work.

So as a final troubleshooting step, I use a dialup connection to test the email download. It finally worked!

PS: For those who are having problem downloading email via POP, go through the above checklist - firewall, dovecot etc. etc. you’ll be fine.

This is my Dovecot config file:

Dovecot configuration file

If you’re in a hurry, see http://wiki.dovecot.org/QuickConfiguration

‘#’ character and everything after it is treated as comments. Extra spaces

and tabs are ignored. If you want to use either of these explicitly, put the

value inside quotes, eg.: key = "# char and trailing whitespace "

Default values are shown for each setting, it’s not required to uncomment

any of the lines.

Base directory where to store runtime data.

#base_dir = /var/run/dovecot/

Protocols we want to be serving: imap imaps pop3 pop3s

If you only want to use dovecot-auth, you can set this to "none".

#protocols = imap imaps pop3 pop3s
protocols = imap pop3 imaps pop3s

IP or host address where to listen in for connections. It’s not currently

possible to specify multiple addresses. "*" listens in all IPv4 interfaces.

"[[::]]" listens in all IPv6 interfaces, but may also listen in all IPv4

interfaces depending on the operating system.

If you want to specify ports for each service, you will need to configure

these settings inside the protocol imap/pop3 { … } section, so you can

specify different ports for IMAP/POP3. For example:

protocol imap {

listen = *:10143

ssl_listen = *:10943

}

protocol pop3 {

listen = *:10100

}

#listen = [[::]]
listen =

Disable LOGIN command and all other plaintext authentications unless

SSL/TLS is used (LOGINDISABLED capability). Note that if the remote IP

matches the local IP (ie. you’re connecting from the same computer), the

connection is considered secure and plaintext authentication is allowed.

#disable_plaintext_auth = no

Should all IMAP and POP3 processes be killed when Dovecot master process

shuts down. Setting this to "no" means that Dovecot can be upgraded without

forcing existing client connections to close (although that could also be

a problem if the upgrade is eg. because of a security fix). This however

means that after master process has died, the client processes can’t write

to log files anymore.

#shutdown_clients = yes

Logging

Use this logfile instead of syslog(). /dev/stderr can be used if you want to

use stderr for logging (ONLY /dev/stderr - otherwise it is closed).

#log_path =

For informational messages, use this logfile instead of the default

#info_log_path =

Prefix for each line written to log file. % codes are in strftime(3)

format.

#log_timestamp = "%b %d %H:%M:%S "

Syslog facility to use if you’re logging to syslog. Usually if you don’t

want to use “mail”, you’ll use local0…local7. Also other standard

facilities are supported.

#syslog_facility = mail

SSL settings

IP or host address where to listen in for SSL connections. Defaults

to above if not specified.

#ssl_listen =
ssl_listen =

Disable SSL/TLS support.

#ssl_disable = no

PEM encoded X.509 SSL/TLS certificate and private key. They’re opened before

dropping root privileges, so keep the key file unreadable by anyone but

root. Included doc/mkcert.sh can be used to easily generate self-signed

certificate, just make sure to update the domains in dovecot-openssl.cnf

#ssl_cert_file = /etc/pki/dovecot/certs/dovecot.pem
#ssl_key_file = /etc/pki/dovecot/private/dovecot.pem

If key file is password protected, give the password here. Alternatively

give it when starting dovecot with -p parameter.

#ssl_key_password =

File containing trusted SSL certificate authorities. Usually not needed.

The CAfile should contain the CA-certificate(s) followed by the matching

CRL(s). CRL checking is new in dovecot .rc1

#ssl_ca_file =

Request client to send a certificate.

#ssl_verify_client_cert = no

How often to regenerate the SSL parameters file. Generation is quite CPU

intensive operation. The value is in hours, 0 disables regeneration

entirely.

#ssl_parameters_regenerate = 168

SSL ciphers to use

#ssl_cipher_list = ALL:!LOW

Show protocol level SSL errors.

#verbose_ssl = no

Login processes

Directory where authentication process places authentication UNIX sockets

which login needs to be able to connect to. The sockets are created when

running as root, so you don’t have to worry about permissions. Note that

everything in this directory is deleted when Dovecot is started.

#login_dir = /var/run/dovecot/login

chroot login process to the login_dir. Only reason not to do this is if you

wish to run the whole Dovecot without roots.

http://wiki.dovecot.org/Rootless

#login_chroot = yes

User to use for the login process. Create a completely new user for this,

and don’t use it anywhere else. The user must also belong to a group where

only it has access, it’s used to control access for authentication process.

Note that this user is NOT used to access mails.

http://wiki.dovecot.org/UserIds

#login_user = dovecot

Set max. process size in megabytes. If you don’t use

login_process_per_connection you might need to grow this.

#login_process_size = 32

Should each login be processed in it’s own process (yes), or should one

login process be allowed to process multiple connections (no)? Yes is more

secure, espcially with SSL/TLS enabled. No is faster since there’s no need

to create processes all the time.

#login_process_per_connection = yes

Number of login processes to keep for listening new connections.

#login_processes_count = 3

Maximum number of login processes to create. The listening process count

usually stays at login_processes_count, but when multiple users start logging

in at the same time more extra processes are created. To prevent fork-bombing

we check only once in a second if new processes should be created - if all

of them are used at the time, we double their amount until the limit set by

this setting is reached.

#login_max_processes_count = 128

Maximum number of connections allowed per each login process. This setting

is used only if login_process_per_connection=no. Once the limit is reached,

the process notifies master so that it can create a new login process.

You should make sure that the process has at least

16 + login_max_connections * 2 available file descriptors.

#login_max_connections = 256

Greeting message for clients.

#login_greeting = Dovecot ready.

Space-separated list of elements we want to log. The elements which have

a non-empty variable value are joined together to form a comma-separated

string.

#login_log_format_elements = user=<%u> method=%m rip=%r lip=%l %c

Login log format. %$ contains login_log_format_elements string, %s contains

the data we want to log.

#login_log_format = %$: %s

Mailbox locations and namespaces

Location for users’ mailboxes. This is the same as the old default_mail_env

setting. The default is empty, which means that Dovecot tries to find the

mailboxes automatically. This won’t work if the user doesn’t have any mail

yet, so you should explicitly tell Dovecot the full location.

If you’re using mbox, giving a path to the INBOX file (eg. /var/mail/%u)

isn’t enough. You’ll also need to tell Dovecot where the other mailboxes are

and where Dovecot can place its index files. This is called the "root mail

directory", and it must be the first path given in the mail_location setting.

There are a few special variables you can use, eg.:

%u - username

%n - user part in user@domain, same as %u if there’s no domain

%d - domain part in user@domain, empty if there’s no domain

%h - home directory

See doc/variables.txt for full list. Some examples:

mail_location = maildir:~/Maildir

mail_location = mbox:~/mail:INBOX=/var/mail/%u

mail_location = mbox:/var/mail/%d/%1n/%n:INDEX=/var/indexes/%d/%1n/%n

http://wiki.dovecot.org/MailLocation

#mail_location =

If you need to set multiple mailbox locations or want to change default

namespace settings, you can do it by defining namespace sections:

You can have private, shared and public namespaces. The only difference

between them is how Dovecot announces them to client via NAMESPACE

extension. Shared namespaces are meant for user-owned mailboxes which are

shared to other users, while public namespaces are for more globally

accessible mailboxes.

REMEMBER: If you add any namespaces, the default namespace must be added

explicitly, ie. mail_location does nothing unless you have a namespace

without a location setting. Default namespace is simply done by having a

namespace with empty prefix.

#namespace private {

Hierarchy separator to use. You should use the same separator for all

namespaces or some clients get confused. ‘/’ is usually a good one.

The default however depends on the underlying mail storage format.

#separator =

Prefix required to access this namespace. This needs to be different for

all namespaces. For example "Public/".

#prefix =

Physical location of the mailbox. This is in same format as

mail_location, which is also the default for it.

#location =

There can be only one INBOX, and this setting defines which namespace

has it.

#inbox = yes

If namespace is hidden, it’s not advertised to clients via NAMESPACE

extension or shown in LIST replies. This is mostly useful when converting

from another server with different namespaces which you want to depricate

but still keep working. For example you can create hidden namespaces with

prefixes "~/mail/", "~%u/mail/" and "mail/".

#hidden = yes
#}

Grant access to these extra groups for mail processes. Typical use would be

to give "mail" group write access to /var/mail to be able to create dotlocks.

#mail_extra_groups =

Allow full filesystem access to clients. There’s no access checks other than

what the operating system does for the active UID/GID. It works with both

maildir and mboxes, allowing you to prefix mailboxes names with eg. /path/

or ~user/.

#mail_full_filesystem_access = no

Mail processes

Enable mail process debugging. This can help you figure out why Dovecot

isn’t finding your mails.

#mail_debug = no

Log prefix for mail processes. See doc/variables.txt for list of possible

variables you can use.

#mail_log_prefix = "%Us(%u): "

Use mmap() instead of read() to read mail files. read() seems to be a bit

faster with my Linux/x86 and it’s better with NFS, so that’s the default.

Note that OpenBSD 3.3 and older don’t work right with mail_read_mmaped = yes.

#mail_read_mmaped = no

Don’t use mmap() at all. This is required if you store indexes to shared

filesystems (NFS or clustered filesystem).

#mmap_disable = no

Don’t write() to mmaped files. This is required for some operating systems

which use separate caches for them, such as OpenBSD.

#mmap_no_write = no

Locking method for index files. Alternatives are fcntl, flock and dotlock.

Dotlocking uses some tricks which may create more disk I/O than other locking

methods. NOTE: If you use NFS, remember to change also mmap_disable setting!

#lock_method = fcntl

Drop all privileges before exec()ing the mail process. This is mostly

meant for debugging, otherwise you don’t get core dumps. It could be a small

security risk if you use single UID for multiple users, as the users could

ptrace() each others processes then.

#mail_drop_priv_before_exec = no

Show more verbose process titles (in ps). Currently shows user name and

IP address. Useful for seeing who are actually using the IMAP processes

(eg. shared mailboxes or if same uid is used for multiple accounts).

#verbose_proctitle = no

Valid UID range for users, defaults to 500 and above. This is mostly

to make sure that users can’t log in as daemons or other system users.

Note that denying root logins is hardcoded to dovecot binary and can’t

be done even if first_valid_uid is set to 0.

#first_valid_uid = 500
#last_valid_uid = 0

Valid GID range for users, defaults to non-root/wheel. Users having

non-valid GID as primary group ID aren’t allowed to log in. If user

belongs to supplementary groups with non-valid GIDs, those groups are

not set.

#first_valid_gid = 1
#last_valid_gid = 0

Maximum number of running mail processes. When this limit is reached,

new users aren’t allowed to log in.

#max_mail_processes = 1024

Set max. process size in megabytes. Most of the memory goes to mmap()ing

files, so it shouldn’t harm much even if this limit is set pretty high.

#mail_process_size = 256

Maximum allowed length for mail keyword name. It’s only forced when trying

to create new keywords.

#mail_max_keyword_length = 50

Default umask to use for mail files and directories.

#umask = 0077

‘:’ separated list of directories under which chrooting is allowed for mail

processes (ie. /var/mail will allow chrooting to /var/mail/foo/bar too).

This setting doesn’t affect login_chroot or auth_chroot variables.

WARNING: Never add directories here which local users can modify, that

may lead to root exploit. Usually this should be done only if you don’t

allow shell access for users. See doc/configuration.txt for more information.

#valid_chroot_dirs =

Default chroot directory for mail processes. This can be overridden for

specific users in user database by giving /./ in user’s home directory

(eg. /home/./user chroots into /home). Note that usually there is no real

need to do chrooting, Dovecot doesn’t allow users to access files outside

their mail directory anyway.

#mail_chroot =

Mailbox handling optimizations

Space-separated list of fields to initially save into cache file. Currently

these fields are allowed:

flags, date.sent, date.received, size.virtual, size.physical

mime.parts, imap.body, imap.bodystructure

Different IMAP clients work in different ways, so they benefit from

different cached fields. Some do not benefit from them at all. Caching more

than necessary generates useless disk I/O, so you don’t want to do that

either.

Dovecot attempts to automatically figure out what client wants and it keeps

only that. However the first few times a mailbox is opened, Dovecot hasn’t

yet figured out what client needs, so it may not perform optimally. If you

know what fields the majority of your clients need, it may be useful to set

these fields by hand. If client doesn’t actually use them, Dovecot will

eventually drop them.

Usually you should just leave this field alone. The potential benefits are

typically unnoticeable.

#mail_cache_fields =

Space-separated list of fields that Dovecot should never save to cache file.

Useful if you want to save disk space at the cost of more I/O when the fields

needed.

#mail_never_cache_fields =

The minimum number of mails in a mailbox before updates are done to cache

file. This allows optimizing Dovecot’s behavior to do less disk writes at

the cost of more disk reads.

#mail_cache_min_mail_count = 0

When IDLE command is running, mailbox is checked once in a while to see if

there are any new mails or other changes. This setting defines the minimum

time to wait between those checks. Dovecot is however able to use dnotify

and inotify with Linux to reply immediately after the change occurs.

#mailbox_idle_check_interval = 30

Save mails with CR+LF instead of plain LF. This makes sending those mails

take less CPU, especially with sendfile() syscall with Linux and FreeBSD.

But it also creates a bit more disk I/O which may just make it slower.

Also note that if other software reads the mboxes/maildirs, they may handle

the extra CRs wrong and cause problems.

#mail_save_crlf = no

Maildir-specific settings

By default LIST command returns all entries in maildir beginning with dot.

Enabling this option makes Dovecot return only entries which are directories.

This is done by stat()ing each entry, so it causes more disk I/O.

(For systems setting struct dirent->d_type, this check is free and it’s

done always regardless of this setting)

#maildir_stat_dirs = no

Copy mail to another folders using hard links. This is much faster than

actually copying the file. This is problematic only if something modifies

the mail in one folder but doesn’t want it modified in the others. I don’t

know any MUA which would modify mail files directly. IMAP protocol also

requires that the mails don’t change, so it would be problematic in any case.

If you care about performance, enable it.

#maildir_copy_with_hardlinks = no

mbox-specific settings

Which locking methods to use for locking mbox. There are four available:

dotlock: Create[mailbox>.lock file. This is the oldest and most NFS-safe

solution. If you want to use /var/mail/ like directory, the users

will need write access to that directory.

fcntl : Use this if possible. Works with NFS too if lockd is used.

flock : May not exist in all systems. Doesn’t work with NFS.

lockf : May not exist in all systems. Doesn’t work with NFS.

You can use multiple locking methods; if you do the order they’re declared

in is important to avoid deadlocks if other MTAs/MUAs are using multiple

locking methods as well. Some operating systems don’t allow using some of

them simultaneously.

#mbox_read_locks = fcntl
#mbox_write_locks = fcntl

Maximum time in seconds to wait for lock (all of them) before aborting.

#mbox_lock_timeout = 300

If dotlock exists but the mailbox isn’t modified in any way, override the

lock file after this many seconds.

#mbox_dotlock_change_timeout = 120

When mbox changes unexpectedly we have to fully read it to find out what

changed. If the mbox is large this can take a long time. Since the change

is usually just a newly appended mail, it’d be faster to simply read the

new mails. If this setting is enabled, Dovecot does this but still safely

fallbacks to re-reading the whole mbox file whenever something in mbox isn’t

how it’s expected to be. The only real downside to this setting is that if

some other MUA changes message flags, Dovecot doesn’t notice it immediately.

Note that a full sync is done with SELECT, EXAMINE, EXPUNGE and CHECK

commands.

#mbox_dirty_syncs = yes

Like mbox_dirty_syncs, but don’t do full syncs even with SELECT, EXAMINE,

EXPUNGE or CHECK commands. If this is set, mbox_dirty_syncs is ignored.

#mbox_very_dirty_syncs = no

Delay writing mbox headers until doing a full write sync (EXPUNGE and CHECK

commands and when closing the mailbox). This is especially useful for POP3

where clients often delete all mails. The downside is that our changes

aren’t immediately visible to other MUAs.

#mbox_lazy_writes = yes

If mbox size is smaller than this (in kilobytes), don’t write index files.

If an index file already exists it’s still read, just not updated.

#mbox_min_index_size = 0

dbox-specific settings

Maximum dbox file size in kilobytes until it’s rotated.

#dbox_rotate_size = 2048

Minimum dbox file size in kilobytes before it’s rotated

(overrides dbox_rotate_days)

#dbox_rotate_min_size = 16

Maximum dbox file age in days until it’s rotated. Day always begins from

midnight, so 1 = today, 2 = yesterday, etc. 0 = check disabled.

#dbox_rotate_days = 0

IMAP specific settings

protocol imap {

Login executable location.

#login_executable = /usr/libexec/dovecot/imap-login

IMAP executable location. Changing this allows you to execute other

binaries before the imap process is executed.

This would write rawlogs into ~/dovecot.rawlog/ directory:

mail_executable = /usr/libexec/dovecot/rawlog /usr/libexec/dovecot/imap

This would attach gdb into the imap process and write backtraces into

/tmp/gdbhelper.* files:

mail_executable = /usr/libexec/dovecot/gdbhelper /usr/libexec/dovecot/imap

#mail_executable = /usr/libexec/dovecot/imap

Maximum IMAP command line length in bytes. Some clients generate very long

command lines with huge mailboxes, so you may need to raise this if you get

"Too long argument" or "IMAP command line too large" errors often.

#imap_max_line_length = 65536

Support for dynamically loadable plugins. mail_plugins is a space separated

list of plugins to load.

#mail_plugins =
#mail_plugin_dir = /usr/lib/dovecot/imap

Send IMAP capabilities in greeting message. This makes it unnecessary for

clients to request it with CAPABILITY command, so it saves one round-trip.

Many clients however don’t understand it and ask the CAPABILITY anyway.

#login_greeting_capability = no

Override the IMAP CAPABILITY response.

#imap_capability =

Workarounds for various client bugs:

delay-newmail:

Send EXISTS/RECENT new mail notifications only when replying to NOOP

and CHECK commands. Some clients ignore them otherwise, for example

OSX Mail. Outlook Express breaks more badly though, without this it

may show user "Message no longer in server" errors. Note that OE6 still

breaks even with this workaround if synchronization is set to

"Headers Only".

outlook-idle:

Outlook and Outlook Express never abort IDLE command, so if no mail

arrives in half a hour, Dovecot closes the connection. This is still

fine, except Outlook doesn’t connect back so you don’t see if new mail

arrives.

netscape-eoh:

Netscape 4.x breaks if message headers don’t end with the empty "end of

headers" line. Normally all messages have this, but setting this

workaround makes sure that Netscape never breaks by adding the line if

it doesn’t exist. This is done only for FETCH BODY[[HEADER.FIELDS…]]

commands. Note that RFC says this shouldn’t be done.

tb-extra-mailbox-sep:

With mbox storage a mailbox can contain either mails or submailboxes,

but not both. Thunderbird separates these two by forcing server to

accept ‘/’ suffix in mailbox names in subscriptions list.

The list is space-separated.

#imap_client_workarounds = outlook-idle
}

POP3 specific settings

protocol pop3 {

Login executable location.

#login_executable = /usr/libexec/dovecot/pop3-login

POP3 executable location. See IMAP’s mail_executable above for examples

how this could be changed.

#mail_executable = /usr/libexec/dovecot/pop3

Don’t try to set mails non-recent or seen with POP3 sessions. This is

mostly intended to reduce disk I/O. With maildir it doesn’t move files

from new/ to cur/, with mbox it doesn’t write Status-header.

#pop3_no_flag_updates = no

Support LAST command which exists in old POP3 specs, but has been removed

from new ones. Some clients still wish to use this though. Enabling this

makes RSET command clear all Seen flags from messages.

#pop3_enable_last = no

If mail has X-UIDL header, use it as the mail’s UIDL.

#pop3_reuse_xuidl = no

Keep the mailbox locked for the entire POP3 session.

#pop3_lock_session = no

POP3 UIDL format to use. You can use following variables:

%v - Mailbox UIDVALIDITY

%u - Mail UID

%m - MD5 sum of the mailbox headers in hex (mbox only)

%f - filename (maildir only)

If you want UIDL compatibility with other POP3 servers, use:

UW’s ipop3d : %08Xv%08Xu

Courier version 0 : %f

Courier version 1 : %u

Courier version 2 : %v-%u

Cyrus (<= 2.1.3) : %u

Cyrus (>= 2.1.4) : %v.%u

Older Dovecots : %v.%u

tpop3d : %Mf

Note that Outlook 2003 seems to have problems with %v.%u format which was

Dovecot’s default, so if you’re building a new server it would be a good

idea to change this. %08Xu%08Xv should be pretty fail-safe.

NOTE: Nowadays this is required to be set explicitly, since the old

default was bad but it couldn’t be changed without breaking existing

installations. %08Xu%08Xv will be the new default, so use it for new

installations.

#pop3_uidl_format = %08Xu%08Xv

POP3 logout format string:

%t - number of TOP commands

%p - number of bytes sent to client as a result of TOP command

%r - number of RETR commands

%b - number of bytes sent to client as a result of RETR command

%d - number of deleted messages

%m - number of messages (before deletion)

%s - mailbox size in bytes (before deletion)

#pop3_logout_format = top=%t/%p, retr=%r/%b, del=%d/%m, size=%s

Support for dynamically loadable plugins. mail_plugins is a space separated

list of plugins to load.

#mail_plugins =
#mail_plugin_dir = /usr/lib/dovecot/pop3

Workarounds for various client bugs:

outlook-no-nuls:

Outlook and Outlook Express hang if mails contain NUL characters.

This setting replaces them with 0x80 character.

oe-ns-eoh:

Outlook Express and Netscape Mail breaks if end of headers-line is

missing. This option simply sends it if it’s missing.

The list is space-separated.

#pop3_client_workarounds =
}

LDA specific settings

protocol lda {

Address to use when sending rejection mails.

postmaster_address = postmaster@example.com

Hostname to use in various parts of sent mails, eg. in Message-Id.

Default is the system’s real hostname.

#hostname =

Support for dynamically loadable plugins. mail_plugins is a space separated

list of plugins to load.

#mail_plugins =
#mail_plugin_dir = /usr/lib/dovecot/lda

Binary to use for sending mails.

#sendmail_path = /usr/lib/sendmail

UNIX socket path to master authentication server to find users.

#auth_socket_path = /var/run/dovecot/auth-master
}

Authentication processes

Executable location

#auth_executable = /usr/libexec/dovecot/dovecot-auth

Set max. process size in megabytes.

#auth_process_size = 256

Authentication cache size in kilobytes. 0 means it’s disabled.

Note that bsdauth, PAM and vpopmail require cache_key to be set for caching

to be used. Also note that currently auth cache doesn’t work very well if

you’re using multiple passdbs with same usernames in them.

#auth_cache_size = 0

Time to live in seconds for cached data. After this many seconds the cached

record is no longer used, except if the main database lookup returns

internal failure. We also try to handle password changes automatically: If

user’s previous authentication was successful, but this one wasn’t, the

cache isn’t used. For now this works only with plaintext authentication.

#auth_cache_ttl = 3600

Space separated list of realms for SASL authentication mechanisms that need

them. You can leave it empty if you don’t want to support multiple realms.

Many clients simply use the first one listed here, so keep the default realm

first.

#auth_realms =

Default realm/domain to use if none was specified. This is used for both

SASL realms and appending @domain to username in plaintext logins.

#auth_default_realm =

List of allowed characters in username. If the user-given username contains

a character not listed in here, the login automatically fails. This is just

an extra check to make sure user can’t exploit any potential quote escaping

vulnerabilities with SQL/LDAP databases. If you want to allow all characters,

set this value to empty.

#auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@

Username character translations before it’s looked up from databases. The

value contains series of from -> to characters. For example "#@/@" means

that ‘#’ and ‘/’ characters are translated to ‘@’.

#auth_username_translation =

Username formatting before it’s looked up from databases. You can use

the standard variables here, eg. %Lu would lowercase the username, %n would

drop away the domain if it was given, or “%n-AT-%d” would change the ‘@’ into

"-AT-". This translation is done after auth_username_translation changes.

#auth_username_format =

If you want to allow master users to log in by specifying the master

username within the normal username string (ie. not using SASL mechanism’s

support for it), you can specify the separator character here. The format

is then[username><separator><master username>. UW-IMAP uses "*" as the

separator, so that could be a good choice.

#auth_master_user_separator =

Username to use for users logging in with ANONYMOUS SASL mechanism

#auth_anonymous_username = anonymous

More verbose logging. Useful for figuring out why authentication isn’t

working.

#auth_verbose = no

Even more verbose logging for debugging purposes. Shows for example SQL

queries.

#auth_debug = no

In case of password mismatches, log the passwords and used scheme so the

problem can be debugged. Requires auth_debug=yes to be set.

#auth_debug_passwords = no

Maximum number of dovecot-auth worker processes. They’re used to execute

blocking passdb and userdb queries (eg. MySQL and PAM). They’re

automatically created and destroyed as needed.

#auth_worker_max_count = 30

Kerberos keytab to use for the GSSAPI mechanism. Will use the system

default (usually /etc/krb5.keytab) if not specified.

#auth_krb5_keytab =

auth default {

Space separated list of wanted authentication mechanisms:

plain login digest-md5 cram-md5 ntlm rpa apop anonymous gssapi

mechanisms = plain

Password database is used to verify user’s password (and nothing more).

You can have multiple passdbs and userdbs. This is useful if you want to

allow both system users (/etc/passwd) and virtual users to login without

duplicating the system users into virtual database.

http://wiki.dovecot.org/PasswordDatabase

By adding master=yes setting inside a passdb you make the passdb a list

of “master users”, who can log in as anyone else. Unless you’re using PAM,

you probably still want the destination user to be looked up from passdb

that it really exists. This can be done by adding pass=yes setting to the

master passdb.

http://wiki.dovecot.org/MasterPassword

Users can be temporarily disabled by adding a passdb with deny=yes.

If the user is found from that database, authentication will fail.

The deny passdb should always be specified before others, so it gets

checked first. Here’s an example:

#passdb passwd-file {
# File contains a list of usernames, one per line
#args = /etc/dovecot.deny
#deny = yes
#}

PAM authentication. Preferred nowadays by most systems.

Note that PAM can only be used to verify if user’s password is correct,

so it can’t be used as userdb. If you don’t want to use a separate user

database (passwd usually), you can use static userdb.

REMEMBER: You’ll need /etc/pam.d/dovecot file created for PAM

authentication to actually work.

http://wiki.dovecot.org/PasswordDatabase/PAM

passdb pam {
}

/etc/passwd or similar, using getpwnam()

In many systems nowadays this uses Name Service Switch, which is

configured in /etc/nsswitch.conf.

http://wiki.dovecot.org/AuthDatabase/Passwd

#passdb passwd {
#}

/etc/shadow or similiar, using getspnam(). Deprecated by PAM nowadays.

http://wiki.dovecot.org/PasswordDatabase/Shadow

#passdb shadow {
#}

PAM-like authentication for OpenBSD.

http://wiki.dovecot.org/PasswordDatabase/BSDAuth

#passdb bsdauth {
# [[cache_key=<key>]] - See cache_key in PAM for explanation.
#args =
#}

passwd-like file with specified location

http://wiki.dovecot.org/AuthDatabase/PasswdFile

#passdb passwd-file {
# Path for passwd-file
#args =
#}

checkpassword executable authentication

NOTE: You will probably want to use "userdb prefetch" with this.

http://wiki.dovecot.org/PasswordDatabase/CheckPassword

#passdb checkpassword {
# Path for checkpassword binary
#args =
#}

SQL database

http://wiki.dovecot.org/AuthDatabase/SQL

#passdb sql {
# Path for SQL configuration file, see doc/dovecot-sql.conf for example
#args =
#}

LDAP database

http://wiki.dovecot.org/AuthDatabase/LDAP

#passdb ldap {
# Path for LDAP configuration file, see doc/dovecot-ldap.conf for example
#args =
#}

vpopmail authentication

http://wiki.dovecot.org/AuthDatabase/VPopMail

#passdb vpopmail {
# [[cache_key=<key>]] - See cache_key in PAM for explanation.
#args =
#}

User database specifies where mails are located and what user/group IDs

own them. For single-UID configuration use "static".

http://wiki.dovecot.org/UserDatabase

/etc/passwd or similar, using getpwnam()

In many systems nowadays this uses Name Service Switch, which is

configured in /etc/nsswitch.conf. WARNING: nss_ldap is known to be broken

with Dovecot. Don’t use it, or users might log in as each others!

http://wiki.dovecot.org/AuthDatabase/Passwd

userdb passwd {
}

passwd-like file with specified location

http://wiki.dovecot.org/AuthDatabase/PasswdFile

#userdb passwd-file {
# Path for passwd-file
#args =
#}

static settings generated from template

http://wiki.dovecot.org/UserDatabase/Static

#userdb static {
# Template for the fields. Can return anything a userdb could normally
# return. For example:
#
# args = uid=500 gid=500 home=/var/mail/%u
#
#args =
#}

SQL database

http://wiki.dovecot.org/AuthDatabase/SQL

#userdb sql {
# Path for SQL configuration file, see doc/dovecot-sql.conf for example
#args =
#}

LDAP database

http://wiki.dovecot.org/AuthDatabase/LDAP

#userdb ldap {
# Path for LDAP configuration file, see doc/dovecot-ldap.conf for example
#args =
#}

vpopmail

http://wiki.dovecot.org/AuthDatabase/VPopMail

#userdb vpopmail {
#}

"prefetch" user database means that the passdb already provided the

needed information and there’s no need to do a separate userdb lookup.

This can be made to work with SQL and LDAP databases, see their example

configuration files for more information how to do it.

http://wiki.dovecot.org/UserDatabase/Prefetch

#userdb prefetch {
#}

User to use for the process. This user needs access to only user and

password databases, nothing else. Only shadow and pam authentication

requires roots, so use something else if possible. Note that passwd

authentication with BSDs internally accesses shadow files, which also

requires roots. Note that this user is NOT used to access mails.

That user is specified by userdb above.

user = root

Directory where to chroot the process. Most authentication backends don’t

work if this is set, and there’s no point chrooting if auth_user is root.

Note that valid_chroot_dirs isn’t needed to use this setting.

#chroot =

Number of authentication processes to create

#count = 1

Require a valid SSL client certificate or the authentication fails.

#ssl_require_client_cert = no

Take the username from client’s SSL certificate, using

X509_NAME_get_text_by_NID() which returns the subject’s DN’s

CommonName.

#ssl_username_from_cert = no

It’s possible to export the authentication interface to other programs:

#socket listen {
#master {
# Master socket is typically used to give Dovecot’s local delivery
# agent access to userdb so it can find mailbox locations. It can
# however also be used to disturb regular user authentications.
# WARNING: Giving untrusted users access to master socket may be a
# security risk, don’t give too wide permissions to it!
#path = /var/run/dovecot/auth-master
#mode = 0600
# Default user/group is the one who started dovecot-auth (root)
#user =
#group =
#}
#client {
# The client socket is generally safe to export to everyone. Typical use
# is to export it to your SMTP server so it can do SMTP AUTH lookups
# using it.
#path = /var/run/dovecot/auth-client
#mode = 0660
#}
#}
}

If you wish to use another authentication server than dovecot-auth, you can

use connect sockets. They assumed to be already running, Dovecot’s master

process only tries to connect to them. They don’t need any other settings

than the path for the master socket, as the configuration is done elsewhere.

Note that the client sockets must exist in the login_dir.

#auth external {

socket connect {

master {

path = /var/run/dovecot/auth-master

}

}

#}

Dictionary server settings

Dictionary can be used by some plugins to store key=value lists.

Currently this is only used by dict quota backend. The dictionary can be

used either directly or though a dictionary server. The following dict block

maps dictionary names to URIs when the server is used. These can then be

referenced using URIs in format "proxy:<name>".

dict {
#quota = mysql:/etc/dovecot-dict-quota.conf
}

Plugin settings

plugin {

Here you can give some extra environment variables to mail processes.

This is mostly meant for passing parameters to plugins. %variable

expansion is done for all values.

Quota plugin. Multiple backends are supported:

dirsize: Find and sum all the files found from mail directory

dict: Keep quota stored in dictionary (eg. SQL)

maildir: Maildir++ quota

fs: Read-only support for filesystem quota

#quota = maildir

ACL plugin. vfile backend reads ACLs from "dovecot-acl" file from maildir

directory. You can also optionally give a global ACL directory path where

ACLs are applied to all users’ mailboxes. The global ACL directory contains

one file for each mailbox, eg. INBOX or sub.mailbox.

#acl = vfile:/etc/dovecot-acls

Convert plugin. If set, specifies the source storage path which is

converted to destination storage (mail_location).

#convert_mail = mbox:%h/mail

Trash plugin. When saving a message would make user go over quota, this

plugin automatically deletes the oldest mails from configured mailboxes

until the message can be saved within quota limits. The configuration file

is a text file where each line is in format:[priority>[mailbox name>

Mails are first deleted in lowest -> highest priority number order

#trash = /etc/dovecot-trash.conf
}