1. 程式人生 > >Postfix+Dovecot+MySQL搭建郵件服務器

Postfix+Dovecot+MySQL搭建郵件服務器

其他 並保存 搭建郵件服務 一個 miss 存檔 .proto eight all

網上有很多使用Postfix搭建郵件服務器的文章,但目前貌似沒有看到較為完整的一篇。本例將嘗試在Ubuntu系統中使用Postfix+Dovecot+MySQL搭建郵件服務器。

說到郵件服務器,網上有許多不同解決方案。Window操作系統下常見的郵件服務器有hMailServer、MailEnable、EVOMailServer、Apache James(純Java跨平臺)等。

而在Linux/Unix系統中常用的郵件服務器也有不少選擇,最經典也是最常見的莫過於Postfix。這篇文章將會講述如何在Ubuntu系統之下,通過Postfix、Dovecot、MySQL整合實現普通意義上「郵件服務器」的大部分功能。

開始之前

配置郵件服務器並不是一項簡單的工作,其過程不僅需要一定的技術能力,同時也需要大家具有一定的耐心,同時也需要大家非常細心。為了能夠「看懂」並「最終實踐」這篇文章,大家還需要了解或掌握以下知識:

  • Postfix: 是一個標準的MTA「Mail Transfer Agent」服務器,它負責通過SMTP協議管理發送到本機的郵件以及由本機發向外界的郵件。在本例中,Postfix會把郵件的本地投遞工作「接受到郵件之後將郵件存檔到本地磁盤」交給Dovecot的LMTP服務「Local Mail Transfer Protocol service」處理。當然,當大家想通過服務器向外界發送郵件時,Postfix還將負責驗證權限以確保服務器不被濫用。「很多郵件服務器根本沒有對SMTP做用戶驗證,這將導致任何匿名用戶都可以通過服務器向外界發送郵件,從而使得服務器變成垃圾中轉站」
  • Dovecot: 是一個非常優秀的IMAP/POP服務器用以接收外界發送到本機的郵件。通常,Dovecot的工作內容包括:驗證用戶身份以確保郵件不會被泄露。在本例中,Dovecot將負責所有的「身份驗證」工作,我們會配置Dovecot查詢本地的MySQL數據庫以確認用戶身份
  • MySQL: 不必多說,它將存儲所有的用戶信息,其中包括:需要監聽的域名信息、用戶郵箱地址、登錄密碼、郵箱別名「alias」等
  • Ubuntu: 本例中的OS將選擇Ubuntu14.10作為標準,其他Linux發行版的相關操作不在描述

工作原理

服務器接收郵件的過程

在開始講述本例的內容之前,我們先來看看Postfix+Dovecot+MySQL是如何相互協作以實現郵件服務器的各項功能。我們假設 張三通過oschina.net的郵箱[email protected]發送一份郵件給 李四[email protected],則服務器接收郵件的過程大致如下圖所示:

技術分享圖片

  1. [email protected]發送郵件到[email protected]
  2. oschina.net服務器會通過DNS查詢mydomain.com的MX記錄並找到Postfix所在的服務器
  3. 郵件被發送給Postfix
  4. Postfix轉向MySQL求助,以查詢mydomain.com是不是需要處理的域名
  5. MySQL返回確認信息給Postfix
  6. Postfix將接受到的郵件投遞給Dovecot的LMTP服務以便做處理
  7. Dovecot將郵件內容保存到[email protected]用戶對應的磁盤路徑

用戶查收郵件的過程

上述例子中我們看到了服務器接收郵件的過程,接下來我們看看,當大家通過用戶名密碼登錄郵箱查看郵件時,會發生什麽事情:

技術分享圖片

  1. 郵件客戶端 to Dovecot:尊敬的Dovecot大人,您好!我闊以建立一個IMAP加密連接嗎?
  2. Dovecot to 郵件客戶端:當然闊以。這是我的SSL證書,請您告訴我帳號和密碼!
  3. 郵件客戶端 to Dovecot:好滴!這是我的用戶名和密碼,千萬不要告訴別人哦!
  4. Dovecot to MySQL:Hi 美女!請問下,這個用戶名和密碼是正確的嘛?
  5. MySQL to Dovecot:好的,請稍後!呃……這個用戶名和密碼是正確的哦!
  6. Dovecot打開存放在本地磁盤/var/mail/mydomain.com/llisi的mailbox
  7. Dovecot獲取到最新的郵件及其他相關信息
  8. Dovecot將郵件及其相關的其他信息通過IMAP協議發送給客戶端

用戶發送郵件的過程

查收了最新的郵件之後,李四[email protected]發現張三給他發來了郵件。現在,李四回復一封郵件給張三,會發生什麽事情:

技術分享圖片

  1. 郵件客戶端 to Postfix:尊敬的Postfix大人,您好!我闊以建立一個安全的SMTP連接嘛?
  2. Postfix to 郵件客戶端:說人話!可以就是可以,幹嘛要說「闊以」啊!你丫賤啊,找抽啊!想建立SMTP連接可以,不過要加密。這是我的SSL證書,告訴我你的帳號和密碼,你個賤人!
  3. 郵件客戶端 to Postfix:對不起,大人,我錯鳥!這是我的帳號和密碼,不要告訴別人哦!
  4. Postfix to Dovecot:Hi 帥哥,幫我查一下這個帳號和密碼!
  5. Dovecot to MySQL:Hi 美女,這個帳號和密碼是正確的呢?!還是正確的呢?!還是……
  6. MySQL to Dovecot:好啦,你乖啦!我查過啦,這個帳號密碼是正確的啦!表賣萌哦,Dovecot君!
  7. Dovecot to Postfix:大鍋,則個帳號密碼斯正缺滴!
  8. Postfix to 郵件客戶端:賤人,過來!你給的帳號密碼是正確的,允許你發送郵件!
  9. 郵件客戶端將編寫好的郵件通過SMTP協議發送給Postfix
  10. Postfix將收到的郵件轉發給對方

以上,大家已經看到郵件收、發的整個過程。接下來看看如何才能成功配置郵件服務器。

DNS配置

首先,你需要有一個域名。本例中假定我們的域名為mydomain.com,以此為基礎去做後續的所有工作。請註意:在DNS相關配置沒有成功之前,請勿嘗試後續的操作。即使你配置好了Postifx,只要DNS相關配置沒有成功,郵件服務器一樣不能正常工作。

其次,登錄域名管理系統「強烈推薦使用DNSPod做域名管理」,新增幾條MX記錄指向你的郵件服務器。

第三,關於TTL設置。在測試郵件服務器的過程中,大家大可把TTL時間設置的短一點,這樣可以讓DNS服務器在很短的時間之內就起作用。當測試階段過後,請即使將TTL時間設置成較大的值。什麽?你問為什麽要這樣?自己去Google一下看看吧!TTL設置的太短會帶來什麽安全隱患。

設置完以後,DNS的MX記錄及TTL時間大致如下:

mydomain.com         MX     10      mydomain.com    
mydomain.com            MX      10      12.34.56.78  
mail.mydomain.com    MX     10      12.34.56.78

SSL證書

關於SSL認證的問題,大家可以根據自己的情況做決定。有人偏向於購買第三方權威的SSL認證,也有人使用OpenSSL自己制作簽名。當然,上述兩種方法本質上是沒有什麽區別的,唯一的區別在於:如果是自己制作的SSL證書,大部分的郵件客戶端都會彈出提示框詢問是否信任等。

修改hostname

哈,終於進入了正題。現在,請大家打開終端「window系統用戶可以選擇使用putty等ssh工具連接服務器」並連接自己的服務器。

ssh [email protected]

連接成功以後,請第一時間執行下述命令切換到root用戶:

sudo -s

請註意
為什麽要切換到root用戶?純屬個人愛好,因為我很懶,懶得每次執行命令時在命令的前面帶上sudo這樣的參數,因此直接切換到root用戶好了。

接下來,在命令行中輸入如下命令查看hostname:

hostname

接著,在命令行輸入如下命令查看FQDN「fully-qualified domain name」:

hostname -f

將上述兩個名稱記錄下來,安裝postfix時你將會使用到。

當然,上述的機器名是可以隨時修改的,如果你想要修改,可以直接通過vi編輯器打開/etc/hostname文件,並將自己想要的機器名寫入其中並保存即可

MySQL安裝及配置

本例中我們使用MySQL數據庫保存Postfix需要服務的虛擬域名、用戶帳號及密碼、郵件別名三個重要的信息。

請註意:
其實Postfix和Dovecot是完全可以不使用數據庫的,二者都可以通過各種配置文件完成「零數據庫」的郵件服務器。但是,既然可以使用數據庫這麽方便,為什麽不用呢?將這些需要配置的信息存儲在數據庫中「如:用戶帳號及密碼等」,對今後的維護來說是非常方便的事情。不是麽?!

MySQL安裝

在Ubuntu種安裝軟件,是再簡單不過的事情了。安裝MySQL請在命令行中執行如下命令:

apt-get install mysql-server

安裝過程中會需要你輸入兩次MySQL的root口令,請牢記該口令

技術分享圖片

新建數據庫及用戶

接下來,我們需要新建一個MySQL用戶及一個數據庫:

  1. 使用root口令登錄MySQL

    mysql -u root -p
  2. 輸入root口令

  3. 新建一個數據庫,名稱叫做mailserver:

    create database mailserver character set utf8;
  4. 輸入如下命令以新建一個用戶mailserver,並指定密碼為mailserver123:

    create user mailserver@‘localhost‘ identified by ‘mailserver123‘;
  5. 將數據庫mailserver的所有權限賦給用戶mailserver:

    grant all on mailserver.* to mailserver@‘localhost‘ identified by ‘mailserver123‘;
  6. 退出root用戶:

    exit;
  7. 使用mailserver用戶登錄:

    mysql -u mailserver -p
  8. 輸入mailserver帳號的口令

  9. 將默認數據庫切換為mailserver數據庫:

    use mailserver;

新建表格

  1. 輸入如下SQL語句以新建virtual_domains表,該表是本地服務器用以接收郵件的域名:

    CREATE TABLE `virtual_domains` (  
      `id` int(11) NOT NULL auto_increment,  
      `name` varchar(50) NOT NULL,  
      PRIMARY KEY (`id`))  
      ENGINE=InnoDB DEFAULT CHARSET=utf8;
  2. 輸入如下SQL語句以新建virtual_users表,該表郵件服務器的終端用戶表,記錄用戶的郵件地址及密碼「千萬不要保存明文密碼」:

    CREATE TABLE `virtual_users` (  
    `id` int(11) NOT NULL auto_increment,  
    `domain_id` int(11) NOT NULL,  
    `password` varchar(106) NOT NULL,  
    `email` varchar(100) NOT NULL,  
    PRIMARY KEY (`id`),  
    UNIQUE KEY `email` (`email`),  
    FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE)  
    ENGINE=InnoDB DEFAULT CHARSET=utf8;
  3. 輸入如下SQL語句以新建virtual_aliases表,該表是郵件服務器別名表「郵件服務器種的別名alias的概念大家可以Google一番」:

    CREATE TABLE `virtual_aliases` (  
    `id` int(11) NOT NULL auto_increment,  
    `domain_id` int(11) NOT NULL,  
    `source` varchar(100) NOT NULL,  
    `destination` varchar(100) NOT NULL,  
    PRIMARY KEY (`id`),  
    FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE)  
    ENGINE=InnoDB DEFAULT CHARSET=utf8

    插入數據

    為了便於查看結果,接下來給上述三張表種插入一些測試數據:

  4. 給virtual_domains表插入測試數據,大致如下:

    insert into virtual_domains(id,name) values(1,‘mail.mydomain.com‘);     
    insert into virtual_domains(id,name) values(2,‘mydomain.com‘);

    請註意:
    上述表種id字段是自增列,可以不賦值。但無論如何,接下來的兩張表種我們將需要上述表種的逐漸列id的值。比如:我將要添加mydomain.com域名下的郵箱帳號,而mydomain.com在virtual_domains表種的id值為2。

  5. 給virtual_users表添加用戶數據:

    insert into virtual_users(id,domain_id,password,email)  
    values (1,2,ENCRYPT(‘zhangsan123456‘, CONCAT(‘$6$‘, SUBSTRING(SHA(RAND()), -16))),‘[email protected]‘);
    
    
    insert into virtual_users(id,domain_id,password,email)  
    values (2,2,ENCRYPT(‘123456lisi‘, CONCAT(‘$6$‘, SUBSTRING(SHA(RAND()), -16))),‘[email protected]‘);
  6. 給virtual_aliases表添加別名數據:

    insert into virtual_aliases(id,domain_id,source,destination)  
    values (1,2,‘[email protected]‘,‘[email protected]‘);
    
    insert into virtual_aliases(id,domain_id,source,destination)  
    values (1,2,‘[email protected]‘,‘[email protected]‘);

    請註意:
    通過上述別名表的數據,當有人給[email protected]發送郵件時,系統將自動將郵件轉發給[email protected][email protected]
    這種場景,在公司內部「發送通知」等情況下適用

測試數據

寫幾個SQL查詢語句查看下結果吧

select * from virtual_domains;  
select * from virtual_users;  
select * from virtual_aliases;

Postfix安裝及配置

Postfix是郵件發送的核心服務器,所有向內、向外投遞的郵件都需要經過Postfix通過SMTP協議完成。接下來的內容,大家需要修改Postfix相關的一些參數,它們是:

  • 告訴Postfix如何連接MySQL數據庫,並讓Postfix通過數據庫種的表確定收發郵件的域名、用戶帳號及密碼、郵件別名等
  • 告訴Postfix將收到的郵件轉發給Dovecot的LMTP服務以完成本地投遞
  • 告訴Postfix所有的連接都需要STARTTLS加密,如果有必要「廢話啊,當然必須這樣」
  • 開放本地端口25、465、587之一或全部

Postfix的安裝

在命令行種執行以下命令以安裝Postfix:

apt-get install postfix postfix-mysql

安裝過程中需要選擇Postfix的類型,請選擇Internet Site:

技術分享圖片

Postfix安裝過程中還會需要輸入System mail name,這裏請輸入你要收發郵件的域名地址「隨便寫也可以,反正後面需要修改配置文件」

Postfix的配置

  1. 備份Postfix的配置文件/etc/postfix/main.cf,先!

    cp /etc/postfix/main.cf /etc/postfix/main.cf_backup_20150511

    請註意
    任何時候,對任何配置進行修改之前,先做好備份總是非常必要的
    同時,這也是一個非常良好的操作習慣

  2. 使用vi編輯器打開/etc/postfix/main.cf文件

    vi /etc/postfix/main.cf
  3. 打開之後,按下i鍵進入編輯模式

  4. 鑒於我們沒有打算使用Postfix做用戶的權限驗證「上述幾個圖種已經展示清楚」,我們將要把Postfix默認的用戶驗證參數屏蔽,因此請在如下幾行前邊加入#符號以註釋:

    # TLS parameters  
      #smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem  
      #smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key  #smtpd_use_tls=yes  
      #smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache  
      #smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
  5. 復制如下內容,並將其插入到上述註釋代碼之後:

    smtpd_tls_cert_file=/etc/dovecot/dovecot.pem  
    smtpd_tls_key_file=/etc/dovecot/private/dovecot.pem  
    smtpd_use_tls=yes  
    smtpd_tls_auth_only = yes  
    
    #Enabling SMTP for authenticated users, and handing off authentication to Dovecot  
    smtpd_sasl_type = dovecot  
    smtpd_sasl_path = private/auth  
    smtpd_sasl_auth_enable = yes  
    smtpd_recipient_restrictions =  permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination

    請註意:
    上述幾個參數的含義,請參照Postfix配置文檔

  6. 按照如下方式修改mydestination一行的值:

    mydestination = localhost

    請註意:
    將mydestination的值修改為localhost,以便Postfix能夠通過MySQL表中相關數據決定需要接受/發送郵件的域名,這樣更具有通用性

  7. 在文檔種加入以下內容,以便告訴Postfix不要使用LDA「Local Delivery Agent」轉而使用Dovecot的LMTP完成本地郵件投遞:

    #Handing off local delivery to Dovecot‘s LMTP, and telling it where to store mail  
    virtual_transport = lmtp:unix:private/dovecot-lmtp
  8. 在文檔中加入以下內容,以便告訴Postfix去MySQL數據庫種尋找域名、用戶帳號密碼及郵件別名等信息:

    #Virtual domains, users, and aliases  
    virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf  
    virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf  
    virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
  9. 最終,修改完成以後的/etc/postfix/main.cf文件大致應該如下:

    # See /usr/share/postfix/main.cf.dist for a commented, more complete version    
    
    # Debian specific:  Specifying a file name will cause the first  
    # line of that file to be used as the name.  The Debian default  
    # is /etc/mailname.  
    #myorigin = /etc/mailname  
    
    smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)  
    biff = no  
    
    # appending .domain is the MUA‘s job.  
    append_dot_mydomain = no  
    
    # Uncomment the next line to generate "delayed mail" warnings  
    #delay_warning_time = 4h  
    
    readme_directory = no  
    
    # TLS parameters    
    #smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem 
    #smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key  
    #smtpd_use_tls=yes  
    #smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache  
    #smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache  
    
    smtpd_tls_cert_file=/etc/dovecot/dovecot.pem  
    smtpd_tls_key_file=/etc/dovecot/private/dovecot.pem  
    smtpd_use_tls=yes  
    smtpd_tls_auth_only = yes  
    
    #Enabling SMTP for authenticated users, and handing off authentication to Dovecot  
    smtpd_sasl_type = dovecot  
    smtpd_sasl_path = private/auth  
    smtpd_sasl_auth_enable = yes  
    smtpd_recipient_restrictions =  
        permit_sasl_authenticated,  
        permit_mynetworks,  
        reject_unauth_destination  
    
    # See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for    
    # information on enabling SSL in the smtp client.      
    myhostname = host.mydomain.com  
    alias_maps = hash:/etc/aliases  
    alias_database = hash:/etc/aliases  
    myorigin = /etc/mailname  
    #mydestination = example.com, hostname.mydomain.com,localhost.mydomain.com, localhost  
    mydestination = localhost  
    relayhost =  
            mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128    
    mailbox_size_limit = 0  
    recipient_delimiter = +  
    inet_interfaces = all  
    
    #Handing off local delivery to Dovecot‘s LMTP, and telling it where to store mail  
    virtual_transport = lmtp:unix:private/dovecot-lmtp  
    
    #Virtual domains, users, and aliases  
    virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf  
    virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf  
    virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
  10. 按下ESC鍵並輸入如下內容以保存並退出

    wq!
  11. 新建/etc/postfix/mysql-virtual-mailbox-domains.cf文件並輸入如下內容:

    user = mailserver   
    password = mailserver123  
    hosts = 127.0.0.1  
    dbname = mailserver  
    query = SELECT 1 FROM virtual_domains WHERE name=‘%s‘
  12. 重啟Postfix服務

    service postfix restart
  13. 測試上述內容是否正確,如果上述內容配置正確,則如下命令執行後返回結果應該為1:

    postmap -q mydomain.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
  14. 新建/etc/postfix/mysql-virtual-mailbox-maps.cf文件並輸入如下內容:

    user = mailserver    
    password = mailserver123  
    hosts = 127.0.0.1  
    dbname = mailserver  
    query = SELECT 1 FROM virtual_users WHERE email=‘%s‘
  15. 重啟Postfix服務

    service postfix restart
  16. 測試上述配置是否正確,如果上述內容配置正確,則如下命令執行後返回結果應該為1:

    postmap -q [email protected] mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
  17. 新建/etc/postfix/mysql-virtual-alias-maps.cf文件並輸入如下內容:

    user = mailserver    
    password = mailserver123  
    hosts = 127.0.0.1  
    dbname = mailserver  
    query = SELECT destination FROM virtual_aliases WHERE source=‘%s‘
  18. 重啟Postfix服務

    service postfix restart
  19. 測試上述配置是否正確,如果上述配置正確,則如下命令執行後返回結果應該是之前添加的別名帳號:

    postmap -q [email protected] mysql:/etc/postfix/mysql-virtual-alias-maps.cf
  20. 使用vi編輯器打開/etc/postfix/master.cf文件「請註意修改之前先備份」,找到submission和smtps所在的兩行,並將其註釋去掉。這樣做的目的是允許Postfix通過587和465端口發送郵件

  21. 重啟Postfix服務

    service postfix restart

搞定,Postfix服務器應該配置完成了。相信到這裏的時候,已經嚇走了90%以上的朋友,剩下的10%朋友們,你們是好樣的。

Dovecot安裝及配置

Dovecot在本例中充當IMAP、POP服務器的角色,同時它也將負責用戶登錄時用戶身份的驗證「Dovecot會將真正的驗證工作交給MySQL處理」。因為使用SSL,Dovecot將會使用993「IMAP協議」及995「POP協議」與外界交流,若服務器有iptable之類的玩意兒,請開放相關端口。

這部分的內容配置起來相對簡單,但是需要配置的文件繁多。大體上,我們需要配置如下的信息:

  1. 開啟Dovecot的IMAP、POP3、LMTP協議
  2. 告知Dovecot本地郵件的投檔路徑
  3. 連接Dovecot和MySQL數據庫以驗證用戶身份
  4. 配置SSL加密相關信息

Dovecot的安裝

通過如下命令安裝Dovecot最新版:

apt-get install dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql

Dovecot的配置

需要修改的配置文件有:

  • /etc/dovecot/dovecot.confDovecot的主配置文件
  • /etc/dovecot/conf.d/10-mail.confDovecot將要操作的磁盤路徑相關配置信息
  • /etc/dovecot/conf.d/10-auth.conf用戶驗證相關配置信息
  • /etc/dovecot/conf.d/auth-sql.conf.extSQL-Type驗證相關配置信息
  • /etc/dovecot/dovecot-sql.conf.extDovecot與數據庫連接相關配置信息
  • /etc/dovecot/conf.d/10-master.confDovecot本地socket相關配置信息
  • /etc/dovecot/conf.d/10-ssl.conf關於SSL的相關配置信息

請註意:
在修改上述文件之前,請一定先做好備份以方便恢復

修改/etc/dovecot/dovecot.conf文件

使用vi編輯器打開/etc/dovecot/dovecot.conf文件並在文件種加入如下內容:

!include conf.d/*.conf

# Enable installed  
protocols!include_try /usr/share/dovecot/protocols.d/*.protocol  
protocols = imap pop3 lmtp

如果以上內容已經存在,只需要把該行的#號去掉即可
上述內容大致的意思是:告訴Dovecot啟用所有.conf文件;並開啟Dovecot的imap、pop3、lmtp等相關協議使之正常工作

修改/etc/dovecot/conf.d/10-mail.conf文件

打開文件並找到mail_location相關信息,將其指定到本地磁盤的某個路徑,這個路徑將來會存放收到的郵件,如下所示:

mail_location = maildir:/var/mail/vhosts/%d/%n

同時,找到文件中mail_privileged_group相關信息並將起修改為:

mail_privileged_group = mail

保存文件並退出

在命令行種輸入如下內容以查看/var/mail路徑的權限:

ls -ld /var/mail

顯示的內容大致應該是:

drwxrwsr-x 2 root mail 4096 May  11 15:08 /var/mail

創建/var/mail/vhosts/文件夾給每個需要啟用的域名:

mkdir -p /var/mail/vhosts/mydomain.com

輸入如下命令以新建vmail用戶組及用戶並賦權限

groupadd -g 5000 vmail  
useradd -g vmail -u 5000 vmail -d /var/mail

接下來修改一下/var/mail/目錄的權限,使vmail能夠訪問:

chown -R vmail:vmail /var/mail

修改/etc/dovecot/conf.d/10-auth.conf文件

找到文件中disable_plaintext_auth並取消註釋

disable_plaintext_auth = yes

找到文件中auth_mechanisms並將其修改為如下值:

auth_mechanisms = plain login

默認情況下,Dovecot是允許Ubuntu系統用戶登錄使用的,我們需要將其禁用。找到文件種如下內容並將其註釋:

#!include auth-system.conf.ext

開啟Dovecot的MySQL支持,取消!include auth-sql.conf.ext的註釋符號:

#!include auth-system.conf.ext  
!include auth-sql.conf.ext  
#!include auth-ldap.conf.ext  
#!include auth-passwdfile.conf.ext  
#!include auth-checkpassword.conf.ext  
#!include auth-vpopmail.conf.ext  
#!include auth-static.conf.ext

修改/etc/dovecot/conf.d/auth-sql.conf.ext文件

在文件中加入如下內容:

passdb {  
    driver = sql  
    args = /etc/dovecot/dovecot-sql.conf.ext  
}  

userdb {  
    driver = static  
    args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n  
}

修改/etc/dovecot/dovecot-sql.conf.ext文件

取消文件中driver行的註釋,並將其修改為如下:

driver = mysql

取消文件中connect行的註釋,並將其修改為如下:

connect = host=127.0.0.1 dbname=mailserver user=mailserver password=mailserver123

取消文件中default_pass_scheme行的註釋,並將其修改為如下:

default_pass_scheme = SHA512-CRYPT

取消文件中password_query行的註釋,並將起修改為如下:

password_query = SELECT email as user, password FROM virtual_users WHERE email=‘%u‘;

保存退出

在命令行種輸入如下內容以修改目錄權限:

chown -R vmail:dovecot /etc/dovecot

chmod -R o-rwx /etc/dovecot

修改/etc/dovecot/conf.d/10-master.conf文件

打開文件做如下修改「通過將端口設置為0,以禁用非SSL加密的IMAP和POP3協議」:

service imap-login {  
    inet_listener imap {  
        port = 0   
    }  
    ...  
}  

service pop3-login {  
    inet_listener pop3 {  
        port = 0  
    }  
    ...  
}

找到文件中的service lmtp並將其修改如下:

service lmtp {  
        unix_listener /var/spool/postfix/private/dovecot-lmtp {  
        mode = 0600  
        user = postfix  
        group = postfix  
  }  

  # Create inet listener only if you can‘t use the above UNIX socket  
  #inet_listener lmtp {  
        #Avoid making LMTP visible for the entire internet  
        #address =  
        #port =  
        #}  
 }

找到文件中service auth並將其內容修改如下:

service auth {  
    # auth_socket_path points to this userdb socket by default. It‘s typically  
    # used by dovecot-lda, doveadm, possibly imap process, etc. Its default  
    # permissions make it readable only by root, but you may need to relax these  
    # permissions. Users that have access to this socket are able to get a list  
    # of all usernames and get results of everyone‘s userdb lookups.  

    unix_listener /var/spool/postfix/private/auth {  
            mode = 0666  
            user = postfix  
            group = postfix  
    }  

    unix_listener auth-userdb {  
            mode = 0600  
            user = vmail  
            #group =  
    }  

    # Postfix smtp-auth  
    #unix_listener /var/spool/postfix/private/auth {  
    #       mode = 0666  
    #}  

    # Auth process is run as this user.  
    user = dovecot  
}

找到文件中service auth-worker內容並修改如下:

service auth-worker {  
    # Auth worker process is run as root by default, so that it can access  
    # /etc/shadow. If this isn‘t necessary, the user should be changed to  
    # $default_internal_user.  

    user = vmail  
}

修改/etc/dovecot/conf.d/10-ssl.conf文件

找到文件中ssl_cert並修改內容如下「請確保dovecot的pem文件已經存在,如果大家使用了自己的SSL文件,請將如下內容修改為相應的路徑」:

ssl_cert = </etc/dovecot/dovecot.pem  
ssl_key = </etc/dovecot/private/dovecot.pem

強制用戶使用SSL加密:

ssl = required

重新啟動Dovecot服務:

service dovecot restart

測試郵件服務器是否正常

設置一個帳號,可以向MySQL對應的表中插入數據,接下來使用郵件客戶端來測試一下。推薦使用Thunderbird郵件客戶端或者Foxmail客戶端等。請註意以下內容:

  • 郵箱的全稱「包括後面的@mydomain.com」將作為用戶名
  • 郵箱密碼是MySQL數據庫種對應郵箱的密碼
  • 服務器相關接口是否全部開放?993、995、25等
  • 郵件收發的所有協議,包括IMAP、POP3、SMTP全部都需要開啟SSL加密

配置好客戶端之後即可連接獲取、發送郵件。

來自:http://my.oschina.net/baratsemet/blog/413923

Postfix+Dovecot+MySQL搭建郵件服務器