Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> почтовые системы —> exim&dovecot+postfixadmin

Установка почтового сервера Exim & Dovecot + Postfixadmin


Статья пишется..... Думаю скоро допишу и открою.





Ставим Apache 1.3

/usr/home/cancer/> cd /usr/ports/www/apache13
/usr/ports/www/apache13/> make install clean

Добавим строку в /etc/rc.conf для автозапуска apache при перезагрузке сервера
/usr/ports/www/apache13/> echo 'apache_enable="YES"' >> /etc/rc.conf

Запускаем сам apache
//> /usr/local/etc/rc.d/apache start

Смотрим запустился ли веб сервер apache
//> ps axw | grep http

6283 ?? Ss 0:00,05 /usr/local/sbin/httpd
6284 ?? I 0:00,00 /usr/local/sbin/httpd
6285 ?? I 0:00,00 /usr/local/sbin/httpd
6286 ?? I 0:00,00 /usr/local/sbin/httpd
6287 ?? I 0:00,00 /usr/local/sbin/httpd
6288 ?? I 0:00,00 /usr/local/sbin/httpd
6380 p0 R+ 0:00,00 grep http



Ставим СУБД MySQL 5.1

/usr/ports/> cd /usr/ports/databases/mysql51-server/
/usr/ports/databases/mysql51-server/> make install clean

Добавляем в /etc/rc.conf строку для запуска mysql
//> echo 'mysql_enable="YES"' >> /etc/rc.conf
//> echo 'mysql_dbdir="/usr/db/mysql"' >> /etc/rc.conf


И запускаем сам сервер
//> /usr/local/etc/rc.d/mysql-server start

Проверяем работу Mysql, должно быть что то типа этого.
//> ps axw | grep mysql

759 ?? Is 0:00,05 /bin/sh /usr/local/bin/mysqld_safe --defaults-extra-file=/usr/db/mysql/my.cnf --user=mysql --datadir=/usr/db/mysql --pid-file=/usr/db/mysql/server.WORKGROUP.pid
808 ?? I 0:01,69 /usr/local/libexec/mysqld --defaults-extra-file=/usr/db/mysql/my.cnf --basedir=/usr/local --datadir=/usr/db/mysql --log-error=/usr/db/mysql/server.WORKGROUP.err --pid-file=/usr/db/mysql/server.WORKGROUP.pid


Далее, задаем пароль для суперпользователя root
//> mysqladmin -u root password 'your_password'
//> mysqladmin -u root -h hostname password 'your_password'

Создаем таблицы в БД:
//> mysql -u root -p

############# БД: `exim`
 
  
USE mysql;
INSERT INTO `user` (`Host`, `User`, `Password`)
VALUES ('localhost','exim',password('exim'));
INSERT INTO `db` (`Host`, `Db`, `User`, `Select_priv`)
VALUES ('localhost','exim','exim','Y');
FLUSH PRIVILEGES;
GRANT USAGE ON exim.* TO exim@localhost;
GRANT SELECT, INSERT, DELETE, UPDATE ON exim.* TO exim@localhost;
CREATE DATABASE `exim`;
USE `exim`;



 
#############Структура таблицы `admin`
 

CREATE TABLE `admin` (
  `username` varchar(255) NOT NULL default '',
  `password` varchar(255) NOT NULL default '',
  `created` datetime NOT NULL default '0000-00-00 00:00:00',
  `modified` datetime NOT NULL default '0000-00-00 00:00:00',
  `active` tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (`username`),
  KEY `username` (`username`)
) TYPE=MyISAM COMMENT='Exim and dovecot Admin - Virtual Admins';



 
#############Структура таблицы `alias`


CREATE TABLE `alias` (
  `address` varchar(255) NOT NULL default '',
  `goto` text NOT NULL,
  `domain` varchar(255) NOT NULL default '',
  `created` datetime NOT NULL default '0000-00-00 00:00:00',
  `modified` datetime NOT NULL default '0000-00-00 00:00:00',
  `active` tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (`address`),
  KEY `address` (`address`)
) TYPE=MyISAM COMMENT='Exim and dovecot Admin - Virtual Aliases';




#############Структура таблицы `domain`


CREATE TABLE `domain` (
  `domain` varchar(255) NOT NULL default '',
  `description` varchar(255) NOT NULL default '',
  `aliases` int(10) NOT NULL default '0',
  `mailboxes` int(10) NOT NULL default '0',
  `maxquota` int(10) NOT NULL default '0',
  `transport` varchar(255) default NULL,
  `backupmx` tinyint(1) NOT NULL default '0',
  `created` datetime NOT NULL default '0000-00-00 00:00:00',
  `modified` datetime NOT NULL default '0000-00-00 00:00:00',
  `active` tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (`domain`),
  KEY `domain` (`domain`)
) TYPE=MyISAM COMMENT='Exim and dovecot Admin - Virtual Domains';



 
#############Структура таблицы `domain_admins`
 

CREATE TABLE `domain_admins` (
  `username` varchar(255) NOT NULL default '',
  `domain` varchar(255) NOT NULL default '',
  `created` datetime NOT NULL default '0000-00-00 00:00:00',
  `active` tinyint(1) NOT NULL default '1',
  KEY `username` (`username`)
) TYPE=MyISAM COMMENT='Exim and dovecot Admin - Domain Admins';



 
#############Структура таблицы `log`
 

CREATE TABLE `log` (
  `timestamp` datetime NOT NULL default '0000-00-00 00:00:00',
  `username` varchar(255) NOT NULL default '',
  `domain` varchar(255) NOT NULL default '',
  `action` varchar(255) NOT NULL default '',
  `data` varchar(255) NOT NULL default '',
  KEY `timestamp` (`timestamp`)
) TYPE=MyISAM COMMENT='Exim and dovecot Admin - Log';




#############Структура таблицы `mailbox`
 

CREATE TABLE `mailbox` (
  `username` varchar(255) NOT NULL default '',
  `password` varchar(255) NOT NULL default '',
  `name` varchar(255) NOT NULL default '',
  `maildir` varchar(255) NOT NULL default '',
  `quota` int(10) NOT NULL default '0',
  `domain` varchar(255) NOT NULL default '',
  `created` datetime NOT NULL default '0000-00-00 00:00:00',
  `modified` datetime NOT NULL default '0000-00-00 00:00:00',
  `active` tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (`username`),
  KEY `username` (`username`)
) TYPE=MyISAM COMMENT='Exim and dovecot Admin - Virtual Mailboxes';



 
#############Структура таблицы `vacation`



CREATE TABLE `vacation` (
  `email` varchar(255) NOT NULL default '',
  `subject` varchar(255) NOT NULL default '',
  `body` text NOT NULL,
  `cache` text NOT NULL,
  `domain` varchar(255) NOT NULL default '',
  `created` datetime NOT NULL default '0000-00-00 00:00:00',
  `active` tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (`email`),
  KEY `email` (`email`)
) TYPE=MyISAM COMMENT='Exim and dovecot Admin - Virtual Vacation';


# И на последок дадим пользователю exim права бога :)

GRANT ALL PRIVILEGES ON *.* TO exim@localhost IDENTIFIED BY \
'exim' WITH GRANT OPTION;




Ставим PHP 5

/usr/> cd /usr/ports/lang/php5
/usr/ports/lang/php5/> make config

     +--------------------------------------------------------------------+
     |                   Options for php5 5.3.5                           |
     | +----------------------------------------------------------------+ |
     | |  [X] CLI        Build CLI version                              | |
     | |  [X] CGI        Build CGI version                              | |
     | |  [ ] FPM        Build FPM version (experimental)               | |
     | |  [X] APACHE     Build Apache module                            | |
     | |  [ ] AP2FILTER   Use Apache 2.x filter interface (experimental)| |
     | |  [ ] DEBUG      Enable debug                                   | |
     | |  [X] SUHOSIN    Enable Suhosin protection system (not for jails) |
     | |  [X] MULTIBYTE  Enable zend multibyte support                  | |
     | |  [X] IPV6       Enable ipv6 support                            | |
     | |  [ ] MAILHEAD   Enable mail header patch                       | |
     | |  [ ] LINKTHR    Link thread lib (for threaded extensions)      | |
     | |                                                                | |
     | |                                                                | |
     | |                                                                | |
     +-+------v(+)------------------------------------------------------+-+
     |                       [  OK  ]       Cancel                        |
     +--------------------------------------------------------------------+

Устанавливаем
/usr/ports/lang/php5/> make install clean





Ставим PHP5_EXTENSIONS

//> cd /usr/ports/lang/php5-extensions
/usr/ports/lang/php5-extensions/> make config

     +--------------------------------------------------------------------+
     |                   Options for php5-extensions 1.4                  |
     | +----------------------------------------------------------------+ |
     | |  [ ] BCMATH      bc style precision math functions             | |
     | |  [X] BZ2         bzip2 library support                         | |
     | |  [ ] CALENDAR    calendar conversion support                   | |
     | |  [X] CTYPE       ctype functions                               | |
     | |  [ ] CURL        CURL support                                  | |
     | |  [ ] DBA         dba support                                   | |
     | |  [X] DOM         DOM support                                   | |
     | |  [ ] EXIF        EXIF support                                  | |
     | |  [ ] FILEINFO    fileinfo support                              | |
     | |  [X] FILTER      input filter support                          | |
     | |  [ ] FRIBIDI     FriBidi support                               | |
     | |  [ ] FTP         FTP support                                   | |
     | |  [X] GD          GD library support                            | |
     | |  [X] GETTEXT     gettext library support                       | |
     | |  [ ] GMP         GNU MP support                                | |
     | |  [X] HASH        HASH Message Digest Framework                 | |
     | |  [X] ICONV       iconv support                                 | |
     | |  [X] IMAP        IMAP support                                  | |
     | |  [ ] INTERBASE   Interbase 6 database support (Firebird)       | |
     | |  [ ] JSON        JavaScript Object Serialization support       | |
     | |  [ ] LDAP        OpenLDAP support                              | |
     | |  [X] MBSTRING    multibyte string support                      | |
     | |  [ ] MCRYPT      Encryption support                            | |
     | |  [ ] MSSQL       MS-SQL database support                       | |
     | |  [X] MYSQL       MySQL database support                        | |
     | |  [X] MYSQLI      MySQLi database support                       | |
     | |  [ ] ODBC        unixODBC support                              | |
     | |  [ ] OPENSSL     OpenSSL support                               | |
     | |  [ ] PCNTL       pcntl support (CLI only)                      | |
     | |  [ ] PDF         PDFlib support (implies GD)                   | |
     | |  [X] PDO         PHP Data Objects Interface (PDO)              | |
     | |  [X] PDO_SQLITE  PDO sqlite driver                             | |
     | |  [ ] PGSQL       PostgreSQL database support                   | |
     | |  [X] POSIX       POSIX-like functions                          | |
     | |  [ ] PSPELL      pspell support                                | |
     | |  [ ] READLINE    readline support (CLI only)                   | |
     | |  [ ] RECODE      recode support                                | |
     | |  [X] SESSION     session support                               | |
     | |  [ ] SHMOP       shmop support                                 | |
     | |  [X] SIMPLEXML   simplexml support                             | |
     | |  [ ] SNMP        SNMP support                                  | |
     | |  [ ] SOAP        SOAP support                                  | |
     | |  [ ] SOCKETS     sockets support                               | |
     | |  [X] SQLITE      sqlite support                                | |
     | |  [ ] SYBASE_CT   Sybase database support                       | |
     | |  [ ] SYSVMSG     System V message support                      | |
     | |  [ ] SYSVSEM     System V semaphore support                    | |
     | |  [ ] SYSVSHM     System V shared memory support                | |
     | |  [ ] TIDY        TIDY support                                  | |
     | |  [X] TOKENIZER   tokenizer support                             | |
     | |  [ ] WDDX        WDDX support (implies XML)                    | |
     | |  [X] XML         XML support                                   | |
     | |  [X] XMLREADER   XMLReader support                             | |
     | |  [ ] XMLRPC      XMLRPC-EPI support                            | |
     | |  [X] XMLWRITER   XMLWriter support                             | |
     | |  [ ] XSL         XSL support (Implies DOM)                     | |
     | |  [ ] YAZ         YAZ support (ANSI/NISO Z39.50)                | |
     | |  [ ] ZIP         ZIP support                                   | |
     | |  [X] ZLIB        ZLIB support                                  | |
     +-+------v(+)------------------------------------------------------+-+
     |                       [  OK  ]       Cancel                        |
     +--------------------------------------------------------------------+


Устанавливаем
/usr/ports/lang/php5-extensions/> make install clean


//> cp /usr/local/etc/php.ini-production /usr/local/etc/php.ini

И раскомментируем строку
//> ee /usr/local/etc/php.ini

session.save_path = "/tmp"


Перезагрузим apache
//> /usr/local/etc/rc.d/apache restart


Ставим Postfixadmin

//> cd /usr/ports/mail/postfixadmin/
/usr/ports/mail/postfixadmin/> make config

     +--------------------------------------------------------------------+
     |                   Options for postfixadmin 2.3.2                   |
     | +----------------------------------------------------------------+ |
     | |  [X] MYSQL   MySQL back-end (use mysql PHP extension)          | |
     | |  [X] MYSQLI  MySQL 4.1+ back-end (use mysqli PHP extension)    | |
     | |  [ ] PGSQL   PostgreSQL back-end (use pgsql PHP extension)     | |
     | |                                                                | |
     +-+------v(+)------------------------------------------------------+-+
     |                       [  OK  ]       Cancel                        |
     +--------------------------------------------------------------------+

//> make install clean

Добавляем алиас в httpd.conf
//> ee /usr/local/etc/apache/httpd.conf

# Алиас для "postfixadmin"
Alias /postfixadmin "/usr/local/www/postfixadmin/"
<Directory "/usr/local/www/postfixadmin/">
    Options -Indexes FollowSymLinks MultiViews
    DirectoryIndex index.php
    AllowOverride None
    Order deny,allow
    Allow from all
</Directory>

Правим конфиг postfixadmin
//> ee /usr/local/www/postfixadmin/config.inc.php

<?php
/** 
 * Postfix Admin 
 * 
 * LICENSE 
 * This source file is subject to the GPL license that is bundled with  
 * this package in the file LICENSE.TXT. 
 * 
 * Further details on the project are available at : 
 *     http://www.postfixadmin.com or http://postfixadmin.sf.net 
 * 
 * @version $Id: config.inc.php 828 2010-05-17 22:56:23Z christian_boltz $ 
 * @license GNU GPL v2 or later. 
 * 
 * File: config.inc.php
 * Contains configuration options.
 */

/*****************************************************************
 *  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
 * You have to set $CONF['configured'] = true; before the
 * application will run!
 * Doing this implies you have changed this file as required.
 * i.e. configuring database etc; specifying setup.php password etc.
 */
$CONF['configured'] = false;

// In order to setup Postfixadmin, you MUST specify a hashed password here.
// To create the hash, visit setup.php in a browser and type
// a password into the field,
// on submission it will be echoed out to you as a hashed value.
$CONF['setup_password'] = 'changeme';

// Postfix Admin Path
// Set the location of your Postfix Admin installation here.
// YOU MUST ENTER THE COMPLETE URL e.g. http://domain.tld/postfixadmin
$CONF['postfix_admin_url'] = 'http://192.168.1.222/postfixadmin';

// shouldn't need changing.
$CONF['postfix_admin_path'] = '/usr/local/www/postfixadmin/';

// Language config
// Language files are located in './languages', change as required..
$CONF['default_language'] = 'ru';

// Database Config
// mysql = MySQL 3.23 and 4.0, 4.1 or 5
// mysqli = MySQL 4.1+ 
// pgsql = PostgreSQL
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'exim';
$CONF['database_password'] = 'exim';
$CONF['database_name'] = 'exim';
$CONF['database_prefix'] = '';
// If you need to specify a different port for a
// MYSQL database connection, use e.g.
//   $CONF['database_host'] = '172.30.33.66:3308';
// If you need to specify a different port for POSTGRESQL
// database connection
//   uncomment and change the following
// $CONF['database_port'] = '5432';


// Here, if you need, you can customize table names.
$CONF['database_prefix'] = '';
$CONF['database_tables'] = array (
    'admin' => 'admin',
    'alias' => 'alias',
    'alias_domain' => 'alias_domain',
    'config' => 'config',
    'domain' => 'domain',
    'domain_admins' => 'domain_admins',
    'fetchmail' => 'fetchmail',
    'log' => 'log',
    'mailbox' => 'mailbox',
    'vacation' => 'vacation',
    'vacation_notification' => 'vacation_notification',
    'quota' => 'quota',
    'quota2' => 'quota2',
);

// Site Admin
// Define the Site Admins email address below.
// This will be used to send emails from to create mailboxes.
$CONF['admin_email'] = 'postmaster@mydomain.ru';

// Mail Server
// Hostname (FQDN) of your mail server.
// This is used to send email to Postfix in order to create mailboxes.
$CONF['smtp_server'] = 'localhost';
$CONF['smtp_port'] = '25';

// Encrypt
// In what way do you want the passwords to be crypted?
// md5crypt = internal postfix admin md5
// md5 = md5 sum of the password
// system = whatever you have set as your PHP system default
// cleartext = clear text passwords (ouch!)
// mysql_encrypt = useful for PAM integration
// authlib = support for courier-authlib style passwords
// dovecot:CRYPT-METHOD = use dovecotpw -s 'CRYPT-METHOD'.
// Example: dovecot:CRAM-MD5
$CONF['encrypt'] = 'cleartext';

// In what flavor should courier-authlib style passwords be enrypted?
// md5 = {md5} + base64 encoded md5 hash
// md5raw = {md5raw} + plain encoded md5 hash
// SHA = {SHA} + base64-encoded sha1 hash
// crypt = {crypt} + Standard UNIX DES-enrypted with 2-character salt
$CONF['authlib_default_flavor'] = 'md5raw';

// If you use the dovecot encryption method: 
// where is the dovecotpw binary located?
$CONF['dovecotpw'] = "/usr/sbin/dovecotpw";

// Minimum length required for passwords. Postfixadmin will not
// allow users to set passwords which are shorter than this value.
$CONF['min_password_length'] = 5;

// Generate Password
// Generate a random password for a mailbox or admin and display it.
// If you want to automagically generate paswords set this to 'YES'.
$CONF['generate_password'] = 'NO';

// Show Password
// Always show password after adding a mailbox or admin.
// If you want to always see what password was set set this to 'YES'.
$CONF['show_password'] = 'NO';

// Page Size
// Set the number of entries that you would like to see
// in one page.
$CONF['page_size'] = '25';

// Default Aliases
// The default aliases that need to be created for all domains.
$CONF['default_aliases'] = array (
    'abuse' => 'abuse@domain',
    'hostmaster' => 'hostmaster@mydomain.ru',
    'postmaster' => 'postmaster@mydomain.ru',
    'webmaster' => 'webmaster@mydomain.ru'
);

// Mailboxes
// If you want to store the mailboxes per domain set this to 'YES'.
// Examples:
//   YES: /usr/local/virtual/domain.tld/username@domain.tld
//   NO:  /usr/local/virtual/username@domain.tld
$CONF['domain_path'] = 'YES';
// If you don't want to have the domain in your mailbox set this to 'NO'.
// Examples: 
//   YES: /usr/local/virtual/domain.tld/username@domain.tld
//   NO:  /usr/local/virtual/domain.tld/username
// Note: If $CONF['domain_path'] is set to NO, 
// this setting will be forced to YES.
$CONF['domain_in_mailbox'] = 'NO';
// If you want to define your own function to generate a maildir
// path set this to the name of the function.
// Notes: 
//   - this configuration directive will override both domain_path
//   and domain_in_mailbox
//   - the maildir_name_hook() function example is present below,
//   commented out
//   - if the function does not exist the program will default
//   to the above domain_path and domain_in_mailbox settings
$CONF['maildir_name_hook'] = 'NO';

/*
    maildir_name_hook example function
 
 Called by create-mailbox.php if $CONF['maildir_name_hook']
 == '<name_of_the_function>'
 - allows for customized maildir paths determined by a custom function
 - the example below will prepend a single-character directory to the
 beginning of the maildir, splitting domains more or less evenly over
 36 directories for improved filesystem performance with large numbers
 of domains.

    Returns: maildir path
    ie. I/example.com/user/
*/
/*
function maildir_name_hook($domain, $user) {
    $chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    $dir_index = hexdec(substr(md5($domain), 28)) % strlen($chars);
    $dir = substr($chars, $dir_index, 1);
    return sprintf("%s/%s/%s/", $dir, $domain, $user);
}
*/


// Default Domain Values
// Specify your default values below. Quota in MB.
$CONF['aliases'] = '0';
$CONF['mailboxes'] = '0';
$CONF['maxquota'] = '0';

// Quota
// When you want to enforce quota for your mailbox users set this to 'YES'.
$CONF['quota'] = 'NO';
// You can either use '1024000' or '1048576'
$CONF['quota_multiplier'] = '1024000';

// Transport
// If you want to define additional transport options for a
// domain set this to 'YES'.
// Read the transport file of the Postfix documentation.
$CONF['transport'] = 'NO';
// Transport options
// If you want to define additional transport options
// put them in array below.
$CONF['transport_options'] = array (
    'virtual',  // for virtual accounts
    'local',    // for system accounts
    'relay'     // for backup mx
);
// Transport default
// You should define default transport. It must be in array above.
$CONF['transport_default'] = 'virtual';

// Virtual Vacation
// If you want to use virtual vacation for you mailbox users
//  set this to 'YES'.
// NOTE: Make sure that you install the vacation module.
// (See VIRTUAL-VACATION/)
$CONF['vacation'] = 'NO';
// This is the autoreply domain that you will need to set in your Postfix
// transport maps to handle virtual vacations. It does not need to be a
// real domain (i.e. you don't need to setup DNS for it).
$CONF['vacation_domain'] = 'autoreply.change-this-to-your.domain.tld';

// Vacation Control
// If you want users to take control of vacation set this to 'YES'.
$CONF['vacation_control'] ='YES';

// Vacation Control for admins
// Set to 'YES' if your domain admins should be able to edit user vacation.
$CONF['vacation_control_admin'] = 'YES';

// Alias Control
// Postfix Admin inserts an alias in the alias table for
// every mailbox it creates.
// The reason for this is that when you want catch-all and normal mailboxes
// to work you need to have the mailbox replicated in the alias table.
// If you want to take control of these aliases as well set this to 'YES'.
$CONF['alias_control'] = 'YES';

// Alias Control for admins
// Set to 'NO' if your domain admins shouldn't 
// be able to edit user aliases.
$CONF['alias_control_admin'] = 'YES';

// Special Alias Control
// Set to 'NO' if your domain admins shouldn't
// be able to edit default aliases.
$CONF['special_alias_control'] = 'YES';

// Alias Goto Field Limit
// Set the max number of entries that you would like to see
// in one 'goto' field in overview, 
// the rest will be hidden and "[and X more...]" will be added.
// '0' means no limits.
$CONF['alias_goto_limit'] = '0';

// Alias Domains
// Alias domains allow to "mirror" aliases and mailboxes to another domain.
//  This makes 
// configuration easier if you need the same set of aliases
//  on multiple domains, but
// also requires postfix to do more database queries.
// Note: If you update from 2.2.x or earlier, you will 
// have to update your postfix configuration.
// Set to 'NO' to disable alias domains.
$CONF['alias_domain'] = 'YES';

// Backup
// If you don't want backup tab set this to 'NO';
$CONF['backup'] = 'YES';

// Send Mail
// If you don't want sendmail tab set this to 'NO';
$CONF['sendmail'] = 'YES';

// Logging
// If you don't want logging set this to 'NO';
$CONF['logging'] = 'YES';

// Fetchmail
// If you don't want fetchmail tab set this to 'NO';
$CONF['fetchmail'] = 'YES';

// fetchmail_extra_options allows users to specify any
// fetchmail options and any MDA
// (it will even accept 'rm -rf /' as MDA!)
// This should be set to NO, except if you *really* trust *all* your users.
$CONF['fetchmail_extra_options'] = 'NO';

// Header
$CONF['show_header_text'] = 'NO';
$CONF['header_text'] = ':: Postfix Admin ::';

// link to display under 'Main' menu when logged in as a user.
$CONF['user_footer_link'] = "http://192.168.1.222/postfixadmin";

// Footer
// Below information will be on all pages.
// If you don't want the footer information to appear set this to 'NO'.
$CONF['show_footer_text'] = 'YES';
$CONF['footer_text'] = 'Return to change-this-to-your.domain.tld';
$CONF['footer_link'] = 'http://change-this-to-your.domain.tld';

// Welcome Message
// This message is send to every newly created mailbox.
// Change the text between EOM.
$CONF['welcome_text'] = <<<EOM
Hi,

Welcome to your new account.
EOM;

// When creating mailboxes or aliases, check that the domain-part of the
// address is legal by performing a name server look-up.
$CONF['emailcheck_resolve_domain']='NO';


// Optional:
// Analyze alias gotos and display a colored block in the first column
// indicating if an alias or mailbox appears to deliver to a non-existent
// account.  Also, display indications, for POP/IMAP mailboxes and
// for custom destinations (such as mailboxes that forward to a UNIX shell
// account or mail that is sent to a MS exchange server, or any other
// domain or subdomain you use)
// See http://www.w3schools.com/html/html_colornames.asp for a list of
// color names available on most browsers

//set to YES to enable this feature
$CONF['show_status']='NO';
//display a guide to what these colors mean
$CONF['show_status_key']='NO';
// 'show_status_text' will be displayed with the background colors
// associated with each status, you can customize it here
$CONF['show_status_text']='&nbsp;&nbsp;';
// show_undeliverable is useful if most accounts are delivered to this
// postfix system.  If many aliases and mailboxes are forwarded
// elsewhere, you will probably want to disable this.
$CONF['show_undeliverable']='NO';
$CONF['show_undeliverable_color']='tomato';
// mails to these domains will never be flagged as undeliverable
// $CONF['show_undeliverable_exceptions']=array("unixmail.domain.ext" \
// ,"exchangeserver.domain.ext","gmail.com");
$CONF['show_popimap']='NO';
$CONF['show_popimap_color']='darkgrey';
// you can assign special colors to some domains. To do this,
// - add the domain to show_custom_domains
// - add the corresponding color to show_custom_colors
$CONF['show_custom_domains']=array("subdomain.domain.ext","domain2.ext");
$CONF['show_custom_colors']=array("lightgreen","lightblue");
// If you use a recipient_delimiter in your postfix config,
//  you can also honor it when aliases are checked.
// Example: $CONF['recipient_delimiter'] = "+";
// Set to "" to disable this check.
$CONF['recipient_delimiter'] = "";


// Optional:
// Script to run after creation of mailboxes.
// Note that this may fail if PHP is run in "safe mode", or if
// operating system features (such as SELinux) or limitations
// prevent the web-server from executing external scripts.
// Parameters: (1) username (2) domain (3) maildir (4) quota
// $CONF['mailbox_postcreation_script']='sudo -u courier \
// /usr/local/bin/postfixadmin-mailbox-postcreation.sh';

// Optional:
// Script to run after alteration of mailboxes.
// Note that this may fail if PHP is run in "safe mode", or if
// operating system features (such as SELinux) or limitations
// prevent the web-server from executing external scripts.
// Parameters: (1) username (2) domain (3) maildir (4) quota
// $CONF['mailbox_postedit_script']='sudo -u courier \
// /usr/local/bin/postfixadmin-mailbox-postedit.sh';

// Optional:
// Script to run after deletion of mailboxes.
// Note that this may fail if PHP is run in "safe mode", or if
// operating system features (such as SELinux) or limitations
// prevent the web-server from executing external scripts.
// Parameters: (1) username (2) domain
// $CONF['mailbox_postdeletion_script']='sudo -u courier \
// /usr/local/bin/postfixadmin-mailbox-postdeletion.sh';

// Optional:
// Script to run after creation of domains.
// Note that this may fail if PHP is run in "safe mode", or if
// operating system features (such as SELinux) or limitations
// prevent the web-server from executing external scripts.
// Parameters: (1) username
//$CONF['domain_postcreation_script']='sudo -u courier \
// /usr/local/bin/postfixadmin-domain-postcreation.sh';

// Optional:
// Script to run after deletion of domains.
// Note that this may fail if PHP is run in "safe mode", or if
// operating system features (such as SELinux) or limitations
// prevent the web-server from executing external scripts.
// Parameters: (1) username
// $CONF['domain_postdeletion_script']='sudo -u courier \
// /usr/local/bin/postfixadmin-domain-postdeletion.sh';

// Optional:
// Sub-folders which should automatically be created for new users.
// The sub-folders will also be subscribed to automatically.
// Will only work with IMAP server which implement sub-folders.
// Will not work with POP3.
// If you define create_mailbox_subdirs, then the
// create_mailbox_subdirs_host must also be defined.
//
// $CONF['create_mailbox_subdirs']=array('Spam');
// $CONF['create_mailbox_subdirs_host']='localhost';
//
// Specify '' for Dovecot and 'INBOX.' for Courier.
$CONF['create_mailbox_subdirs_prefix']='INBOX.';

// Optional:
// Show used quotas from Dovecot dictionary backend in virtual
// mailbox listing.
// See: DOCUMENTATION/DOVECOT.txt
//      http://wiki.dovecot.org/Quota/Dict
//
$CONF['used_quotas'] = 'NO';

// if you use dovecot >= 1.2, set this to yes.
// Note about dovecot config: table "quota" is for 1.0 & 1.1,
//  table "quota2" is for dovecot 1.2 and newer
$CONF['new_quota_table'] = 'NO';

//
// Normally, the TCP port number does not have to be specified.
// $CONF['create_mailbox_subdirs_hostport']=143;
//
// If you have trouble connecting to the IMAP-server, then specify
// a value for $CONF['create_mailbox_subdirs_hostoptions']. These
// are some examples to experiment with:
// $CONF['create_mailbox_subdirs_hostoptions']=array('notls');
// $CONF['create_mailbox_subdirs_hostoptions']=array \
// ('novalidate-cert','norsh');
// See also the "Optional flags for names" table at
// http://www.php.net/manual/en/function.imap-open.php


// Theme Config
// Specify your own logo and CSS file
$CONF['theme_logo'] = 'images/logo-default.png';
$CONF['theme_css'] = 'css/default.css';

// XMLRPC Interface.
// This should be only of use if you wish to use e.g the 
// Postfixadmin-Squirrelmail package
//  change to boolean true to enable xmlrpc
$CONF['xmlrpc_enabled'] = false;


// If you want to keep most settings at default values and/or want to ensure 
// that future updates work without problems, you can use a separate config 
// file (config.local.php) instead of editing this file and override some
// settings there.
if (file_exists(dirname(__FILE__) . '/config.local.php')) {
    include(dirname(__FILE__) . '/config.local.php');
}

//
// END OF CONFIG FILE
//
/* vim: set expandtab softtabstop=4 tabstop=4 shiftwidth=4: */


Перезагрузим apache
//> apachectl restart

Далее переходим в браузере http://192.168.1.xxx/postfixadmin/
там создаем Администратора для того чтобы создавать домены и других админов
Будет что то типа




Видим хеш нашего пароля, вводим его в config.inc.php
Меняем два параметра в конфиге
$CONF['configured'] = false;
на
$CONF['configured'] = true;
и
$CONF['setup_password'] = 'changeme';
на
$CONF['setup_password'] = 'ХЕШ который получили';


Далее вводим пароль и создаем администратора.




Устанавливаем Dovecot

//> cd /usr/ports/mail/dovecot
/usr/ports/mail/dovecot/> make config

     +--------------------------------------------------------------------+
     |                   Options for dovecot 1.2.16                       |
     | +----------------------------------------------------------------+ |
     | |  [X] KQUEUE       kqueue(2) support                            | |
     | |  [X] SSL          SSL support                                  | |
     | |  [X] MANAGESIEVE  ManageSieve support                          | |
     | |  [ ] GSSAPI       GSSAPI support                               | |
     | |  [ ] VPOPMAIL     VPopMail support                             | |
     | |  [ ] BDB          BerkleyDB support                            | |
     | |  [ ] LDAP         OpenLDAP support                             | |
     | |  [ ] PGSQL        PostgreSQL support                           | |
     | |  [X] MYSQL        MySQL support                                | |
     | |  [ ] SQLITE       SQLite support                               | |
     | |                                                                | |
     +-+------v(+)------------------------------------------------------+-+
     |                       [  OK  ]       Cancel                        |
     +--------------------------------------------------------------------+

/usr/ports/mail/dovecot/> make install clean


Далее пишем конфиг Dovecot'a
/usr/local/etc/> ee /usr/local/etc/dovecot.conf

base_dir = /var/run/dovecot/
protocols = imap imaps pop3 pop3s
# Renamed ssl_disable = yes to ssl = no
ssl = no
#ssl_cert_file = /etc/dovecot/ssl/dovecot.crt
#ssl_key_file = /etc/dovecot/ssl/dovecot.key
protocol imap {
       listen = *:143
#       ssl_listen = *:993
}


protocol pop3 {
        listen = *:110
#        ssl_listen = *:995
}
disable_plaintext_auth = no
shutdown_clients = yes
log_timestamp = "%b %d %H:%M:%S "
syslog_facility = mail
login_dir = /var/run/dovecot/login
login_chroot = yes
login_user = dovecot
login_process_size = 64
login_process_per_connection = yes
login_processes_count = 3
login_max_processes_count = 128
login_greeting = dovecot MUA ready
login_log_format_elements = user=<%u> method=%m rip=%r lip=%l %c
login_log_format = %$: %s
verbose_proctitle = yes
first_valid_uid = 25
first_valid_gid = 0
mail_access_groups = mail
# После отладки и первого запуска можно убрать auth_debug
auth_debug = yes
# Тоже после отладки можно убрать
mail_debug = yes
mail_location = maildir:/usr/mail/exim/%d/%n
# Removed umask. It wasn't really used anywhere anymore
# umask = 0077

protocol imap {
  imap_client_workarounds = delay-newmail outlook-idle \
  netscape-eoh tb-extra-mailbox-sep
}


protocol pop3 {
  pop3_uidl_format = %08Xu%08Xv
  pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
}
protocol lda {
  postmaster_address = postmaster@mydomain.ru
  auth_socket_path = /var/run/dovecot/auth-master
}
auth default {
mechanisms = plain
   socket listen {
     master {
       path = /var/run/dovecot/auth-master
       mode = 0600
       user = mailnull
     }
   }
  passdb sql {
    args = /usr/local/etc/dovecot-sql.conf
  }
  userdb sql {
    args = /usr/local/etc/dovecot-sql.conf
}
  user = root
}
plugin {
}


Далее создаём файл dovecot-sql.conf без переносов "\"
//> ee /usr/local/etc/dovecot-sql.conf

driver = mysql
connect = host=localhost dbname=exim user=exim password=exim
default_pass_scheme = PLAIN
password_query = SELECT `username` as `user`, `password` FROM \
`mailbox` WHERE `username` = '%n@%d' AND `active`='1'
user_query = SELECT CONCAT('/usr/mail/exim/',LCASE(`maildir`)) AS `home`, \
26 AS `uid`, 26 AS `gid` FROM `mailbox` WHERE `username` \
= LCASE('%n@%d') AND `active`='1'


//> mkdir -p /usr/mail/exim
//> chmod 700 /usr/mail/exim/
//> chown mailnull:mail /usr/mail/exim


Запускаем Dovecot
/usr/local/etc/> echo 'dovecot_enable="YES"' >> /etc/rc.conf
/usr/local/etc/> /usr/local/etc/rc.d/dovecot start
Starting dovecot.
//>



Устанавливаем Exim

Пишем вот это для сборки Exim , я его собирал без антивируса т.к masterhost.ru сам проверяет на вирусы, а два раза проверять на вирусы, это слишком (плюс еще к тому же на каждом компе антивирь NOD32)т.е даже трижды.
//> ee /etc/make.conf

PORTSDIR?=      /usr/ports
.if ${.CURDIR} == ${PORTSDIR}/mail/exim
LOG_FILE_PATH?=         syslog
.endif

//> cd /usr/ports/mail/exim/
/usr/ports/mail/exim/> make config

     +--------------------------------------------------------------------+
     |                   Options for exim 4.76                            |
     | +----------------------------------------------------------------+ |
     | |  [ ] ALT_CONFIG_PREFIX  Restrict the set of configuration files| |
     | |  [X] AUTH_CRAM_MD5      Enable CRAM-MD5 authentication mechanisms|
     | |  [X] AUTH_DOVECOT       Enable Dovecot authentication mechanisms |
     | |  [X] AUTH_PLAINTEXT     Enable plaintext authentication        | |
     | |  [ ] AUTH_RADIUS        Enable radius (RFC 2865) authentication| |
     | |  [ ] AUTH_SASL          Enable use of Cyrus SASL auth library  | |
     | |  [X] AUTH_SPA           Enable Secure Password Authentication  | |
     | |  [X] CDB                Enable CDB-style lookups               | |
     | |  [ ] CONTENT_SCAN       Enable exiscan email content scanner   | |
     | |  [X] DAEMON             Install scripts to run as a daemon     | |
     | |  [ ] DCC                Enable DCC at ACL support via dccifd   | |
     | |  [ ] DEBUG              Build with debugging symbols           | |
     | |  [X] DISABLE_D_OPT      Disable macros overrides using option -D |
     | |  [X] DNSDB              Enable DNS-style lookups               | |
     | |  [X] DSEARCH            Enable directory-list lookups          | |
     | |  [X] EMBEDDED_PERL      Enable embedded Perl interpreter       | |
     | |  [ ] EXIMON             Build eximon monitor (require XFree86!)| |
     | |  [X] ICONV              Enable header charset conversion       | |
     | |  [X] IPV6               Enable IPv6 support                    | |
     | |  [ ] KAS                Build with Kaspersky AntiSpam local scan |
     | |  [X] LMTP               RFC2033 SMTP over command pipe transport |
     | |  [X] LSEARCH            Enable wildcarded-file lookups         | |
     | |  [X] MAILDIR            Enable Maildir mailbox format          | |
     | |  [X] MAILSTORE          Enable Mailstore mailbox format        | |
     | |  [X] MBX                Enable MBX mailbox format              | |
     | |  [X] MYSQL              Link against libmysqlclient library    | |
     | |  [X] NIS                Enable NIS-style lookups               | |
     | |  [X] OLD_DEMIME         Enable old, deprecated demime ACL      | |
     | |  [ ] OPENLDAP           Link against libldap                   | |
     | |  [X] PAM                Enable PAM authentication mechanisms   | |
     | |  [X] PASSWD             Enable /etc/passwd lookups             | |
     | |  [ ] PGSQL              Link against libpq                     | |
     | |  [ ] READLINE           Enable readline(3) library             | |
     | |  [ ] SASLAUTHD          Enable use of Cyrus SASL auth daemon   | |
     | |  [ ] SA_EXIM            SA-Exim support                        | |
     | |  [ ] SO_1024            Build with Spamooborona-1024 local scan| |
     | |  [ ] SPF                Enable Sender Policy Framework checking| |
     | |  [ ] SQLITE             Enable SQLite lookups                  | |
     | |  [ ] SRS                Enable Sender Rewriting Scheme         | |
     | |  [ ] SRS_ALT            Enable alternative SRS library         | |
     | |  [X] SUID               Install the exim binary suid root      | |
     | |  [ ] TCP_WRAPPERS       Enable /etc/hosts.allow access control | |
     | |  [X] TLS                Link against OpenSSL                   | |
     | |  [ ] WISHLIST           Include the unsupported patches        | |
     | |  [ ] XCLIENT            Enable XCLIENT command in exim         | |
     | |                                                                | |
     +-+------v(+)------------------------------------------------------+-+
     |                       [  OK  ]       Cancel                        |
     +--------------------------------------------------------------------+

/usr/ports/mail/exim/> make install clean

Отключаем sendmail
/usr/ports/mail/exim/> echo 'sendmail_enable="NONE"' >> /etc/rc.conf
/usr/ports/mail/exim/> ee /etc/mail/mailer.conf


Правим mailer.conf
sendmail        /usr/local/sbin/exim
send-mail       /usr/local/sbin/exim
mailq           /usr/local/sbin/exim -bp
newaliases      /usr/local/sbin/exim -bi
hoststat        /usr/local/sbin/exim
purgestat       /usr/local/sbin/exim


Далее останавливаем Sendmail
//> /etc/rc.d/sendmail forcestop


И приводим конфиг Exim'a вот в такое состояние.
# Имя хоста. Используется в EHLO.
# Фигурирует в других пунктах, если они не заданы -
# типа qualify_domain и прочих..
# Если тут ничё не установлено (строка закомметрована)
# то используется то, что вернёт функция uname()
primary_hostname = mydomain.ru

# Вводим данные для подключения к MySQL серверу.
# словечко `hide`, вначале, означает, что при
# вызове проверки конфига командой
# exim -bV config_file эти данные не будут отображаться.
# Если без него - то будут показаны... Формат записи:
# хост/имя_бд/пользователь/пароль
hide mysql_servers = localhost/exim/exim/exim


# Делаем список локальных доменов. Далее этот
# список будет фигурировать в виде +local_domains
# В данном случае домены выбираются из БД MySQL. Также
# можно их просто перечислить через двоеточие. Есть интересная
# возможность, можно указать юзер@[хост] - user@[222.222.4.5]
domainlist local_domains = ${lookup mysql{SELECT `domain` \
                            FROM `domain` WHERE \
                            `domain`='${domain}' AND \
                            `active`='1'}}


# делаем список доменов с которых разрешены релеи.
# Далее этот список будет в виде +relay_to_domains
# Можно использовать символы подстановки, типа:
# .... = *.my.domen.su : !spam.my.domen.ru : first.ru
# тогда пропускается всё, что похоже на *.my.domain.ru, но
# от spam.my.domen.su релеится почта не будет.
domainlist relay_to_domains = ${lookup mysql{SELECT `domain` \
                            FROM `domain` WHERE \
                            `domain`='${domain}' AND \
                            `active`='1'}}

# Составляем список хостов с которых разрешён неавторизованый
# релей. Обычно в нём находятся локальные сети, и локалхост...
# ЛокалХост в двух видах был внесён сознательно - пару раз
# сталкивался с кривым файлом /etc/hosts - результатом было
# непонимание `localhost` но пониманием 127.0.0.1/8
hostlist   relay_from_hosts = localhost:127.0.0.0/8:192.168.0.0/24

# Проверка получателя
acl_smtp_rcpt = acl_check_rcpt
# Проверка mime содержимого вложения
#acl_smtp_mime = acl_check_mime
# Проверка на спам и вирусы
#acl_smtp_data = acl_check_data

# Прикручиваем антивирус - при условии, что exim собран
# с его поддержкой. В качестве антивиря юзаем ClamAV,
#av_scanner = clamd:/var/run/clamav/clamd.sock
#av_scanner = clamd:127.0.0.1 3310

# Адрес куда слать на проверку спама (SpamAssasin)
#spamd_address = 127.0.0.1 783

# Порты какие будет слушать Exim (25 и 465)
daemon_smtp_ports = 25 : 465

# Указываем порт который будет работать с шифрованием SSL TLS
tls_on_connect_ports = 465

# Указываем где у нас находяться сертификат и ключ
#tls_certificate = /usr/local/etc/exim/ssl-keys/ssl.crt
#tls_privatekey = /usr/local/etc/exim/ssl-keys/ssl.key

# Имя домена добавляемое для локальных отправителей (реальных
# юзеров системы) т.е. почта отправляемая от root, будет от
# root@домен_указанный_здесь. Если пункт незадан, то используется
# имя хоста из `primary_hostname`.
qualify_domain = mydomain.ru

# Имя хоста для ситуации, обратной предыдущей, - это имя домена
# добавляемое к почте для системных юзеров, ну и вообще для почты
# пришедшей на адрес типа `root`, `lissyara`, & etc... Если этот
# пункт незадан то используется значение полученное из
# предыдущего пункта - `qualify_domain`
qualify_recipient = mydomain.ru

# А это как раз кусок вышеописанного анахронизма - про почту в
# виде user@[222.222.222.222] - принимать её или нет. По дефолту
# (когда строка закомментирована) значение - false. Если захотите
# поставить true то надо будет добавить в список доменов
# комбинацию @[] - она означает `все локальные адреса`
allow_domain_literals = false

# Пользователь от которого работает exim
exim_user = mailnull

# группа в кторой работает exim
exim_group = mail

# запрещаем работу доставки под юзером root - в целях безопасности
never_users = root

# Проверяем соответствие прямой и обратной зон для всех хостов.
# Тока зачем это нужно - даже и незнаю... Спам на этом не режется...
# Зато возможны проблемы - если сервер зоны скажет `сервер файлед`
# то почту от этого хоста Вы не получите :)
#host_lookup = *

warn_message_file = /usr/local/etc/exim/warn_message_file
bounce_message_file = /usr/local/etc/exim/bounce_message_file

# Тоже анахронизм (на самом деле, не такой уж анахронизм, но все давно
# забили на ident и закрыли файрволлом tcp:113...) Это проверка - Ваш
# хост спрашивает у удалённого, с которого было подключение, а кто
# собстно ко мне подключился на такой-то порт? Если на удалённом хосте
# работает identd - он может ответить (а может и не ответить - как
# настроить), скажет UID пользователя от которого установлено
# соединение, тип ОС, и имя пользователя. Теперь, понимаете, почему
# у всех оно зарублено и файрволлами позакрыто? :) Это же палево :)
# Тока на мой взгляд, если на сервере всё настроено правильно -
# то вовсе это и не страшно.
# Короче - если хостс поставить * то будет проверять все. Таймаут -
# если поставить 0 то не будет ждать ответа ни от кого. По
# вышеописанным причинам - отключаем
#rfc1413_hosts = *
rfc1413_query_timeout = 0s

# По дефолту, экзим отфутболивает все `неквалифицированные` адреса,
# состоящие тока из локальной части. Для того чтобы разрешить такие письма
# определённых хостов используются эти директивы:
# для `неквалифицированных` отправителей
sender_unqualified_hosts = +relay_from_hosts

# для `неквалифицированных` получателей
recipient_unqualified_hosts = +relay_from_hosts


# Интересный пункт, тока я не вполне понимаю его логику.
# Позволяет выполнять что-то типа - пришло сообщение на
# локальный ящик user%test.ru@mydomain.ru и
# переправляет его на user@mydomain.ru. Делается это для
# перечисленного списка доменов (* - все):
# percent_hack_domains = *

# Если сообщение было недоставлено, то генерится соощение
# об ошибке. Если сообщение об ошибке не удалось доставить
# то оно замораживается на указанный в этом пункте срок,
# после чего снова попытка доставить его. При очередной
# неудаче - сообщение удаляется.
ignore_bounce_errors_after = 45m

# Замороженные сообщения, находящиеся в очереди, дольше
# указанного времени удаляются и генерится сообщение
# об ошибке (при условии, что это не было недоставленное
# сообщение об ошибке :))
timeout_frozen_after = 15d

# собсно на этом штатный конфиг кончился, но
# меня-то это не устраивает... Поэтому пошли пункты,
# почёрпнутые из других источников.

# список адресов, через запятую, на которые засылаются
# сообщения о замороженных сообщениях (о замороженых
# уведомлениях о заморозке, сообщения не генерятся. - я
# надеюсь эта строка понятна :))
freeze_tell = postmaster@mydomain.ru

# Список хостов, почта от которых принимается, несмотря
# на ошибки в HELO/EHLO (тут указана моя подсеть)
helo_accept_junk_hosts = 192.168.0.0/24

# Через какое время повторять попытку доставки
# замороженного сообщения
auto_thaw = 1h

# Приветствие сервера, при коннекте на 25 порт выглядеть будет так
# (220 mydomain.ru, ESMTP EXIM 4.76 Thu, 12 May 2011 12:49:53 +0400)
smtp_banner = "$primary_hostname, ESMTP EXIM $version_number $tod_full"

# Максимальное число одновременных подключений по
# SMTP. Рассчитывать надо исходя из нагрузки на сервер
smtp_accept_max = 100

# максимальное число сообщений принимаемое за одно соединение
smtp_accept_max_per_connection = 20

# максимальное число писем в очереди SMTP
smtp_accept_queue = 40

# максимальное число сообщений записываемых в логи
smtp_connect_backlog = 30

# максимальное число коннектов с одного хоста
smtp_accept_max_per_host = 20

# ограничение на сообщение
#recipients_max = 16

# отклонять сообщения у которых слишком много получателей
#recipients_max_reject = true

# Ход ладьёй - для увеличения производительности,
# директория `spool` внутри, разбивается на
# директории - это ускоряет обработку
split_spool_directory = true

# Если у сообщения много адресатов на удалённых хостах,
# то запускатеся до указанного числа максимально число
# параллельных процессов доставки
remote_max_parallel = 15

# при генерации сообщения об ошибке прикладывать
# не всё сообщение, а кусок (от начала) указанного
# размера (иногда полезно и целиком - в таком случае
# просто закомментируйте эту строку)
return_size_limit = 70k

# размер сообщения. У меня стоит относительно большой
# размер (`относительно` - потому, что на большинстве
# хостов оно ограничено 2-5-10мб, либо стоит анлим.)
message_size_limit = 20M

# разрешаем неположенные символы в HELO (столкнулся
# с этим случайно - имя фирмы состояло из двух слов
# и какой-то раздолбай домен обозвал my_firme_name
# прям с подчёркиваниями... Виндовые клиенты при
# соединении радостно рапортовали о себе
# `vasya@domain_tr.ru` ну а экзим их футболил :))
helo_allow_chars = _

# Принудительная синхронизация. Если отправитель
# торопится подавать команды, не дождавшись ответа,
# то он посылается далеко и надолго :)
smtp_enforce_sync = false

# Указать директорию в которую писать логи
#log_file_path = /var/log/exim/%slog

# Выбираем, что мы будем логировать
# + - писать в логи,
# - - Не писать в логи.
# +all_parents - все входящие?
# +connection_reject - разорваные соединения
# +incoming_interface - интерфейс (реально - IP)
# +lost_incoming_connections - потеряные входящие
# соединения
# +received_sender - отправитель
# +received_recipients - получатель
# +smtp_confirmation - подтверждения SMTP?
# +smtp_syntax_error - ошибки синтаксиса SMTP
# +smtp_protocol_error - ошибки протокола SMTP
# -queue_run - работа очереди (замороженные мессаги)
log_selector = \
    +all_parents \
    +connection_reject \
    +incoming_interface \
    +lost_incoming_connection \
    +received_sender \
    +received_recipients \
    +smtp_confirmation \
    +smtp_syntax_error \
    +smtp_protocol_error \
    -queue_run

# Убираем собственную временную метку exim`a из логов, её ставит
# сам syslogd - нефига дублировать
syslog_timestamp = no

######################################################################
#                       ACL CONFIGURATION                            #
#         Specifies access control lists for incoming SMTP mail      #
######################################################################
begin acl

# Эти правила срабатывают для каждого получателя
acl_check_rcpt:


  # принимать сообщения которые пришли с локалхоста,
  # не по TCP/IP
  accept  hosts = :


  # Запрещаем письма содержащие в локальной части
  # символы @; %; !; /; |. Учтите, если у вас было
  # `percent_hack_domains` то % надо убрать.
  # Проверяются локальные домены
  deny    message       = "incorrect symbol in address"
          domains       = +local_domains
          local_parts   = ^[.] : ^.*[@%!/|]

  # Проверяем недопустимые символы для
  # нелокальных получателей:
  deny    message       = "incorrect symbol in address"
          domains       = !+local_domains
          local_parts   = ^[./|] : ^.*[@%!] : ^.*/\\.\\./

  # Запрещщаем тех, кто не обменивается приветственными
  # сообщениями (HELO/EHLO)
  deny    message       = "HELO/EHLO require by SMTP RFC"
          condition     = ${if eq{$sender_helo_name}{}{yes}{no}}

  # Принимаем сообщения от тех, кто аутентифицировался:
  accept  authenticated = *

  # Рубаем нах, тех, кто подставляет свой IP в HELO
  deny    message       = "Your IP in HELO - access denied!"
          hosts         =  * : !+relay_from_hosts
          condition     = ${if eq{$sender_helo_name}\
    {$sender_host_address}{true}{false}}

  # Рубаем тех, кто в HELO пихает мой IP
  deny    condition     = ${if eq{$sender_helo_name}\
    {$interface_address}{yes}{no}}
          hosts         = !127.0.0.1 : !localhost : *
          message       = "Main IP in your HELO! Access denied!"

  # Рубаем тех, кто в HELO пихает только цифры
  # (не бывает хостов ТОЛЬКО из цифр)
  deny    condition     = ${if match{$sender_helo_name}\
    {\N^\d+$\N}{yes}{no}}
          hosts         = !127.0.0.1 : !localhost : *
          message       = "Can not be only number in HELO!"

  # Рубаем тех, кто не пишет отправителя (пробел)
  deny    condition     = ${if match{$sender_address}{\N^\s+$\N}{yes}{no}}
          hosts         = !127.0.0.1 : !localhost : *
          message       = "Sender address contains spaces?! not for RFC..."

# Рубаем всех, кроме нашего внешнего пересыльщика masterhost.ru и localhost
#  deny   condition = ${if match{$sender_helo_name}{masterhost.ru}{no}{yes}}
#         hosts     = !127.0.0.1 : !localhost : !192.168.0.0/24 : *
#         message   = "Access deny!"

# Рубаем всех, если адрес отправителя нет в алиасах, кроме локальной сети
#  deny   condition = ${lookup mysql{SELECT `goto` FROM \
#         `alias` WHERE \
#         `address`='${quote_mysql:$local_part@mydomain.ru}'}{no}{yes}}
#         hosts         = !127.0.0.1 : !localhost : !192.168.1.3: *
#         message       = "No such user!"

	# Задержка. (это такой метод борьбы со спамом,
	# основанный на принципе его рассылки) На этом рубается
	# почти весь спам. Единственно - метод неприменим на
	# реально загруженных MTA - т.к. в результате ему
	# приходится держать много открытых соединений.
	# но на офисе в сотню-две человек - шикарный метод.
    warn
        # ставим дефолтовую задержку в 20 секунд
        set acl_m0 = 20s

    warn
        # ставим задержку в 0 секунд своим хостам и
        # дружественным сетям (соседняя контора :))
        hosts = +relay_from_hosts : 127.0.0.1/8 : 192.168.0.0/24
        set acl_m0 = 0s

    warn
        # пишем в логи задержку (если оно вам надо)
        logwrite = Delay $acl_m0 for $sender_host_name \
        [$sender_host_address] with HELO=$sender_helo_name. Mail \
        from $sender_address to $local_part@$domain.
        delay = $acl_m0

  # Проверка получателя в локальных доменах.
  # Если не проходит, то проверяется следующий ACL,
  # и если непрошёл и там - deny
    accept  domains       = +local_domains
            endpass
            message       = "In my mailserver not stored this user"
            verify        = recipient

  # Проверяем получателя в релейных доменах
  # Опять-таки если не проходит -> следующий ACL,
  # и если непрошёл и там - deny
    accept  domains       = +relay_to_domains
            endpass
            message       = "main server not know how relay to this address"
            verify        = recipient

# Рубаем тех, кто в блэк-листах. Серваки перебираются
# сверху вниз, если не хост не найден на первом, то
# запрашивается второй, и т.д. Если не найден ни в одном
# из списка - то почта пропускается.
# deny message = "you host in blacklist - $dnslist_domain \n $dnslist_text"
#      dnslists = opm.blitzed.org : \
#	            proxies.blackholes.easynet.nl : \
#                 cbl.abuseat.org : \
#		    bl.spamcop.net : \
#                 bl.csma.biz : \
#                 dynablock.njabl.org

  # Разрешаем почту от доменов в списке relay_from_hosts
    accept  hosts         = +relay_from_hosts

  # Если неподошло ни одно правило - чувак явно ищет
  # открытый релей. Пинаем с сервера.
    deny message = "Access deny - autorization failed. Relay not permitted"

acl_check_mime:

  # Произодим декодирование mime сообщений. Полезно для дальнейшей проверки на
  # вирусы
  warn decode = default

  # Запрет mime вложений по расширениям
  deny message = Blacklisted file extension detected
     condition = ${if match \
                 {${lc:$mime_filename}} \
                 {\N(\.cpl|\.pif|\.bat|\.scr|\.lnk|\.com|\.exe)$\N} \
                 {1}{0}}

  # Пропускаем остальное
  accept

acl_check_data:

  # Тут мы проверяем письма на ***SPAM***
  # .include_if_exists /usr/local/etc/exim/includes/antispam.conf

  # Проверяем письма на вирусы
  #  deny !hosts = 192.168.100.0/24
  #  malware = *
  #  message = "In e-mail found VIRUS - $malware_name"

  # Если есть необходимость - тут проверки на спам

  # Пропускаем остальное
  accept


######################################################################
#                      ROUTERS CONFIGURATION                         #
#               Specifies how addresses are handled                  #
######################################################################
#     THE ORDER IN WHICH THE ROUTERS ARE DEFINED IS IMPORTANT!       #
# An address is passed to each router in turn until it is accepted.  #
######################################################################

begin routers

# 1.Проверка на "Левые рассылки" сделана через инклуды =)
#.include_if_exists /usr/local/etc/exim/includes/rewrite_trash

# 2.Копируем всю """исходящую""" почту с домена @mydomain.ru
# на почтовый ящик audit@mydomain.ru
#copy_message:
#   driver = redirect
#   condition = ${if match{$sender_address:}{@mydomain.ru}{yes}{no}}
#   unseen
#   domains = *
#   data = audit@mydomain.ru

# 2.Копируем всю почту на audit@mydomain.ru.ru
#copy_message:
#   driver = redirect
#   unseen
#   domains = *
#   data = audit@mydomain.ru

# 3.Все ошибки (отлупы) падают на ящик admin@mydomain.ru
#delivery_masterhost:
#   driver = redirect
#   condition = ${if match{$h_from:}{MAILER-DAEMON@|Mailer-Daemon@}{yes}{no}}
#   unseen
#   domains = *
#   data = admin@mydomain.ru

# 4. Смотрим альясы
mysql_aliases:
      driver = redirect
      allow_fail
      allow_defer
      data = ${lookup mysql{SELECT LCASE(`goto`) FROM `alias` WHERE \
            `address`=LCASE('${quote_mysql:$local_part@$domain}') OR \
            `address`=LCASE('${quote_mysql:@$domain}') AND `active`='1' \
            ORDER BY SUBSTRING_INDEX(`address`,'@',1) DESC LIMIT 1}}

# 5. Доставляем почту в dovecot
dovecot_user:
      driver = accept
      condition = ${lookup mysql{SELECT LCASE(`goto`) FROM \
            `alias` WHERE \
            `address`=LCASE('${quote_mysql:$local_part@$domain}') OR \
            `address`=LCASE('${quote_mysql:@$domain}') AND `active`='1' \
            ORDER BY SUBSTRING_INDEX(`address`,'@',1) DESC LIMIT 1}{yes}{no}}
      transport = dovecot_delivery
      cannot_route_message = Unknown user

# 7.Отправка почты в МИР через провайдера "КОМСТАР" smtp.aaanet.ru
aaanet_router:
   driver = manualroute
   transport = aaanet_transport
   domains = ! +local_domains
   route_list = * smtp.aaanet.ru

# 8.Если лег сервак aaanet.ru то EXIM отправляет напрямую
dnslookup:
   driver = dnslookup
   domains = ! +local_domains
   transport = remote_smtp
   ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
   no_more


######################################################################
#                      TRANSPORTS CONFIGURATION                      #
######################################################################
#                       ORDER DOES NOT MATTER                        #
#     Only one appropriate transport is called for each delivery.    #
######################################################################


begin transports

# Доставка локальным адресатам - в dovecot
# Надо заметить что тут использовалась ранее прямая доставка
# в директорию, но щас с портами стал-таки устанавливаться deliver
# программа dovecot занимающаяся доставкой messages.
dovecot_delivery:
   driver = pipe
   command = /usr/local/libexec/dovecot/deliver -d $local_part@$domain
   message_prefix =
   message_suffix =
   delivery_date_add
   envelope_to_add
   return_path_add
   log_output
   user = mailnull

# Транспорт осуществляющий доставку в pipe
address_pipe:
   driver = pipe
   return_output

# Транспорт для автоответов
address_reply:
   driver = autoreply

# Транспорт на smtp.aaanet.ru
aaanet_transport:
   driver = smtp
   hosts = smtp.aaanet.ru

# Доставка на удалённые хосты - по SMTP
remote_smtp:
   driver = smtp


######################################################################
#                      RETRY CONFIGURATION                           #
######################################################################


begin retry

# Этот кусок я не трогал. Думаю разработчики лучше знают,
# какие тут должны быть цифирьки. Если же вы это знаете
# лучше их - меняйте. Хотя... А какого, если Вы такой
# умный, читаете этот мануал? Может ну, их, цифирки, а? :)
# Address or Domain  Error   Retries
# -----------------  -----   -------
*                    *       F,2h,15m; G,16h,1h,1.5; F,4d,6h


######################################################################
#                      REWRITE CONFIGURATION                         #
######################################################################


begin rewrite

#*@rnd.mydomain.ru	$local_part@mydomain.ru	Eh
#*@office.mydomain.ru	$local_part@mydomain.ru Eh

#########################################
# Флаги                                 #
#########################################
# E ----> все поля конверта             #
# F ----> поле "From" в конверте        #
# T ----> поле "To" в конверте          #
# b ----> заголовок "Bcc:"              #
# c ----> заголовок "Cc:"               #
# f ----> заголовок "From:"             #
# h ----> все заголовки                 #
# r ----> заголовок "Reply-To:"         #
# s ----> заголовок "Sender:"           #
# t ----> заголовок "To:"               #
#########################################


######################################################################
#                   AUTHENTICATION CONFIGURATION                     #
######################################################################


begin authenticators

# Аутентификатор для Мастерхоста (masterhost_transport) LOGIN
# И плюс аутентификацию что лисяра придумал server_condition итд это она
# 1. Так авторизуется Netscape => (LOGIN)
auth_login:
   driver = plaintext
   public_name = LOGIN
   server_condition = ${lookup mysql{SELECT `username` FROM \
                     `mailbox` WHERE `username` = \
                     '${quote_mysql:$auth1}' AND `password` = \
                     '${quote_mysql:$auth2}'}{yes}{no}}
   server_prompts = Username:: : Password::
   server_set_id = $auth1

# 2. Так авторизуется Outlook Express => (PLAIN)
auth_plain:
   driver = plaintext
   public_name = PLAIN
   server_condition = ${lookup mysql{SELECT `username` FROM \
                     `mailbox` WHERE `username` = \
                     '${quote_mysql:$auth2}' AND `password` = \
                     '${quote_mysql:$auth3}'}{yes}{no}}
   server_prompts = :
   server_set_id = $auth2

# 3. Так авторизуется TheBat! => (CRAM-MD5)
auth_cram_md5:
   driver = cram_md5
   public_name = CRAM-MD5
   server_secret = ${lookup mysql{SELECT `password` FROM \
                        `mailbox` WHERE `username` \
                        = '${quote_mysql:$auth1}'}{$value}fail}
   server_set_id = $auth2


И добавляем в /etc/rc.conf

//> echo 'exim_enable="YES"' >> /etc/rc.conf


Ну и запускаем Exim

//> /usr/local/etc/rc.d/exim start


Создаем а админке Postfixadmin домен, почтовые ящики, алиасы.

После чего можно проверить почтовый сервера на возможность использования почтового сервера в качестве пересыльщика почты Open relay
Вот ссылка http://test.nettools.ru/
          http://www.abuse.net/relay.html





 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.1622 секунд
Из них PHP: 75%; SQL: 25%; Число SQL-запросов: 89 шт.
Исходный размер: 160660; Сжатая: 30722