| Line 1: |
Line 1: |
| − | = Whispers Mail Server = | + | =Whispers Mail Server= |
| − | == Stack == | + | ==Stack== |
| − | * Web server (Apache)
| |
| − | * Database server (MySQL)
| |
| − | * Email server (MTA) (Exim4)
| |
| − | * IMAP server (Dovecot)
| |
| − | * Webmail server (Roundcube)
| |
| | | | |
| − | == Install ==
| + | *Web server (Apache) |
| − | * apt-get install apache2-mpm-prefork
| + | *Database server (MySQL) |
| − | ** (Some of these email servers require PHP; PHP is crappy and requires mpm-prefork (the ‘slow’ version of Apache))
| + | *Email server (MTA) (Exim4) |
| − | * apt-get install mysql-client | + | *IMAP server (Dovecot) |
| − | ** (should auto-install something like: mysql-common + mysql-client-5.5) | + | *Webmail server (Roundcube) |
| − | * apt-get install mysql-server | |
| − | ** (should auto-install something like: mysql-server-5.5 + mysql-server-core-5.5)
| |
| − | * apt-get install exim4 | |
| − | * apt-get install exim4-base
| |
| − | * apt-get install exim4-config
| |
| − | * apt-get install exim4-daemon-heavy
| |
| − | ** (there’s an “exim4-mysql” that might be sufficient to replace this, but I gave up: there are way too many exim4 packages, and no help for installing the “correct” set, so … just pick this and get the lot!)
| |
| − | * apt-get install dovecot-core
| |
| − | * apt-get install dovecot-imapd
| |
| − | * apt-get install dovecot-mysql
| |
| − | * apt-get install roundcube
| |
| − | * apt-get install roundcube-core
| |
| − | * apt-get install roundcube-mysql
| |
| − | * apt-get install roundcube-plugins
| |
| | | | |
| − | == Setup == | + | ==Install== |
| − | === DNS ===
| |
| − | You should know about this already: you need an “MX” record on your DNS server, and it needs to point to your main server where you’ll run your email, web, etc.
| |
| | | | |
| − | @Goddady:
| + | *apt-get install apache2-mpm-prefork |
| − | Removed:
| + | **(Some of these email servers require PHP; PHP is crappy and requires mpm-prefork (the ‘slow’ version of Apache)) |
| | + | *apt-get install mysql-client |
| | + | **(should auto-install something like: mysql-common + mysql-client-5.5) |
| | + | *apt-get install mysql-server |
| | + | **(should auto-install something like: mysql-server-5.5 + mysql-server-core-5.5) |
| | + | *apt-get install exim4 |
| | + | *apt-get install exim4-base |
| | + | *apt-get install exim4-config |
| | + | *apt-get install exim4-daemon-heavy |
| | + | **(there’s an “exim4-mysql” that might be sufficient to replace this, but I gave up: there are way too many exim4 packages, and no help for installing the “correct” set, so … just pick this and get the lot!) |
| | + | *apt-get install dovecot-core |
| | + | *apt-get install dovecot-imapd |
| | + | *apt-get install dovecot-mysql |
| | + | *apt-get install roundcube |
| | + | *apt-get install roundcube-core |
| | + | *apt-get install roundcube-mysql |
| | + | *apt-get install roundcube-plugins |
| | | | |
| − | A <br /> | + | ==Setup== |
| − | Host: @; Apunta a: $ELASTIC_IP; TTL:1h
| + | ====DNS==== |
| | + | {| class="wikitable" |
| | + | |+DNS Registries required by Mail Server |
| | + | !Type |
| | + | !Host |
| | + | !Points to |
| | + | !TTL |
| | + | |- |
| | + | |A |
| | + | |@ |
| | + | |54.154.227.190 |
| | + | |1h |
| | + | |- |
| | + | |CNAME |
| | + | |webmail |
| | + | |@ |
| | + | |1h |
| | + | |- |
| | + | |MX |
| | + | |@ |
| | + | |webmail.herrerosolis.com |
| | + | |1h |
| | + | |} |
| | + | You need an “MX” record on your DNS server, and it needs to point to your main server where you’ll run your email, web, etc. |
| | | | |
| − | CNAME<br />
| |
| − | Host: webmail; Apunta a: @; TTL:1h
| |
| | | | |
| − | MX<br /> | + | '''Remove''' MX registries from godaddy email forwarder:<br />MX: <br />Host: @; Apunta a:smtp.secureserver.net; Prioridad:30; TTL:1h<br />Host: @; Apunta a:mailstore1.secureserver.net; Prioridad:50; TTL:1h |
| − | host: @; Apunta a: webmail.herrerosolis.com; Prioridad: 10; TTL: 1h<br />
| |
| | | | |
| − | === Apache === | + | =====SPF===== |
| − | /etc/apache2/sites-available/webmail.conf
| + | {| class="wikitable" |
| − | <nowiki><VirtualHost *:80>
| + | |+DNS SPF Registry |
| − | ServerAdmin rafael@herrerosolis.com
| + | !Type |
| − | Redirect permanent / https://webmail.herrerosolis.com/
| + | !Host |
| − | # DocumentRoot /var/www/rafael
| + | !TXT Value |
| − | ServerName webmail.herrerosolis.com
| + | |- |
| − | ServerAlias webmail.herrerosolis.com
| + | |TXT |
| − | ErrorLog /var/log/apache2/webmail/error.log
| + | |@ |
| | + | |v=spf1 mx ip4:54.154.227.190 ~all |
| | + | |} |
| | | | |
| − | # Posible values include: debug, info, notice, warn, error, crit.
| + | =====DMARC===== |
| − | # alert, emerg.
| + | {| class="wikitable" |
| | + | |+DNS DMARC Registry |
| | + | !Type |
| | + | !Host |
| | + | !TXT Value |
| | + | |- |
| | + | |TXT |
| | + | |_dmarc |
| | + | |v=DMARC1; p=none Verification details: mail-tester.com; dmarc=none header.from=herrerosolis.com From Domain: herrerosolis.com DKIM Domain:MIIBIjANBg[...]qCwPwIDAQAB |
| | + | |} |
| | + | <br /> |
| | | | |
| − | CustomLog /var/log/apache2/webmail/access.log combined
| + | =====DKIM===== |
| − | </virtualHost>
| + | {| class="wikitable" |
| | + | |+DNS DKIM Registry |
| | + | !Type |
| | + | !Host |
| | + | !TXT Value |
| | + | |- |
| | + | |TXT |
| | + | |webmail._domainkey |
| | + | |v=DKIM1; k=rsa; p=MIIBIjAN[...]IDAQAB |
| | + | |} |
| | | | |
| − | <VirtualHost *:443>
| + | *Note: DKIM Host must be {selector}._domainkey where {selector} = DKIM_SELECTOR variable from /etc/exim4/conf.d/main/000_localmacros |
| − | ServerAdmin rafael@herrerosolis.com
| |
| − | DocumentRoot /var/lib/roundcube
| |
| − | ServerName webmail.herrerosolis.com
| |
| − | ServerAlias webmail.herrerosolis.com
| |
| | | | |
| − | ErrorLog /var/log/apache2/webmail/error.log
| + | ===Apache=== |
| | + | /etc/apache2/sites-available/webmail.conf |
| | + | <nowiki><VirtualHost *:80> |
| | + | ServerAdmin rafael@herrerosolis.com |
| | + | Redirect permanent / https://webmail.herrerosolis.com/ |
| | + | # DocumentRoot /var/www/rafael |
| | + | ServerName webmail.herrerosolis.com |
| | + | ServerAlias webmail.herrerosolis.com |
| | + | ErrorLog /var/log/apache2/webmail/error.log |
| | + | |
| | + | # Posible values include: debug, info, notice, warn, error, crit. |
| | + | # alert, emerg. |
| | + | |
| | + | CustomLog /var/log/apache2/webmail/access.log combined |
| | + | </virtualHost> |
| | + | |
| | + | <VirtualHost *:443> |
| | + | ServerAdmin rafael@herrerosolis.com |
| | + | DocumentRoot /var/lib/roundcube |
| | + | ServerName webmail.herrerosolis.com |
| | + | ServerAlias webmail.herrerosolis.com |
| | + | |
| | + | ErrorLog /var/log/apache2/webmail/error.log |
| | + | |
| | + | # Posible values include: debug, info, notice, warn, error, crit. |
| | + | # alert, emerg. |
| | + | CustomLog /var/log/apache2/webmail/access.log combined |
| | + | SSLEngine on |
| | + | SSLCertificateFile /etc/ssl/certs/herrerosolis.crt |
| | + | SSLCertificateKeyFile /etc/ssl/private/herrerosolis.key |
| | + | </virtualHost> |
| | + | </nowiki> |
| | | | |
| − | # Posible values include: debug, info, notice, warn, error, crit.
| + | ====OPTIONAL: Remove TinyMCE==== |
| − | # alert, emerg.
| |
| − | CustomLog /var/log/apache2/webmail/access.log combined
| |
| − | SSLEngine on
| |
| − | SSLCertificateFile /etc/ssl/certs/herrerosolis.crt
| |
| − | SSLCertificateKeyFile /etc/ssl/private/herrerosolis.key
| |
| − | </virtualHost>
| |
| − | </nowiki>
| |
| − | | |
| − | === OPTIONAL: Remove TinyMCE === | |
| | TinyMCE is a WYSIWYG text-editor for HTML emails. I hate it. It had a long history of being insecure, buggy, slow, and hard to use. So I disable it: | | TinyMCE is a WYSIWYG text-editor for HTML emails. I hate it. It had a long history of being insecure, buggy, slow, and hard to use. So I disable it: |
| | | | |
| Line 82: |
Line 136: |
| | | | |
| | <nowiki>Comment out these lines: | | <nowiki>Comment out these lines: |
| − | #<Directory "/usr/share/tinymce/www/">
| + | #<Directory "/usr/share/tinymce/www/"> |
| − | # Options Indexes MultiViews FollowSymLinks
| + | # Options Indexes MultiViews FollowSymLinks |
| − | # AllowOverride None
| + | # AllowOverride None |
| − | # Order allow,deny
| + | # Order allow,deny |
| − | # allow from all
| + | # allow from all |
| − | #</Directory>
| + | #</Directory> |
| − | </nowiki> | + | </nowiki> |
| | | | |
| − | === Create Databases === | + | ===Create Databases=== |
| − | mysql -u root -p
| + | <syntaxhighlight lang="bash"> |
| − | | + | mysql -u root -p |
| − | CREATE DATABASE email_accounts; | + | </syntaxhighlight> |
| − | | + | |
| − | USE email_accounts;
| + | <syntaxhighlight lang="mysql"> |
| − | | + | CREATE DATABASE email_accounts; |
| − | <nowiki>CREATE TABLE mailboxes (
| + | USE email_accounts; |
| | + | CREATE TABLE mailboxes ( |
| | id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY, | | id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY, |
| | domain_id INT(10) NOT NULL, | | domain_id INT(10) NOT NULL, |
| Line 107: |
Line 162: |
| | modified TIMESTAMP NULL | | modified TIMESTAMP NULL |
| | ); | | ); |
| | + | |
| | CREATE TABLE aliases ( | | CREATE TABLE aliases ( |
| − | id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
| + | id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY, |
| − | domain_id INT(10) NOT NULL,
| + | domain_id INT(10) NOT NULL, |
| − | local_part VARCHAR(250) NOT NULL,
| + | local_part VARCHAR(250) NOT NULL, |
| − | goto VARCHAR(250) NOT NULL,
| + | goto VARCHAR(250) NOT NULL, |
| − | description VARCHAR(250) NULL,
| + | description VARCHAR(250) NULL, |
| − | active TINYINT(1) NOT NULL DEFAULT 0,
| + | active TINYINT(1) NOT NULL DEFAULT 0, |
| − | created TIMESTAMP NOT NULL DEFAULT NOW(),
| + | created TIMESTAMP NOT NULL DEFAULT NOW(), |
| − | modified TIMESTAMP NULL
| + | modified TIMESTAMP NULL |
| | ); | | ); |
| | + | |
| | CREATE TABLE vacations ( | | CREATE TABLE vacations ( |
| − | id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
| + | id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY, |
| − | mailbox_id INT(10) NOT NULL,
| + | mailbox_id INT(10) NOT NULL, |
| − | subject VARCHAR(250) NOT NULL,
| + | subject VARCHAR(250) NOT NULL, |
| − | body TEXT NOT NULL,
| + | body TEXT NOT NULL, |
| − | description VARCHAR(250) NULL,
| + | description VARCHAR(250) NULL, |
| − | active TINYINT(1) NOT NULL DEFAULT 0,
| + | active TINYINT(1) NOT NULL DEFAULT 0, |
| − | created TIMESTAMP NOT NULL DEFAULT NOW(),
| + | created TIMESTAMP NOT NULL DEFAULT NOW(), |
| − | modified TIMESTAMP NULL
| + | modified TIMESTAMP NULL |
| | ); | | ); |
| | | | |
| | CREATE TABLE domains ( | | CREATE TABLE domains ( |
| − | id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
| + | id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY, |
| − | fqdn VARCHAR(250) NOT NULL,
| + | fqdn VARCHAR(250) NOT NULL, |
| − | type ENUM('local','relay') NOT NULL DEFAULT 'local',
| + | type ENUM('local','relay') NOT NULL DEFAULT 'local', |
| − | description VARCHAR(250) NULL,
| + | description VARCHAR(250) NULL, |
| − | active TINYINT(1) NOT NULL DEFAULT 0,
| + | active TINYINT(1) NOT NULL DEFAULT 0, |
| − | created TIMESTAMP NOT NULL DEFAULT NOW(),
| + | created TIMESTAMP NOT NULL DEFAULT NOW(), |
| − | modified TIMESTAMP NULL
| + | modified TIMESTAMP NULL |
| | ); | | ); |
| − | </nowiki> | + | </syntaxhighlight> |
| | + | |
| | | | |
| − | === Create your first email account and domain === | + | ===Create your first email account and domain=== |
| − | ==== Domain ==== | + | ====Domain==== |
| − | <nowiki>INSERT INTO domains VALUES(NULL,'herrerosolis.com','local','My personal domain',1,NOW(),NOW());</nowiki>
| + | <syntaxhighlight lang="mysql"> |
| | + | INSERT INTO domains VALUES(NULL,'herrerosolis.com','local','My personal domain',1,NOW(),NOW()); |
| | + | </syntaxhighlight> |
| | + | |
| | | | |
| − | ==== User ==== | + | ====User==== |
| − | <nowiki>INSERT INTO mailboxes VALUES(NULL,1,'joe',MD5('password - choose a good one'),'My account for joe@herrerosolis.com',1,NOW(),NOW());</nowiki>
| + | <syntaxhighlight lang="mysql"> |
| | + | INSERT INTO mailboxes VALUES(NULL,1,'joe',MD5('password - choose a good one'),'My account for joe@herrerosolis.com',1,NOW(),NOW()); |
| | + | </syntaxhighlight> |
| | + | |
| | | | |
| − | ==== Alias ==== | + | ====Alias==== |
| − | <nowiki>insert into aliases values (null, 1, 'rafa', 'rafael@herrerosolis.com', 'Redirect to me', 1, NOW(), NOW() );</nowiki>
| + | <syntaxhighlight lang="mysql"> |
| | + | insert into aliases values (null, 1, 'rafa', 'rafael@herrerosolis.com', 'Redirect to me', 1, NOW(), NOW() ); |
| | + | </syntaxhighlight> |
| | + | |
| | | | |
| − | === Create a database-account to access the database === | + | ===Create a database-account to access the database=== |
| − | <nowiki>grant ALL on email_accounts.* to 'email'@'localhost' identified by 'password';
| + | <syntaxhighlight lang="mysql"> |
| | + | grant ALL on email_accounts.* to 'cartero'@'localhost' identified by 'password'; |
| | flush privileges; | | flush privileges; |
| − | </nowiki> | + | </syntaxhighlight> |
| | + | |
| | + | |
| | http://bradthemad.org/tech/notes/exim_cheatsheet.php | | http://bradthemad.org/tech/notes/exim_cheatsheet.php |
| | | | |
| − | === Exim Configuration === | + | ===Exim Configuration=== |
| − | * TODO: review daemon ports @/etc/exim4/conf.d/main/9_exim4-config_daemon | + | |
| | + | *TODO: review daemon ports @/etc/exim4/conf.d/main/9_exim4-config_daemon |
| | | | |
| | | | |
| Line 162: |
Line 233: |
| | | | |
| | Creates the file: /etc/exim4/update-exim4.conf.conf<br /> | | Creates the file: /etc/exim4/update-exim4.conf.conf<br /> |
| − | Should look like: | + | Should look like:<syntaxhighlight lang="text"> |
| − | | + | # /etc/exim4/update-exim4.conf.conf |
| − | <nowiki># /etc/exim4/update-exim4.conf.conf
| |
| | # | | # |
| − | # Edit this file and /etc/mailname by hand and execute update-exim4.conf | + | # Edit this file and /etc/mailname by hand and execute update-exim4.conf # yourself or use 'dpkg-reconfigure exim4-config' |
| − | # yourself or use 'dpkg-reconfigure exim4-config' | |
| | # | | # |
| | # Please note that this is _not_ a dpkg-conffile and that automatic changes | | # Please note that this is _not_ a dpkg-conffile and that automatic changes |
| Line 194: |
Line 263: |
| | dc_hide_mailname='' | | dc_hide_mailname='' |
| | dc_mailname_in_oh='true' | | dc_mailname_in_oh='true' |
| − | dc_localdelivery='maildir_home'</nowiki> | + | dc_localdelivery='maildir_home' |
| | + | </syntaxhighlight> |
| | | | |
| − | ==== Macros ==== | + | ====Macros==== |
| | ADD the following to /etc/exim4/conf.d/main/000_localmacros | | ADD the following to /etc/exim4/conf.d/main/000_localmacros |
| | <nowiki>MAIN_LOCAL_DOMAINS = @:localhost:dsearch;/etc/exim4/virtual:${lookup mysql{SELECT fqdn AS domain FROM domains WHERE fqdn='${quote_mysql:$domain}' AND type='local' AND active=1}}</nowiki> | | <nowiki>MAIN_LOCAL_DOMAINS = @:localhost:dsearch;/etc/exim4/virtual:${lookup mysql{SELECT fqdn AS domain FROM domains WHERE fqdn='${quote_mysql:$domain}' AND type='local' AND active=1}}</nowiki> |
| | | | |
| − | ADD the following to /etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs | + | ADD the following to /etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs<syntaxhighlight lang="text"> |
| − | <nowiki># List of domains considered local for exim. Domains not listed here
| + | # List of domains considered local for exim. Domains not listed here |
| | # need to be deliverable remotely. | | # need to be deliverable remotely. |
| | + | |
| | domainlist local_domains = MAIN_LOCAL_DOMAINS | | domainlist local_domains = MAIN_LOCAL_DOMAINS |
| | | | |
| Line 211: |
Line 282: |
| | MYSQL_USER=email | | MYSQL_USER=email |
| | MYSQL_PASSWORD=password | | MYSQL_PASSWORD=password |
| − | hide mysql_servers = MYSQL_SERVER/MYSQL_DB/MYSQL_USER/MYSQL_PASSWORD</nowiki> | + | hide mysql_servers = MYSQL_SERVER/MYSQL_DB/MYSQL_USER/MYSQL_PASSWORD |
| | + | </syntaxhighlight> |
| | + | |
| | | | |
| − | ==== Routers ==== | + | ====Routers==== |
| − | CREATE the file /etc/exim4/conf.d/router/360_exim4-config_mysqlusers | + | CREATE the file /etc/exim4/conf.d/router/360_exim4-config_mysqlusers<syntaxhighlight lang="text"> |
| − | | + | dovecot_user: |
| − | <nowiki>dovecot_user:
| |
| | driver = accept | | driver = accept |
| | condition = ${lookup mysql{SELECT CONCAT(mailboxes.local_part,'@',domains.fqdn) AS goto FROM domains,mailboxes WHERE \ | | condition = ${lookup mysql{SELECT CONCAT(mailboxes.local_part,'@',domains.fqdn) AS goto FROM domains,mailboxes WHERE \ |
| Line 224: |
Line 296: |
| | domains.fqdn='${quote_mysql:$domain}' AND \ | | domains.fqdn='${quote_mysql:$domain}' AND \ |
| | domains.active=1}{yes}{no}} | | domains.active=1}{yes}{no}} |
| − | transport = dovecot_delivery</nowiki> | + | transport = dovecot_delivery |
| | + | |
| | + | </syntaxhighlight> |
| | + | |
| | | | |
| | Either DELETE this file, or comment-out all lines /etc/exim4/conf.d/router/400_exim4-config_system_aliases<br /> | | Either DELETE this file, or comment-out all lines /etc/exim4/conf.d/router/400_exim4-config_system_aliases<br /> |
| | | | |
| − | CREATE this file /etc/exim4/conf.d/router/401_exim4-config_mysql_aliases | + | CREATE this file /etc/exim4/conf.d/router/401_exim4-config_mysql_aliases<syntaxhighlight lang="text"> |
| − | | + | ### router/401_exim4-config_mysql_aliases |
| − | <nowiki>### router/401_exim4-config_mysql_aliases
| |
| | ################################# | | ################################# |
| | | | |
| Line 240: |
Line 314: |
| | system_aliases: | | system_aliases: |
| | driver = redirect | | driver = redirect |
| − | allow_fail | + | allow_fail |
| | allow_defer | | allow_defer |
| | data = ${lookup mysql{SELECT aliases.goto AS goto FROM domains,aliases WHERE \ | | data = ${lookup mysql{SELECT aliases.goto AS goto FROM domains,aliases WHERE \ |
| Line 248: |
Line 322: |
| | domains.fqdn='${quote_mysql:$domain}' AND \ | | domains.fqdn='${quote_mysql:$domain}' AND \ |
| | domains.active=1}} | | domains.active=1}} |
| − | </nowiki>
| |
| | | | |
| − | ==== Transports ====
| + | </syntaxhighlight> |
| − | CREATE / OVERWRITE the file /etc/exim4/conf.d/transport/30_exim4-config_dovecot
| + | |
| | | | |
| − | <nowiki>### transport/30_exim4-config_dovecot
| + | ====Transports==== |
| | + | CREATE / OVERWRITE the file /etc/exim4/conf.d/transport/30_exim4-config_dovecot<syntaxhighlight lang="text"> |
| | + | ### transport/30_exim4-config_dovecot |
| | ################################# | | ################################# |
| − |
| |
| − | #
| |
| | | | |
| | dovecot_delivery: | | dovecot_delivery: |
| Line 273: |
Line 346: |
| | group = mail | | group = mail |
| | mode = 0660 | | mode = 0660 |
| − | </nowiki> | + | </syntaxhighlight> |
| | + | |
| | | | |
| − | ==== Auth ==== | + | ====Auth==== |
| − | CREATE the file /etc/exim4/conf.d/auth/20_exim4-config_mysql-authenticator | + | CREATE the file /etc/exim4/conf.d/auth/20_exim4-config_mysql-authenticator<syntaxhighlight lang="text"> |
| − | | + | ### AUTHENTICATIOR SECTION |
| − | <nowiki>### AUTHENTICATIOR SECTION
| |
| | | | |
| | auth_plain: | | auth_plain: |
| Line 304: |
Line 377: |
| | domains.active=1}{yes}{no}} | | domains.active=1}{yes}{no}} |
| | server_prompts = Username:: : Password:: | | server_prompts = Username:: : Password:: |
| − | server_set_id = $auth1</nowiki> | + | server_set_id = $auth1 |
| | | | |
| | + | </syntaxhighlight> |
| | | | |
| − | ==== Ports ==== | + | |
| | + | ====Ports==== |
| | CREATE the file /etc/exim4/conf.d/main/9_exim4-config_daemon | | CREATE the file /etc/exim4/conf.d/main/9_exim4-config_daemon |
| | <nowiki>daemon_smtp_ports = 25 : 465 : 587</nowiki> | | <nowiki>daemon_smtp_ports = 25 : 465 : 587</nowiki> |
| Line 314: |
Line 389: |
| | https://aws.amazon.com/forms/ec2-email-limit-rdns-request?catalog=true&isauthcode=true | | https://aws.amazon.com/forms/ec2-email-limit-rdns-request?catalog=true&isauthcode=true |
| | | | |
| − | === Dovecot === | + | ====DKIM==== |
| | + | |
| | + | ====Generate DKIM private & public keys:==== |
| | + | <syntaxhighlight lang="bash"> |
| | + | sudo mkdir /etc/exim4/dkim && cd /etc/exim4/dkim |
| | + | sudo openssl genrsa -out webmail.herrerosolis.com.dkim.pem 2048 |
| | + | sudo openssl rsa -in webmail.herrerosolis.com.dkim.pem -pubout |sudo tee webmail.herrerosolis.com.dkim.pub |
| | + | </syntaxhighlight> |
| | + | |
| | + | ====Configure your exim to sign using the DKIM key==== |
| | + | Edit /etc/exim4/conf.d/main/000_localmacros and add at the beggining:<syntaxhighlight lang="text"> |
| | + | DKIM_DOMAIN = ${lc:${domain:$h_from:}} |
| | + | DKIM_KEY_FILE = /etc/exim4/dkim/webmail.herrerosolis.com.dkim.pem |
| | + | DKIM_PRIVATE_KEY = ${if exists{DKIM_KEY_FILE}{DKIM_KEY_FILE}{0}} |
| | + | DKIM_SELECTOR = webmail |
| | + | </syntaxhighlight> |
| | + | |
| | + | ====DKIM Multiple Domains (TODO)==== |
| | + | TODO: Handle multiple domains: https://debian-administration.org/article/718/DKIM-signing_outgoing_mail_with_exim4<syntaxhighlight lang="text"> |
| | + | DKIM_CANON = relaxed |
| | + | DKIM_SELECTOR = 20150726 |
| | + | |
| | + | # Get the domain from the outgoing mail. |
| | + | DKIM_DOMAIN = ${sg{${lc:${domain:$h_from:}}}{^www\.}{}} |
| | + | |
| | + | # The file is based on the outgoing domain-name in the from-header. |
| | + | DKIM_FILE = /etc/exim4/dkim/{DKIM_DOMAIN}.pem |
| | + | |
| | + | # If key exists then use it, if not don't. |
| | + | DKIM_PRIVATE_KEY = ${if exists{DKIM_FILE}{DKIM_FILE}{0}} |
| | + | </syntaxhighlight> |
| | + | |
| | + | |
| | + | |
| | + | Then run:<syntaxhighlight lang="bash"> |
| | + | update-exim4.conf |
| | + | service exim4 restart |
| | + | </syntaxhighlight> |
| | + | |
| | + | ===Dovecot=== |
| | Make sure you choose split files, can be fixed with: | | Make sure you choose split files, can be fixed with: |
| | dpkg-reconfigure dovecot-core | | dpkg-reconfigure dovecot-core |
| Line 321: |
Line 435: |
| | cat /etc/passwd | grep mail | | cat /etc/passwd | grep mail |
| | | | |
| − | ADD to the file /etc/dovecot/dovecot.conf | + | ADD to the file /etc/dovecot/dovecot.conf<syntaxhighlight lang="text"> |
| − | <nowiki>protocols = imap
| + | protocols = imap |
| − | listen = *, ::</nowiki> | + | listen = *, :: |
| | + | </syntaxhighlight> |
| | + | |
| | | | |
| | Add to the file /etc/dovecot/conf.d/10-mail.conf | | Add to the file /etc/dovecot/conf.d/10-mail.conf |
| Line 331: |
Line 447: |
| | <nowiki>!include auth-sql.conf.ext</nowiki> | | <nowiki>!include auth-sql.conf.ext</nowiki> |
| | | | |
| − | ADD to the file /etc/dovecot/dovecot-sql.conf.ext | + | ADD to the file /etc/dovecot/dovecot-sql.conf.ext<syntaxhighlight lang="text"> |
| − | <nowiki>driver = mysql
| + | driver = mysql |
| − | connect = host=127.0.0.1 dbname=email_accounts user=email password=password | + | |
| | + | connect = host=127.0.0.1 dbname=[MYSQL DATABASE] user=[MYSQL user] password=[MYSQL mailbox PASSWORD plain text] |
| | default_pass_scheme = MD5 | | default_pass_scheme = MD5 |
| | | | |
| − | password_query = SELECT CONCAT(mailboxes.local_part,'@',domains.fqdn) as `user`, mailboxes.password AS `password`,'/var/spool/mail/%d/%n' AS `userdb_home`, [YOUR UID] AS `userdb_uid`, [YOUR GID] AS `userdb_gid` FROM `mailboxes`, `domains` WHERE mailboxes.local_part = '%n' AND mailboxes.active = 1 AND mailboxes.domain_id = domains.id AND domains.fqdn = '%d' AND domains.active = 1 | + | password_query = SELECT CONCAT(mailboxes.local_part,'@',domains.fqdn) as `user`, mailboxes.password AS `password`,'/var/spool/mail/%d/%n' AS `userdb_home`, [YOUR mail user GID] AS `userdb_uid`, [YOUR mail user GID] AS `userdb_gid` FROM `mailboxes`, `domains` WHERE mailboxes.local_part = '%n' AND mailboxes.active = 1 AND mailboxes.domain_id = domains.id AND domains.fqdn = '%d' AND domains.active = 1 |
| | | | |
| − | user_query = SELECT '/var/spool/mail/%d/%n' AS `home`, [YOUR UID] AS `uid`, [YOUR GID] AS `gid`</nowiki> | + | user_query = SELECT '/var/spool/mail/%d/%n' AS `home`, [YOUR mail USER UID] AS `uid`, [YOUR mail user GID] AS `gid` |
| | | | |
| − | ==== SSL ==== | + | </syntaxhighlight> |
| | + | |
| | + | |
| | + | ====SSL==== |
| | - Get certificates ej: Lets Encrypt | | - Get certificates ej: Lets Encrypt |
| | Edit: /etc/dovecot/conf.d/10-ssl.conf | | Edit: /etc/dovecot/conf.d/10-ssl.conf |
| − | <nowiki>ssl = required | + | ssl = required |
| − | # Preferred permissions: root:root 0444
| + | |
| − | ssl_cert = </etc/ssl/certs/dovecot.pem
| + | ssl_key = </etc/letsencrypt/live/webmail.herrerosolis.com/privkey.pem |
| − | # Preferred permissions: root:root 0400
| + | ssl_cert = </etc/letsencrypt/live/webmail.herrerosolis.com/fullchain.pem |
| − | ssl_key = </etc/ssl/private/dovecot.pem</nowiki>
| |
| | | | |
| − | ==== Ports ==== | + | ====Ports==== |
| | Open ports: IMAP 143 & SSL IMAP 993 | | Open ports: IMAP 143 & SSL IMAP 993 |
| | | | |
| − | === Roundcube === | + | ===Roundcube=== |
| | EDIT the file /etc/roundcube/main.inc.php | | EDIT the file /etc/roundcube/main.inc.php |
| | $rcmail_config['default_host'] = '[YOUR MX RECORD]'; | | $rcmail_config['default_host'] = '[YOUR MX RECORD]'; |
| Line 359: |
Line 478: |
| | | | |
| | In that file, there are instructions on how to make it automatically calculate the address using %n, %d, etc. If your MX records for your different domains follow the same pattern (e.g. they are all “mail.my-domain.com”), and your webmail login addresses all follow the same pattern (e.g. “wemail.my-domain.com”), you can put one string here and it will automatically log people into the right server in every case, based on the URL they visited. | | In that file, there are instructions on how to make it automatically calculate the address using %n, %d, etc. If your MX records for your different domains follow the same pattern (e.g. they are all “mail.my-domain.com”), and your webmail login addresses all follow the same pattern (e.g. “wemail.my-domain.com”), you can put one string here and it will automatically log people into the right server in every case, based on the URL they visited. |
| − | ==== TLS ==== | + | ====TLS==== |
| | @/etc/roundcube/config.inc.php | | @/etc/roundcube/config.inc.php |
| | $config['default_host'] = "tls://webmail.herrerosolis.com"; | | $config['default_host'] = "tls://webmail.herrerosolis.com"; |
| − | ==== Allow dovecot self-signed certificate ==== | + | ====Allow dovecot self-signed certificate==== |
| | TODO: Lets Encrypt Certificate CA | | TODO: Lets Encrypt Certificate CA |
| | Add to /etc/roundcube/config.inc.php | | Add to /etc/roundcube/config.inc.php |
| | <nowiki>$config['imap_conn_options'] = array( | | <nowiki>$config['imap_conn_options'] = array( |
| − | 'ssl' => array(
| + | 'ssl' => array( |
| − | 'verify_peer' => false,
| + | 'verify_peer' => false, |
| − | 'verify_peer_name' => false,
| + | 'verify_peer_name' => false, |
| − | 'allow_self_signed' => true,
| + | 'allow_self_signed' => true, |
| − | ),
| + | ), |
| − | );
| + | ); |
| − | </nowiki> | + | </nowiki> |
| | + | |
| | + | ====Enable Password Plugin==== |
| | + | |
| | + | *TODO: SQL / password plugin options |
| | | | |
| − | ==== Enable Password Plugin ====
| |
| − | * TODO: SQL / password plugin options
| |
| | @/etc/roundcube/config.inc.php | | @/etc/roundcube/config.inc.php |
| | $config['plugins'] = array('xskin', 'password'); | | $config['plugins'] = array('xskin', 'password'); |
| | + | ====Maximum size for attached documents ===== |
| | + | |
| | + | *TODO: Maximum size for attached documents |
| | + | |
| | + | ====Fix zipdownload plugin==== |
| | + | sudo apt-get install php7.0-zip |
| | + | sudo apt-get install php7.0-gd |
| | | | |
| − | == Restart Everithing == | + | ====Spamassasin==== |
| − | <nowiki>/etc/init.d/apache2 restart
| |
| − | /etc/init.d/exim4 restart
| |
| − | /etc/init.d/dovecot restart</nowiki>
| |
| | | | |
| − | Exim may output a “paniclog”. If so, read it, fix it – and then manually delete the paniclog file, or else you’ll keep getting fake warnings every time you restart exim.
| + | *TODO: Spamassasin |
| | | | |
| | + | ====Roundcube Plugin Installer==== |
| | + | cd <roundcube-project-root> |
| | + | curl -s https://getcomposer.org/installer | php |
| | | | |
| | + | composer.json-dist to composer.json in your Roundcube root directory |
| | | | |
| | + | =====Installing Plugins===== |
| | + | https://plugins.roundcube.net/explore/<br /> |
| | + | Then edit your local composer.json file and add the "vendor/plugin" names to the "require" section of the JSON structure. Don't forget to specify the version constraint: |
| | + | <nowiki>"require" : { |
| | + | ..., |
| | + | "roundcube/rcsample": ">=0.2.0" |
| | + | }</nowiki> |
| | | | |
| | + | After every change to composer.json run |
| | + | php composer.phar install |
| | | | |
| | + | ==Restart Everithing== |
| | + | <syntaxhighlight lang="text"> |
| | + | /etc/init.d/apache2 restart |
| | + | /etc/init.d/exim4 restart |
| | + | /etc/init.d/dovecot restart |
| | + | </syntaxhighlight>Exim may output a “paniclog”. If so, read it, fix it – and then manually delete the paniclog file, or else you’ll keep getting fake warnings every time you restart exim. |
| | | | |
| − | === STARTTLS === | + | |
| | + | ===STARTTLS=== |
| | https://wiki.debian.org/Exim | | https://wiki.debian.org/Exim |
| | | | |
| − | = Troubleshooting = | + | =Troubleshooting= |
| | https://mediatemple.net/community/products/dv/204404634/troubleshooting-common-issues-with-email | | https://mediatemple.net/community/products/dv/204404634/troubleshooting-common-issues-with-email |
| − | === Exim === | + | ===Exim=== |
| | exim4 -bP | grep tls_ | | exim4 -bP | grep tls_ |
| | test with: | | test with: |
| Line 402: |
Line 547: |
| | swaks -a -tls -q HELO -s gollum.redactate.com -au test -ap '<>' | | swaks -a -tls -q HELO -s gollum.redactate.com -au test -ap '<>' |
| | | | |
| − | ==== Receiving emails ==== | + | ====Receiving emails==== |
| | Pick an email address that you added to the “email_accounts” database, and try sending email to it while logged-in to server command-line: | | Pick an email address that you added to the “email_accounts” database, and try sending email to it while logged-in to server command-line: |
| | exim -d -bt testname@yourdomain.com | | exim -d -bt testname@yourdomain.com |
| | …this will give a COMPLETE list of what exim is doing, and it will tell you every decision it made along the way. It should eventually decide the address is “routeable” and OK it. | | …this will give a COMPLETE list of what exim is doing, and it will tell you every decision it made along the way. It should eventually decide the address is “routeable” and OK it. |
| | | | |
| − | * TODO: SOLVED --> bind SMTP to eth0 but not to elastic_ip https://forums.aws.amazon.com/thread.jspa?messageID=776527򽥏 | + | *TODO: SOLVED --> bind SMTP to eth0 but not to elastic_ip https://forums.aws.amazon.com/thread.jspa?messageID=776527򽥏 |
| | + | |
| | If that looks OK, try sending an email from your normal email account (e.g. your Hotmail / Gmail / Yahoo.com address). Wait a minute, then check the server to see if it crashed trying to receive the email, by checking the logfiles. | | If that looks OK, try sending an email from your normal email account (e.g. your Hotmail / Gmail / Yahoo.com address). Wait a minute, then check the server to see if it crashed trying to receive the email, by checking the logfiles. |
| | | | |
| Line 422: |
Line 568: |
| | https://www.wormly.com | | https://www.wormly.com |
| | | | |
| − | ==== Sending emails ==== | + | ====Sending emails==== |
| | sending emails | | sending emails |
| | | | |
| Line 432: |
Line 578: |
| | | | |
| | mailq | grep frozen | awk '{print $3}' | xargs exim -v -M | | mailq | grep frozen | awk '{print $3}' | xargs exim -v -M |
| | + | |
| | + | ====Exim usefull commands==== |
| | + | https://hostpapasupport.com/list-useful-commands-manage-exim-mail-server/ |
| | + | |
| | + | ====Spam filters filtering your mails==== |
| | + | https://www.mail-tester.com/ |
| | | | |
| | | | |
| | Here is a list of commands to help: http://bradthemad.org/tech/notes/exim_cheatsheet.php | | Here is a list of commands to help: http://bradthemad.org/tech/notes/exim_cheatsheet.php |
| | | | |
| − | === Test Dovecot === | + | ===Test Dovecot=== |
| | https://wiki2.dovecot.org/TestInstallation | | https://wiki2.dovecot.org/TestInstallation |
| | | | |
| − | === Roundcube === | + | ===Roundcube=== |
| | http://www.iredmail.org/docs/debug.roundcubemail.html | | http://www.iredmail.org/docs/debug.roundcubemail.html |
| | | | |
| − | === DNS === | + | ===DNS=== |
| | https://mxtoolbox.com/diagnostic.aspx | | https://mxtoolbox.com/diagnostic.aspx |
| | | | |
| Line 449: |
Line 601: |
| | [https://www.dropbox.com/s/8w55kys0yirfmv9/Exim4.69%20configuration%20%2B%20exploitation%20review-j1osx__Q0PE.mp4?dl=0|exim4 configuration (mp4)] | | [https://www.dropbox.com/s/8w55kys0yirfmv9/Exim4.69%20configuration%20%2B%20exploitation%20review-j1osx__Q0PE.mp4?dl=0|exim4 configuration (mp4)] |
| | | | |
| − | = Resources = | + | =Resources= |
| | http://t-machine.org/index.php/2014/06/27/webmail-on-your-debian-server-exim4-dovecot-roundcube/<br /> | | http://t-machine.org/index.php/2014/06/27/webmail-on-your-debian-server-exim4-dovecot-roundcube/<br /> |
| | https://intodns.com/herrerosolis.com<br /> | | https://intodns.com/herrerosolis.com<br /> |
| Line 457: |
Line 609: |
| | 1. In the file /etc/dovecot/conf.d/auth-sql-conf.ext uncomment driver and set it to mysql | | 1. In the file /etc/dovecot/conf.d/auth-sql-conf.ext uncomment driver and set it to mysql |
| | 2. /etc/dovecot/conf.d/10-mail.conf uncomment first_valid_uid and set it to [your_uid] (ie. 8). If you need to do the same for first_valid_gid | | 2. /etc/dovecot/conf.d/10-mail.conf uncomment first_valid_uid and set it to [your_uid] (ie. 8). If you need to do the same for first_valid_gid |
| | + | |
| | + | https://pasztor.at/blog/the-big-exim-tutorial |
| | + | =Adding new Domains= |
| | + | |
| | + | #Add the new domain to to MySQL email_accounts.domains |
| | + | #Start creating accounts with the new domain id |
| | + | |
| | + | =Auxiliary Scripts= |
| | + | |
| | + | ===Create email account=== |
| | + | <syntaxhighlight lang="bash"> |
| | + | #!/bin/bash |
| | + | PASSWORD1="hola" |
| | + | PASSWORD2="mundo" |
| | + | DOMAIN="herrerosolis.com" |
| | + | echo "******************************* MAIL ACCOUNT INFORMATION *****************************************" |
| | + | |
| | + | read -p "Username (without@herrerosolis.com): " USERNAME |
| | + | |
| | + | while [[ "$PASSWORD1" != "$PASSWORD2" ]]; do |
| | + | read -s -p "Password: " PASSWORD1 |
| | + | echo |
| | + | read -s -p "Confirm password: " PASSWORD2 |
| | + | if [ "$PASSWORD1" != "$PASSWORD2" ]; then |
| | + | echo "Passwords dont match, try again..." |
| | + | fi |
| | + | done |
| | + | echo |
| | + | echo |
| | + | echo "Input MySQL database password for user mail" |
| | + | |
| | + | mysql -h 127.0.0.1 -u cartero -p -D email_accounts -e "INSERT INTO mailboxes VALUES(NULL,1,'$USERNAME',MD5('$PASSWORD1'),'Mail account for $USERNAME@${DOMAIN}',1,NOW(),NOW());" |
| | + | </syntaxhighlight> |
| | + | |
| | + | ===Create email alias=== |
| | + | <syntaxhighlight lang="bash"> |
| | + | #!/bin/bash |
| | + | |
| | + | echo "******************************* MAIL ACCOUNT INFORMATION *****************************************" |
| | + | |
| | + | read -p "Alias name (without _@redactate.com): " ALIAS |
| | + | |
| | + | read -p "Destiny account (full email address): " GOTO |
| | + | |
| | + | echo |
| | + | echo |
| | + | echo "Input MySQL database password for user mail" |
| | + | |
| | + | mysql -h 127.0.0.1 -u cartero -p -D email_accounts -e "INSERT INTO aliases VALUES (null, 2, '$ALIAS', '$GOTO', 'Redirecting $ALIAS@ to $GOTO', 1, NOW(),NOW());" |
| | + | |
| | + | </syntaxhighlight> |