After doing en extensive research on the net for a similar setup (without finding anything) and spending a full weekend trying to get this working, I've decided to create a tutorial that will provide a base to users that don't have a lot of mail server experience and the same setup.
I'm an email guy so I'm not sure if I'll be able to support in case you run into problems, but I'll try if I can. Also let me know if you think there's some wrong with the tutorial or anything that can be improved and I'll be happy to change.
Here's what I have at home:
- Ubuntu Server 8.10 32-bit (LAMP)
- dyndns
- Yahoo mail (not plus)
1- Getting your emails delivered to your account
1.a - Install fetchmail
$ sudo aptitude install fetchmail |
1.b - Create a .fetchmailrc in your home directory with the following info:
$ cd $HOME $ vim .fetchmailrc set syslog; set daemon 90; set postmaster "[user]@yahoo.ca"; poll "pop.mail.yahoo.ca" port 995 with protocol POP3 user "user@yahoo.ca" password "[yahoo_password]" is "[loginname_to_the_server]" here keep ssl smtphost "localhost" smtpname "[loginname_to_the_server]@localhost" |
Note: Do no use the square brackets. They are there only to indicate that you need to enter something.
- The above file will download only new emails and keep a copy on the server
1.c - Change permission of the file
$ chmod 600 .fetchmailrc |
1.d - Run fetchmail and check if new mail has arrived (make sure that there's one unread email on your yahoo account)
$ fetchmail |
- Press “q” to leave the mail reader
2- Setup postfix to delivery the messages for you
By default postfix should already be installed on your machine. But you still need to configure it do delivery your local emails to your local or Internet accounts.
2.a - Initial postfix configuration
$ sudo dpkg-reconfigure postfix |
Answer the questions at the prompt:
General type of mail configuration: Internet Site
NONE doesn't appear to be requested in current config
System mail name: server1.example.com
Root and postmaster mail recipient:
Other destinations for mail: server1.example.com, example.com, localhost.example.com, localhost
Force synchronous updates on mail queue?: No
Local networks: 127.0.0.0/8
Yes doesn't appear to be requested in current config
Mialbox size limit (bytes): 0
Local address extension character: +
Internet protocols to use: all
Once this is set you should be able to send emails locally. Restart postfix and try sending an email to yourself with the following command:
$ sudo /etc/init.d/postfix restart $ mail [your_user_name]@localhost Subject: Testing This is a test # press Ctrl+d to end the message body Cc: # press enter Mail version 8.1.2 01/15/2001. Type ? for help. "/var/mail/user": 1 messages 1 new > N 1 user@hostname Sun Jun 7 20:08 14/464 Testing |
2.b - Fine tunning postfix
Check the following file and make sure that it has you server's FQDN
$ cat /etc/mailname myserver.dyndns.org |
Now we need to create an authorization file that will be used for your login and them run postmap on it to create a db file. The file should look like this:
$ sudo cat /etc/poistfix/sasl/smtp_auth 127.0.0.1 [username]@yahoo.ca:[password ] $ sudo postmap /etc/poistfix/sasl/smtp_auth |
Let's edit your postfix mail file to look similar to this:
$ grep -v '#' /etc/postfix/main.cf smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu) biff = yes append_dot_mydomain = no readme_directory = no smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key smtpd_use_tls=no smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases myorigin = /etc/mailname mydestination = [fqdn], [hostname].[domain_name,] localhost.[domain_name], localhost relayhost = 127.0.0.1:11125 # this will be used with stunnel mailbox_command = procmail -a "$EXTENSION" DEFAULT=$HOME/Maildir/ MAILDIR=$HOME/Maildir mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = all inet_protocols = ipv4 smtp_sasl_auth_enable = yes smtp_sasl_security_options = noanonymous smtp_sasl_password_maps = hash:/etc/postfix/sasl/smtp_auth |
If everything went ok we can go to next step and install stunnel and configure for sending the email via port 465 (which is no longer supported by postfix).
3 - Stunnel
3.a - Installing and configuring stunnel
$ sudo aptitude install stunnel |
And configure you stunnel.conf to look like this:
$ grep -v ';' /etc/stunnel/stunnel.conf sslVersion = SSLv3 chroot = /var/lib/stunnel4/ setuid = stunnel4 setgid = stunnel4 pid = /stunnel4.pid socket = l:TCP_NODELAY=1 socket = r:TCP_NODELAY=1 client = yes [smtps] accept = 11125 client = yes connect = smtp.mail.yahoo.ca:465 # Make sure that the following lines are commented out: ;cert = /etc/stunnel/mail.pem ;cert = /etc/stunnel/stunnel.pem ;key = /etc/stunnel/mail.pem |
3.b - Starting and testing stunnel
$ sudo /etc/init.d/stunnel4 start $ telnet 127.0.0.1 11125 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. 220 smtp107.mail.mud.yahoo.com ESMTP >ehlo 250-smtp107.mail.mud.yahoo.com 250-AUTH LOGIN PLAIN XYMCOOKIE 250-PIPELINING 250 8BITMIME >quit 221 smtp107.mail.mud.yahoo.com Connection closed by foreign host. |
At this point you should be able to send and receive email from your yahoo account using the mail command. If for some reason you are having problems, check the troubleshooting section at the end of the tutorial for more help and links.
4 - Dovecot
4.a - Installing dovecot
$ sudo aptitude install dovecot-common dovecot-imapd dovecot-pop3d |
4.b - Configuring and testing dovecot
Dovecot is very straight forward for configuring. Check that /etc/dovecot/dovecot.conf has the following lines:
protocols = imap imaps pop3 pop3s protocols = imap imaps pop3 pop3s mail_privileged_group = mail |
Restart it and then we can test it with mutt:
$ sudo /etc/init.d/dovecot restart $ mutt -f imap://user@127.0.0.1/ |
5 - Configuring an email client
Most email clients are the same. I'll include here the basic settings that you will need to connect using the settings we have just created
=> Receiving email
Server: FQDN
Username: local username for the server
Security: TLS
=> Sending email
Server: FQDN
Security: No encryption
6 - Troubleshooting
6.a Useful commands
Commands to display and purge emails on the server:
# prints messages in queue $ postqueue -p # attempts to send messages - flush $ postqueue -f |
Check your logs for important messages as you attempt to send emails and start services
$ sudo tail -f /var/log/mail.log |
6.b - Useful links
- Ubuntu Documentation for postfix
https://help.ubuntu.com/community/Postfix
- Postfix as client only (what we used here)
http://www.postfix.org/SASL_README.html#client_sasl
- Postfix port 465
http://www.postfix.org/TLS_README.html
- Postifx authentication file
http://www.postfix.org/postconf.5.html#smtp_sasl_password_maps
- Relaying to an smtps host with postfix and stunnel
http://www.eglug.org/book/export/html/1923
- Generates pem key for stunnel (we are not using it here)
http://www.stunnel.org/pem/
- Troubleshooting stunnel
http://ubuntuforums.org/showthread.php?t=983926
- Postfix and Dovecot on Ubuntu Dapper Drake
http://adomas.org/2006/08/postfix-dovecot/
5 comments:
Got some questions about fetchmail.
Since you're using a .fetchmailrc in your homedir, I'm assuming you're running fetchmail as your user rather than as a system service. Having specified the daemon option in your config, I believe that fetchmail will daemonize when you run it.
Since you're not running it as a system service, how do you ensure that your user's instance of fetchmail is running when the system starts? Do you use a cron job?
Hi Zach,
I haven't implemented any automation because I barely reboot the machine. But a link to a script in /etc/rc.local should take care of the problem. Something like:
ps aux | grep fetchmail | grep -v grep > /dev/null
if [ "$?" != "0" ] ; then
su user -c 'fetchmail'
fi
Add the name of the script to /etc/rc.local and you should be home free.
Another option would be to add the settings under /etc/fetchmailrc, but I did not try that setup. It might actually be easier.
Vic.
Vic,
Thanks for the tip. I decided to run fetchmail as a cron job that starts at boot and runs as my user:
@reboot /usr/bin/fetchmail
interesting post. I would love to follow you on twitter.
Thank you for the information, I think this article is very useful for all who read it.
.
Post a Comment