<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html 
     PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Converting from qmail to LDAP-based Exim</title>
<meta name="title" content="Converting from qmail to LDAP-based Exim" />
<meta name="author" content="mah@everybody.org" />
<style type="text/css">
@import "/mah.css";
<!-- Old browsers can't touch this -->
</style>
</head>
<body>
<div id="header">
<p><a href="/">top</a>::<a href="/docs/">docs</a>
</p>
<h1>Converting from qmail to LDAP-based Exim</h1>
by <a href="http://mah.everybody.org/">Mark A. Hershberger</a> (<a href="http://mah.everybody.org/weblog/">weblog</a>)
</div>
<div id="googlead">
<script type="text/javascript"><!--
google_ad_client = "pub-3932658445533817";
google_ad_width = 120;
google_ad_height = 600;
google_ad_format = "120x600_as";
google_ad_type = "text";
google_ad_channel ="";
google_color_border = "E0FFE3";
google_color_bg = "E0FFE3";
google_color_link = "0000CC";
google_color_url = "008000";
google_color_text = "000000";
//--></script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>
<div id="main">
<p>
</p>

<p class="note">
Software used:
<ul>
  <li>FreeBSD 4.0-STABLE</li>
  <li>qmail 1.03</li>
  <li>openldap 2.0.7</li>
  <li>exim 3.22</li>
  <li>Cyrus 1.6.22</li>
  <li>pam_ldap 107</li>
</ul>
</p>

<p>
After using qmail for almost a year, I decided to switch to exim
for a few reasons:</p>
<ul>
  <li>Support.  Debian uses exim as its default mailer, so I figured I
      could find plenty of people who used it.  In fact, I originally
      thought about switching back to sendmail, but I've played with
      that enough that I knew things would be <i>too</i> easy with
      it.</li>
   <li>LDAP integration.  I want to move away from passwd-based
      authentication systems to LDAP since it seems that I could offer
      <a href="http://everybody.org/faq/accounts.html">graded
      accounts</a> using LDAP to set privs.
   <li>Perl Integration.  This is the real selling point for me.  I
      <i>love</i> perl and the more places I can stick it, the better.
</ul>
</p>

<h2>Compiling exim</h2>
<p>
  <b>Easy</b>.  The <a href="http://www.freebsd.org/ports/"FreeBSD
      ports tree</a> included it with options to link against <a
      href="http://www.openssl.org/">OpenSSL</a> and <a
      href="http://www.openldap.org/">OpenLDAP</a>.  Can't get much
      simpler than:
<pre>
    $ cd /usr/ports/mail/exim
    $ make WITH_LDAP=yes WITH_PAM=yes WITH_TLS=yes            WITH_PERL=yes LDAP_LIB_TYPE=OPENLDAP2
    $ sudo make install
</pre>
      I did comment out the start line in the rc.d script for now till
      I get it running.
</p>

<h2>Compiling Cyrus</h2>
<p>
  Again, <b>easy</b>.  Just
<pre>
    $ cd /usr/ports/security/cyrus-sasl; make; sudo make install
    $ cd /usr/ports/mail/cyrus; make; sudo make install
</pre>
  It prompted me for what sort of authentication I wanted to use, and
  of course I said "OpenLDAP".
</p>

<h2>Integrating Exim with Cyrus</h2>
<p>
  Since exim's config is in /usr/local/etc/exim and qmail's 
  configuration resides in /var/qmail, I could now set up exim to
  deliver directly to cyrus without interfering with anything.
</p>

<h2>Outfitting Exim with RBL</h2>
<p>
  Added the following to the exim config:
<pre>
    rbl_domains = blackholes.mail-abuse.org:dialups.mail-abuse.org:relays.mail-abuse.org
</pre>
</p>

<h2>Converting dot-qmail files to /etc/alias entries</h2>
<p>
I used the following script to change my .qmail* files to entries in
the /etc/alias file:
<div class="file-quote">
#!/bin/sh<br /><br />#&nbsp;User&nbsp;of&nbsp;qmail's&nbsp;alias<br />alias=alias<br /><br />#&nbsp;Where&nbsp;we&nbsp;want&nbsp;the&nbsp;aliases&nbsp;kept<br />aliasfile=/usr/local/etc/exim/aliases<br /><br />#&nbsp;DBM&nbsp;maker<br />exim_dbm=/usr/local/sbin/exim_dbmbuild<br /><br />#&nbsp;User&nbsp;mailman&nbsp;runs&nbsp;as<br />mailman=mailman<br /><br />#&nbsp;find&nbsp;all&nbsp;non-mailman/alias&nbsp;users<br />users=`awk&nbsp;'BEGIN&nbsp;{FS=":"}&nbsp;!/'$alias'|'$mailman'/&nbsp;{print&nbsp;$1}'&nbsp;&lt;&nbsp;/etc/passwd&nbsp;|&nbsp;sort&nbsp;|&nbsp;xargs`<br /><br />for&nbsp;user&nbsp;in&nbsp;$users;&nbsp;do<br />&nbsp;&nbsp;&nbsp;&nbsp;homedir=`sh&nbsp;-c&nbsp;"echo&nbsp;~$user"`<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;q&nbsp;in&nbsp;$homedir/.qmail*;&nbsp;do<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;[&nbsp;-f&nbsp;$q&nbsp;];&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$user&nbsp;-\&gt;&nbsp;$q<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sudo&nbsp;-u&nbsp;$user&nbsp;sh&nbsp;-c&nbsp;"cat&nbsp;$q&nbsp;|&nbsp;sed&nbsp;'s,^&amp;,,'&nbsp;&gt;&nbsp;$homedir/.forward"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cat&nbsp;$homedir/.forward&nbsp;&amp;&amp;&nbsp;sudo&nbsp;rm&nbsp;$q<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi<br />&nbsp;&nbsp;&nbsp;&nbsp;done<br />done;<br /><br />sudo&nbsp;rm&nbsp;$aliasfile&nbsp;$aliasfile.db<br />homedir=`sh&nbsp;-c&nbsp;"echo&nbsp;~alias"`<br />for&nbsp;f&nbsp;in&nbsp;$homedir/.qmail*;&nbsp;do<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;[&nbsp;-f&nbsp;$f&nbsp;];&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name_from=`echo&nbsp;$f&nbsp;|&nbsp;sed&nbsp;'s,.*/\.qmail-,,'`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name_from=`echo&nbsp;$name_from&nbsp;|&nbsp;sed&nbsp;'s,^/.*,alias,'`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name_to=`cat&nbsp;$f&nbsp;|&nbsp;sed&nbsp;'s,^&amp;,,'`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$name_from&nbsp;=\&gt;&nbsp;$name_to<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sudo&nbsp;sh&nbsp;-c&nbsp;"echo&nbsp;$name_from&nbsp;$name_to&nbsp;&gt;&gt;&nbsp;$aliasfile"<br />&nbsp;&nbsp;&nbsp;&nbsp;fi<br />done;<br />sudo&nbsp;$exim_dbm&nbsp;$aliasfile&nbsp;$aliasfile.db<br /><br />
</div>

</p>

<h2>Converting mailman aliases</h2>

Very, very simple.  Just follow <a
href="http://www.exim.org/howto/mailman.html">
the directions for mailman integration
on the website</a>.

<h2>Testing</h2>

<p>At this point, I had a working setup to test.  Using the following
configure file, this is simply the drop-in replacement of exim for
qmail.  There are no LDAP lookups; there is no cyrus delivery.  This
is simply to have something in place that works.  I will build on
this.</p>

<p>Note the mailman components of this configuration.  Exim is set up
so that all one has to do is run <tt>newlist</tt> for mailman and Exim
will automatically begin to deliver those messages.  Also, note that
the mailing lists are in the lists.everybody.org domain.

<div class="file-quote">
#&nbsp;home&nbsp;dir&nbsp;for&nbsp;mailman<br />MAILMAN_HOME=/home/websites/lists.everybody.org/<br /><br />#&nbsp;wrapper&nbsp;script&nbsp;for&nbsp;mailman<br />MAILMAN_WRAP=MAILMAN_HOME/mail/wrapper<br /><br />#&nbsp;user&nbsp;and&nbsp;group&nbsp;for&nbsp;mailman<br />MAILMAN_UID=mailman<br />MAILMAN_GID=mailman<br /><br />######################################################################<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MAIN&nbsp;CONFIGURATION&nbsp;SETTINGS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#<br />######################################################################<br /><br />primary_hostname&nbsp;=&nbsp;everybody.org<br />local_domains&nbsp;=&nbsp;everybody.org:everyhost.com:slideshow.org:lists.everybody.org<br /><br />#&nbsp;No&nbsp;local&nbsp;deliveries&nbsp;will&nbsp;ever&nbsp;be&nbsp;run&nbsp;under&nbsp;the&nbsp;uids&nbsp;of&nbsp;these&nbsp;users<br />exim_user&nbsp;=&nbsp;root<br />exim_group&nbsp;=&nbsp;mail<br />never_users&nbsp;=&nbsp;root&nbsp;:&nbsp;root<br /><br />#&nbsp;Local&nbsp;relays&nbsp;are&nbsp;necessary&nbsp;for&nbsp;mailman,&nbsp;and&nbsp;they&nbsp;don't&nbsp;really&nbsp;hurt.<br />host_accept_relay&nbsp;=&nbsp;"127.0.0.1/32"<br /><br />#&nbsp;We&nbsp;only&nbsp;accept&nbsp;unqualified&nbsp;email&nbsp;addresses&nbsp;from&nbsp;localhost<br />receiver_unqualified_hosts&nbsp;=&nbsp;"127.0.0.1/32"<br />sender_unqualified_hosts&nbsp;=&nbsp;"127.0.0.1/32"<br /><br />#&nbsp;We&nbsp;block&nbsp;all&nbsp;of&nbsp;RBL,&nbsp;DUL,&nbsp;and&nbsp;RSS.&nbsp;&nbsp;Later&nbsp;we&nbsp;may&nbsp;turn&nbsp;this&nbsp;to<br />#&nbsp;warnings&nbsp;and&nbsp;filter&nbsp;on&nbsp;the&nbsp;warnings.<br />rbl_domains&nbsp;=&nbsp;blackholes.mail-abuse.org:dialups.mail-abuse.org:relays.mail-abuse.org<br /><br />pid_file_path&nbsp;=&nbsp;/var/run/exim%s.pid<br /><br />end<br /><br /><br /><br />######################################################################<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TRANSPORTS&nbsp;CONFIGURATION&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#<br />######################################################################<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORDER&nbsp;DOES&nbsp;NOT&nbsp;MATTER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Only&nbsp;one&nbsp;appropriate&nbsp;transport&nbsp;is&nbsp;called&nbsp;for&nbsp;each&nbsp;delivery.&nbsp;&nbsp;&nbsp;&nbsp;#<br />######################################################################<br /><br />remote_smtp:<br />&nbsp;&nbsp;driver&nbsp;=&nbsp;smtp<br /><br />#&nbsp;We&nbsp;use&nbsp;procmail&nbsp;for&nbsp;local&nbsp;delivery<br />procmail_pipe:<br />&nbsp;&nbsp;driver&nbsp;=&nbsp;pipe<br />&nbsp;&nbsp;command&nbsp;=&nbsp;"/usr/local/bin/procmail&nbsp;-d&nbsp;${local_part}"<br />&nbsp;&nbsp;return_path_add<br />&nbsp;&nbsp;delivery_date_add<br />&nbsp;&nbsp;envelope_to_add<br />&nbsp;&nbsp;check_string&nbsp;=&nbsp;"From&nbsp;"<br />&nbsp;&nbsp;escape_string&nbsp;=&nbsp;"&gt;From&nbsp;"<br />&nbsp;&nbsp;user&nbsp;=&nbsp;$local_part<br />&nbsp;&nbsp;group&nbsp;=&nbsp;mail<br /><br />#&nbsp;This&nbsp;is&nbsp;the&nbsp;normal&nbsp;local&nbsp;delivery<br />local_delivery:<br />&nbsp;&nbsp;driver&nbsp;=&nbsp;appendfile<br />&nbsp;&nbsp;file&nbsp;=&nbsp;/var/mail/${local_part}<br />&nbsp;&nbsp;delivery_date_add<br />&nbsp;&nbsp;envelope_to_add<br />&nbsp;&nbsp;return_path_add<br />&nbsp;&nbsp;group&nbsp;=&nbsp;mail<br />&nbsp;&nbsp;mode&nbsp;=&nbsp;0660<br /><br /><br />address_pipe:<br />&nbsp;&nbsp;driver&nbsp;=&nbsp;pipe<br />&nbsp;&nbsp;return_output<br /><br />address_file:<br />&nbsp;&nbsp;driver&nbsp;=&nbsp;appendfile<br />&nbsp;&nbsp;delivery_date_add<br />&nbsp;&nbsp;envelope_to_add<br />&nbsp;&nbsp;return_path_add<br /><br />address_reply:<br />&nbsp;&nbsp;driver&nbsp;=&nbsp;autoreply<br /><br /><br />##&nbsp;Three&nbsp;transports&nbsp;for&nbsp;list&nbsp;mail,&nbsp;request&nbsp;mail&nbsp;and&nbsp;admin&nbsp;mail<br />##&nbsp;respectively<br />##&nbsp;Mailman&nbsp;is&nbsp;installed&nbsp;in&nbsp;MAILMAN_HOME<br />##&nbsp;Mailman&nbsp;is&nbsp;configured&nbsp;to&nbsp;be&nbsp;invoked&nbsp;as&nbsp;user&nbsp;MAILMAN_UID<br />list_transport:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;driver&nbsp;=&nbsp;pipe<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;command&nbsp;=&nbsp;MAILMAN_WRAP&nbsp;post&nbsp;${lc:$local_part}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current_directory&nbsp;=&nbsp;MAILMAN_HOME<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;home_directory&nbsp;=&nbsp;MAILMAN_HOME<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user&nbsp;=&nbsp;MAILMAN_UID<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;group&nbsp;=&nbsp;MAILMAN_GID<br /><br />list_request_transport:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;driver&nbsp;=&nbsp;pipe<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;command&nbsp;=&nbsp;MAILMAN_WRAP&nbsp;mailcmd&nbsp;${lc:$local_part}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current_directory&nbsp;=&nbsp;MAILMAN_HOME<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;home_directory&nbsp;=&nbsp;MAILMAN_HOME<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user&nbsp;=&nbsp;MAILMAN_UID<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;group&nbsp;=&nbsp;MAILMAN_GID<br /><br />list_admin_transport:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;driver&nbsp;=&nbsp;pipe<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;command&nbsp;=&nbsp;MAILMAN_WRAP&nbsp;mailowner&nbsp;${lc:$local_part}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current_directory&nbsp;=&nbsp;MAILMAN_HOME<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;home_directory&nbsp;=&nbsp;MAILMAN_HOME<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user&nbsp;=&nbsp;MAILMAN_UID<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;group&nbsp;=&nbsp;MAILMAN_GID<br /><br />###&nbsp;end&nbsp;of&nbsp;transports&nbsp;section&nbsp;fragment<br /><br />end<br /><br /><br /><br />######################################################################<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DIRECTORS&nbsp;CONFIGURATION&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Specifies&nbsp;how&nbsp;local&nbsp;addresses&nbsp;are&nbsp;handled&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#<br />######################################################################<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORDER&nbsp;DOES&nbsp;MATTER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#<br />#&nbsp;&nbsp;&nbsp;A&nbsp;local&nbsp;address&nbsp;is&nbsp;passed&nbsp;to&nbsp;each&nbsp;in&nbsp;turn&nbsp;until&nbsp;it&nbsp;is&nbsp;accepted.&nbsp;&nbsp;#<br />######################################################################<br /><br />#&nbsp;Local&nbsp;addresses&nbsp;are&nbsp;those&nbsp;with&nbsp;a&nbsp;domain&nbsp;that&nbsp;matches&nbsp;some&nbsp;item&nbsp;in&nbsp;the<br />#&nbsp;"local_domains"&nbsp;setting&nbsp;above,&nbsp;or&nbsp;those&nbsp;which&nbsp;are&nbsp;passed&nbsp;back&nbsp;from&nbsp;the<br />#&nbsp;routers&nbsp;because&nbsp;of&nbsp;a&nbsp;"self=local"&nbsp;setting&nbsp;(not&nbsp;used&nbsp;in&nbsp;this&nbsp;configuration).<br /><br /><br />system_aliases:<br />&nbsp;&nbsp;driver&nbsp;=&nbsp;aliasfile<br />&nbsp;&nbsp;file&nbsp;=&nbsp;/usr/local/etc/exim/aliases<br />&nbsp;&nbsp;search_type&nbsp;=&nbsp;lsearch<br />&nbsp;&nbsp;file_transport&nbsp;=&nbsp;address_file<br />&nbsp;&nbsp;pipe_transport&nbsp;=&nbsp;address_pipe<br />&nbsp;&nbsp;user&nbsp;=&nbsp;root<br /><br />##&nbsp;Directors&nbsp;section&nbsp;[this&nbsp;deals&nbsp;with&nbsp;local&nbsp;addresses]<br />##&nbsp;<br />##&nbsp;First&nbsp;2&nbsp;directors&nbsp;rewrite&nbsp;list-owner&nbsp;or&nbsp;owner-list&nbsp;to&nbsp;list-admin<br />##&nbsp;This&nbsp;is&nbsp;only&nbsp;done&nbsp;if&nbsp;the&nbsp;list&nbsp;exists.<br />##&nbsp;List&nbsp;existence&nbsp;checks&nbsp;are&nbsp;done&nbsp;by&nbsp;seeing&nbsp;if&nbsp;the&nbsp;file<br />##&nbsp;MAILMAN_HOME/lists//config.db<br />##&nbsp;exists.&nbsp;&nbsp;<br /><br />list_owner_director:<br />&nbsp;&nbsp;&nbsp;driver&nbsp;=&nbsp;smartuser<br />&nbsp;&nbsp;&nbsp;domains&nbsp;=&nbsp;lists.everybody.org<br />&nbsp;&nbsp;&nbsp;require_files&nbsp;=&nbsp;MAILMAN_HOME/lists/${lc:$local_part}/config.db<br />&nbsp;&nbsp;&nbsp;suffix&nbsp;=&nbsp;"-owner"<br />&nbsp;&nbsp;&nbsp;new_address&nbsp;=&nbsp;"${lc:$local_part}-admin@${domain}"<br /><br />owner_list_director:<br />&nbsp;&nbsp;&nbsp;driver&nbsp;=&nbsp;smartuser<br />&nbsp;&nbsp;&nbsp;domains&nbsp;=&nbsp;lists.everybody.org<br />&nbsp;&nbsp;&nbsp;require_files&nbsp;=&nbsp;MAILMAN_HOME/lists/${lc:$local_part}/config.db<br />&nbsp;&nbsp;&nbsp;prefix&nbsp;=&nbsp;"owner-"<br />&nbsp;&nbsp;&nbsp;new_address&nbsp;=&nbsp;"${lc:$local_part}-admin@${domain}"<br /><br />##<br />##&nbsp;Next&nbsp;3&nbsp;directors&nbsp;direct&nbsp;admin,&nbsp;request&nbsp;and&nbsp;list&nbsp;mail&nbsp;to&nbsp;the&nbsp;appropriate<br />##&nbsp;transport.&nbsp;&nbsp;List&nbsp;existence&nbsp;is&nbsp;checked&nbsp;as&nbsp;above.<br /><br />list_admin_director:<br />&nbsp;&nbsp;&nbsp;driver&nbsp;=&nbsp;smartuser<br />&nbsp;&nbsp;&nbsp;domains&nbsp;=&nbsp;lists.everybody.org<br />&nbsp;&nbsp;&nbsp;suffix&nbsp;=&nbsp;-admin<br />&nbsp;&nbsp;&nbsp;require_files&nbsp;=&nbsp;MAILMAN_HOME/lists/${lc:$local_part}/config.db<br />&nbsp;&nbsp;&nbsp;transport&nbsp;=&nbsp;list_admin_transport<br /><br />list_request_director:<br />&nbsp;&nbsp;&nbsp;driver&nbsp;=&nbsp;smartuser<br />&nbsp;&nbsp;&nbsp;domains&nbsp;=&nbsp;lists.everybody.org<br />&nbsp;&nbsp;&nbsp;suffix&nbsp;=&nbsp;-request<br />&nbsp;&nbsp;&nbsp;require_files&nbsp;=&nbsp;MAILMAN_HOME/lists/${lc:$local_part}/config.db<br />&nbsp;&nbsp;&nbsp;transport&nbsp;=&nbsp;list_request_transport<br /><br />list_director:<br />&nbsp;&nbsp;&nbsp;driver&nbsp;=&nbsp;smartuser<br />&nbsp;&nbsp;&nbsp;domains&nbsp;=&nbsp;lists.everybody.org<br />&nbsp;&nbsp;&nbsp;require_files&nbsp;=&nbsp;MAILMAN_HOME/lists/${lc:$local_part}/config.db<br />&nbsp;&nbsp;&nbsp;transport&nbsp;=&nbsp;list_transport<br /><br />##&nbsp;End&nbsp;of&nbsp;directors&nbsp;fragment<br /><br /><br />#&nbsp;Handle&nbsp;forward&nbsp;files<br />userforward:<br />&nbsp;&nbsp;driver&nbsp;=&nbsp;forwardfile<br />&nbsp;&nbsp;file&nbsp;=&nbsp;.forward<br />&nbsp;&nbsp;no_verify<br />&nbsp;&nbsp;no_expn<br />&nbsp;&nbsp;check_ancestor<br />#&nbsp;filter<br />&nbsp;&nbsp;file_transport&nbsp;=&nbsp;address_file<br />&nbsp;&nbsp;pipe_transport&nbsp;=&nbsp;address_pipe<br />&nbsp;&nbsp;reply_transport&nbsp;=&nbsp;address_reply<br /><br /><br />#&nbsp;Do&nbsp;the&nbsp;local&nbsp;delivery&nbsp;with&nbsp;procmail<br />procmail:<br />&nbsp;&nbsp;driver&nbsp;=&nbsp;localuser<br />&nbsp;&nbsp;transport&nbsp;=&nbsp;procmail_pipe<br /><br />#&nbsp;Conventional&nbsp;local&nbsp;delivery<br />localuser:<br />&nbsp;&nbsp;driver&nbsp;=&nbsp;localuser<br />&nbsp;&nbsp;transport&nbsp;=&nbsp;local_delivery<br /><br /><br />end<br /><br /><br /><br />######################################################################<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ROUTERS&nbsp;CONFIGURATION&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Specifies&nbsp;how&nbsp;remote&nbsp;addresses&nbsp;are&nbsp;handled&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#<br />######################################################################<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORDER&nbsp;DOES&nbsp;MATTER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#<br />#&nbsp;&nbsp;A&nbsp;remote&nbsp;address&nbsp;is&nbsp;passed&nbsp;to&nbsp;each&nbsp;in&nbsp;turn&nbsp;until&nbsp;it&nbsp;is&nbsp;accepted.&nbsp;&nbsp;#<br />######################################################################<br /><br />#&nbsp;Remote&nbsp;addresses&nbsp;are&nbsp;those&nbsp;with&nbsp;a&nbsp;domain&nbsp;that&nbsp;does&nbsp;not&nbsp;match&nbsp;any&nbsp;item<br />#&nbsp;in&nbsp;the&nbsp;"local_domains"&nbsp;setting&nbsp;above.<br /><br /><br />#&nbsp;This&nbsp;router&nbsp;routes&nbsp;to&nbsp;remote&nbsp;hosts&nbsp;over&nbsp;SMTP&nbsp;using&nbsp;a&nbsp;DNS&nbsp;lookup&nbsp;with<br />#&nbsp;default&nbsp;options.<br />lookuphost:<br />&nbsp;&nbsp;driver&nbsp;=&nbsp;lookuphost<br />&nbsp;&nbsp;transport&nbsp;=&nbsp;remote_smtp<br /><br /><br />#&nbsp;This&nbsp;router&nbsp;routes&nbsp;to&nbsp;remote&nbsp;hosts&nbsp;over&nbsp;SMTP&nbsp;by&nbsp;explicit&nbsp;IP&nbsp;address,<br />#&nbsp;given&nbsp;as&nbsp;a&nbsp;"domain&nbsp;literal"&nbsp;in&nbsp;the&nbsp;form&nbsp;[nnn.nnn.nnn.nnn].&nbsp;The&nbsp;RFCs<br />#&nbsp;require&nbsp;this&nbsp;facility,&nbsp;which&nbsp;is&nbsp;why&nbsp;it&nbsp;is&nbsp;enabled&nbsp;by&nbsp;default&nbsp;in&nbsp;Exim.<br />#&nbsp;If&nbsp;you&nbsp;want&nbsp;to&nbsp;lock&nbsp;it&nbsp;out,&nbsp;set&nbsp;forbid_domain_literals&nbsp;in&nbsp;the&nbsp;main<br />#&nbsp;configuration&nbsp;section&nbsp;above.<br />literal:<br />&nbsp;&nbsp;driver&nbsp;=&nbsp;ipliteral<br />&nbsp;&nbsp;transport&nbsp;=&nbsp;remote_smtp<br /><br /><br />end<br /><br /><br /><br />######################################################################<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RETRY&nbsp;CONFIGURATION&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#<br />######################################################################<br /><br />#&nbsp;This&nbsp;single&nbsp;retry&nbsp;rule&nbsp;applies&nbsp;to&nbsp;all&nbsp;domains&nbsp;and&nbsp;all&nbsp;errors.&nbsp;It&nbsp;specifies<br />#&nbsp;retries&nbsp;every&nbsp;15&nbsp;minutes&nbsp;for&nbsp;2&nbsp;hours,&nbsp;then&nbsp;increasing&nbsp;retry&nbsp;intervals,<br />#&nbsp;starting&nbsp;at&nbsp;1&nbsp;hour&nbsp;and&nbsp;increasing&nbsp;each&nbsp;time&nbsp;by&nbsp;a&nbsp;factor&nbsp;of&nbsp;1.5,&nbsp;up&nbsp;to&nbsp;16<br />#&nbsp;hours,&nbsp;then&nbsp;retries&nbsp;every&nbsp;8&nbsp;hours&nbsp;until&nbsp;4&nbsp;days&nbsp;have&nbsp;passed&nbsp;since&nbsp;the&nbsp;first<br />#&nbsp;failed&nbsp;delivery.<br /><br />#&nbsp;Domain&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Error&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Retries<br />#&nbsp;------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-----&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-------<br /><br />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;F,2h,15m;&nbsp;G,16h,1h,1.5;&nbsp;F,4d,8h<br /><br />end<br /><br /><br /><br />######################################################################<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REWRITE&nbsp;CONFIGURATION&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#<br />######################################################################<br /><br />#&nbsp;There&nbsp;are&nbsp;no&nbsp;rewriting&nbsp;specifications&nbsp;in&nbsp;this&nbsp;default&nbsp;configuration&nbsp;file.<br /><br />#&nbsp;End&nbsp;of&nbsp;Exim&nbsp;configuration&nbsp;file<br />
</div>

</p>

<h2>Getting PAMized LDAP authentication working</h2>

<h2>Converting dot-qmail files to LDAP entries</h2>

<h2>Using LDAP to look up deliveries</h2>

<h2>Setting up SSL</h2>
<p>
Most of this comes from example configuration <code>C027</code> in the
<a
href="ftp://ftp.csx.cam.ac.uk/pub/software/email/exim/config.samples.tar.gz">configuration
samples</a>. Especially the following:
<table>
<tr><td><code>$ cd /usr/local/openssl/certs</code></td>
    <td><em>Directory already existed in this case</em></td></tr>
<tr><td><code>$ sudo sh -c 'openssl genrsa 1024 > exim.rsa'</code></td>
    <td><em>RSA key</em></td></tr>
<tr><td><code>$ sudo sh -c 'openssl gendh -rand /dev/urandom > exim.dh'</code></td>
    <td><em>Diffie-Hellman parameters</em></td></tr>
<tr><td><pre>
Using configuration from /etc/ssl/openssl.cnf
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [US]:
State or Province Name (full name) [Louisiana]:
Locality Name (eg, city) [New Orleans]:
Organization Name (eg, company) [Everybody Networks]:
Organizational Unit Name (eg, section) [webserver]:
Common Name (eg, YOUR name) [everybody.org]:
Email Address [mah@everybody.org]:
</pre></td>
<td>Q & A</td></tr>
<tr><td>
<code>
sudo sh -c 'cat everybody-org.rsa everybody-org.x509 everybody-org.dh
> everybody-org.pem'
</code>
</td>
<td></td></tr>
</table>

<p>
The signed cert is necessary for Outlook which won't take an unsigned
cert.
</p>

<p>
Added the following line to <code>/etc/inetd.conf</code>:
<pre>
<i># Following is for cyrus imap over ssl</i>
imaps  stream  tcp  nowait  cyrus  /usr/local/sbin/stunnel exim -l /usr/local/cyrus/bin/imapd -p /usr/local/openssl/certs/everybody-org.pem -- imapd
<i># SMTP Authentication only over SSL</i>
smtps  stream  tcp  nowait  mail   /usr/local/sbin/stunnel exim -l /usr/local/sbin/exim -p /usr/local/openssl/certs/everybody-org.pem -- exim -bs
</pre>
</p>

<p>
Alternatively, I could have put this in the rc script:
<pre>
  /usr/local/bin/stunnel -d 465 -l /usr/local/sbin/exim           -p /usr/local/openssl/certs/everybody-org.pem           -- exim -bs
</pre>
and
<pre>
  /usr/local/bin/stunnel -d 993 -l /usr/local/cyrus/bin/imapd           -p /usr/local/openssl/certs/everybody-org.pem           -- imapd
</pre>
</p>

<h2>Authentication</h2>
<p>
  I found these entries for the configuration file in C034:
<pre>
</div>
<hr />
<div id="footer">
<table width="100%"><tr><td>
<address>
<a href="mailto:mah@everybody.org">mah@everybody.org</a>
</address>
<span class="modified">Last Modified: Sat Jul  9 21:22:30 2005</span>
</td><td align="right">

<a href="http://jigsaw.w3.org/css-validator/check/referer">
<img src="http://jigsaw.w3.org/css-validator/images/vcss.gif"
     alt="Valid CSS!" height="31" width="88" /></a>

<a href="http://validator.w3.org/check/referer">
<img src="http://validator.w3.org/images/vxhtml10"
     alt="Valid XHTML 1.0!" height="31" width="88" /></a>

</td></tr></table>
</div>
</body></html>

