Setup dbmail with Sendmail

author Brad

The original instructions (kept below) for setting up DBMail with Sendmail were not easy to follow and possibly not complete/correct. I just installed DBMail using the instructions here quickly and easily:

My install was with FreeBSD but will also work for Linux. I used FreeBSD's ports system to compile the source. I modified the Makefile to use the latest DBMail version. I am using MySQL.

Install as per usual, as documented on this website and on the helgrim.com link.

The following section is copied from the helgrim.com link for convenience.

Sendmail

Given the high flexibility of sendmail, there are many ways to use it with dbmail. The easiest method is to create a sendmail mailer definition for dbmail, and use the mailertable to deliver mail to dbmail on a per-domain basis. This still allows for normal local delivery for other domains.

Creating a mailer definition

First, you need to know the location of your sendmail sources. This can vary depending on OS distribtion. On FreeBSD, for example, it resides at /usr/share/sendmail/cf, whereas on OpenBSD it is /usr/share/sendmail.

If you are unsure, use a tool such as locate to search for mailer/local.m4, which should be in the main directory

    % locate mailer/local.m4
    /usr/share/sendmail/mailer/local.m4
    In this case, if is /usr/share/sendmail

Use the following m4 config and copy it into the mailer directory (eg /usr/share/sendmail/cf/mailer/dbmail.m4). This provides the definitions required to use dbmail as a mailer.

PUSHDIVERT(-1)
# 2003 Chrysalink Systems 
# Send feedback to dbmail@chrysalink.net
#

ifdef(`DBMAIL_MAILER_PATH',,
	`ifdef(`DBMAIL_PATH',
		`define(`DBMAIL_MAILER_PATH', DBMAIL_PATH)',
		`define(`DBMAIL_MAILER_PATH', /usr/local/sbin/dbmail-smtp)')')
_DEFIFNOT(`DBMAIL_MAILER_FLAGS', `SPhnu9')
ifdef(`DBMAIL_MAILER_ARGS',,
	`define(`DBMAIL_MAILER_ARGS', `dbmail -d $u')')

POPDIVERT

######################*****##############
###   DBMAIL Mailer specification   ###
##################*****##################

VERSIONID(`$Id: dbmail.m4,v 8.23 2003/07/14 13:48:51 feargal Exp $')

Mdbmail,	P=DBMAIL_MAILER_PATH, F=_MODMF_(CONCAT(`DFM', DBMAIL_MAILER_FLAGS), `DBMAIL'), S=EnvFromSMTP/HdrFromSMTP, R=EnvToSMTP/HdrFromSMTP,
		ifdef(`DBMAIL_MAILER_MAX', `M=DBMAIL_MAILER_MAX, ')T=DNS/RFC822/X-Unix,
		A=DBMAIL_MAILER_ARGS

(Make sure you have the proper path to /usr/local/sbin/dbmail-smtp; dbmail-smtp may be installed elsewhere on your system).

Now you need to build a .cf file for sendmail to use. The exact process depends on your sendmail installation.

General

          # cd /etc/mail

Add the following line to your sendmail.mc file

          MAILER(dbmail)

Rebuild your sendmail.cf:

          # /usr/bin/m4 -D_CF_DIR_=/usr/share/sendmail/ /usr/share/sendmail/m4/cf.m4 sendmail.mc > sendmail.cf

FreeBSD

Note by Andrea Brancatelli: To me the part about FreeBSD seems wrong. As soon as I have some time I'll write down the correct one. In the meantime pay attention and don't follow it blindly!

On FreeBSD, the mailer directory is in /usr/share/sendmail/cf.

          # cd /etc/mail

Add the following line to freebsd.mc:

          MAILER(dbmail)

Rebuild:

          # make freebsd.cf
          /usr/bin/m4 -D_CF_DIR_=/usr/share/sendmail/cf/ /usr/share/sendmail/cf/m4/cf.m4 freebsd.mc > freebsd.cf
          # make install
          install -m 444 freebsd.cf /etc/mail/sendmail.cf
          install -m 444 freebsd.submit.cf /etc/mail/submit.cf

SuSE Linux

On SuSE Linux, the mailer directory should be in /usr/share/sendmail.

          # cd /etc/mail

Add the following line to linux.mc:

          MAILER(dbmail)

Now create the sendmail.cf

          # /usr/bin/m4 -D_CF_DIR_=/usr/share/sendmail/ /usr/share/sendmail/m4/cf.m4 linux.mc > linux.cf
          # cp linux.cf sendmail.cf

Configure the mailertable

Make sure your sendmail installation includes mailertable support. There should be a line in your sendmail.cf similar to:

    Kmailertable hash -o /etc/mail/mailertable

If not, you need to add the following to your .mc file, and rebuild your configuration as described above.

    FEATURE(mailertable, `hash -o /etc/mail/mailertable')

Edit the mailertable and add an entry for each domain you want to use dbmail with:

    domain.example.com dbmail:domain.example.com

Note, make sure domain.example.com is not in local-host-names or local-host-name, or sendmail will use local delivery instead.

Re-make your maps and restart sendmail

General:

    # makemap hash /etc/mail/mailertable.db < /etc/mail/mailertable
    # kill -HUP `head -1 /var/run/sendmail.pid`

FreeBSD:

    # cd /etc/mail
    # make maps
    # make restart

Finished

Complete the crontab to finish the install:

   00  3 * * * /usr/local/sbin/dbmail-util -ay

ORIGINAL INSTRUCTIONS:

Sendmail Howto based on Mike O'Brien instructions(from the mailling list):

author Marc

This howto is based on Debian, however should be portable to any other standard Sendmail install. To get dbmail-smtp of dbmail-lmtp to work, one needs to create new m4 macros. Create these files under /usr/share/sendmail/cf/mailer/

dbmail.m4:

PUSHDIVERT(-1)
ifdef(`DBMAIL_MAILER_PATH',,
	`ifdef(`DBMAIL_PATH',
		`define(`DBMAIL_MAILER_PATH', DBMAIL_PATH)',
		`define(`DBMAIL_MAILER_PATH', /usr/sbin/dbmail-smtp)')')
_DEFIFNOT(`DBMAIL_MAILER_FLAGS', `SPhnu9')
ifdef(`DBMAIL_MAILER_ARGS',,
	`define(`DBMAIL_MAILER_ARGS', `dbmail -d $u')')
POPDIVERT

Mdbmail,	P=DBMAIL_MAILER_PATH, F=_MODMF_(CONCAT(`DFM', DBMAIL_MAILER_FLAGS), `DBMAIL'), 
									S=EnvFromSMTP/HdrFromSMTP, R=EnvToSMTP/HdrFromSMTP,
		ifdef(`DBMAIL_MAILER_MAX', `M=DBMAIL_MAILER_MAX, ')T=DNS/RFC822/X-Unix,
		A=DBMAIL_MAILER_ARGS

dbmail-lmtp.m4:

PUSHDIVERT(-1)
ifdef(`DBMAIL_MAILER_PATH',,
	`ifdef(`DBMAIL_PATH',
	`define(`DBMAIL_MAILER_PATH', DBMAIL_PATH)',
	`define(`DBMAIL_MAILER_PATH', [IPC])')')
_DEFIFNOT(`DBMAIL_MAILER_FLAGS', `AhmXz5@/:|')
ifdef(`DBMAIL_MAILER_ARGS',,
`define(`DBMAIL_MAILER_ARGS', `TCP $h 24')')

POPDIVERT
Mdbmail-lmtp,	P=DBMAIL_MAILER_PATH, F=_MODMF_(CONCAT(`DFM', DBMAIL_MAILER_FLAGS), `DBMAIL'), 
				S=EnvFromSMTP/HdrFromSMTP, R=EnvToSMTP/HdrFromSMTP,
	ifdef(`DBMAIL_MAILER_MAX', `M=DBMAIL_MAILER_MAX, ')T=DNS/RFC822/X-Unix,
	A=DBMAIL_MAILER_ARGS

In dbmail-lmtp.m4 the connect port is set to port 24, change this if needed.

Then add the newly installed mailers and mailertable to /etc/mail/sendmail.mc:

FEATURE(`mailertable')dnl
MAILER(dbmail)dnl
MAILER(dbmail-lmtp)dnl

Now we have to tell sendmail to use the dbmail or dbmail-lmtp mailer for a given domain, otherwise it wil be handled as localmail. Assuming dbmail-lmtp is running on localhost. Edit /etc/mail/mailertable:

foo.com   dbmail-lmtp:[127.0.0.1]
bar.com   dbmail

Type make in /etc/mail, and reload your sendmail. Then test your configuration. Virtusertable and accesstable should work as with local mailers.

Setting up SMTP Auth with sasl2 and PostgreSQL

Add the following to sendmail.mc

include(`/etc/mail/sasl/sasl.m4')dnl

Then edit /etc/mail/sasl/Sendmail.conf.2 assuming the dbmail database runs on localhost. It is possible to add multiple databases in the configfile. On BSD systems it is located at /usr/local/lib/sasl2/Sendmail.conf

pwcheck_method: auxprop
auxprop_plugin: sql
sql_engine: pgsql
mech_list: DIGEST-MD5 CRAM-MD5 PLAIN LOGIN
Sql_hostnames: localhost[:port]
sql_user: dbmail
sql_passwd: [password]
sql_database: dbmail
sql_verbose: yes
sql_select: SELECT passwd FROM dbmail_users WHERE userid = '%u'

Type make in the /etc/mail directory to update sendmail.cf and reload sendmail. Test your configuration. /var/log/auth.log gives plenty information when authentication fails.

dbmail as the local mailer

This allows you to use dbmail as the local delivery agent. With this configuration you will not use the system alias file and you will have to transcribe those int atmail.

in sendmail.mc add the lines:

FEATURE(`stickyhost')dnl

MAILER(dbmail-local)dnl
define(`MAIL_HUB',`dbmail-local:localhost')dnl

under /usr/share/sendmail-cf/mailer/ create dbmail-local.m4

PUSHDIVERT(-1)
	ifdef(`DBMAIL_MAILER_PATH',,
       `ifdef(`DBMAIL_PATH',
       `define(`DBMAIL_MAILER_PATH', DBMAIL_PATH)',
       `define(`DBMAIL_MAILER_PATH', [IPC])')')
_DEFIFNOT(`DBMAIL_MAILER_FLAGS', `hmXz@/:|')
ifdef(`DBMAIL_MAILER_ARGS',,
`define(`DBMAIL_MAILER_ARGS', `TCP $h 24')')
POPDIVERT
Mdbmail-local,  P=DBMAIL_MAILER_PATH, F=_MODMF_(CONCAT(`DFM', DBMAIL_MAILER_FLAGS), `DBMAIL'),S=EnvFromSMTP/HdrFromSMTP, R=EnvToSMTP,
                T=DNS/RFC822/SMTP, 
                A=DBMAIL_MAILER_ARGS

(ensure that there are no extra spaces before lines; sendmail is very finnicky when it comes to it’s sendmail.cf)

add your local domains to local-host-names

Type make in /etc/mail, and reload your sendmail. Then test your configuration.

Michael Luich

DBMail is sponsored by