Cài đặt email server trên Ubuntu

Bước 1: Cài đặt Postfix (nếu chưa có)

sudo apt update
sudo apt install postfix mailutils -y

Khi cài đặt:

  • Chọn Internet Site
  • System mail name: mail.giamkichsan.com

Đây là hostname mail server của bạn.

3️⃣ Kiểm tra hostname

hostnamectl set-hostname mail.giamkichsan.com
hostname
  • mail.giamkichsan.com phải là hostname server.
  • Kiểm tra DNS A record: mail.giamkichsan.com trỏ tới IP server của bạn.

Bước 2: Tạo hoặc dùng chứng chỉ SSL/TLS

Bạn có thể dùng Let’s Encrypt hoặc chứng chỉ tự ký (self-signed).

A. Chứng chỉ Let’s Encrypt: Yêu cầu chứng chỉ sử dụng chế độ --standalone (yêu cầu tạm dừng máy chủ web nếu đang chạy trên cổng 80)
sudo apt install certbot
sudo certbot certonly --standalone -d mail.giamkichsan.com

Chứng chỉ sẽ nằm ở:

/etc/letsencrypt/live/mail.giamkichsan.com/fullchain.pem
/etc/letsencrypt/live/mail.giamkichsan.com/privkey.pem

Bước 3: Cấu hình Postfix để dùng SSL/TLS

Mở file cấu hình chính của Postfix:

sudo nano /etc/postfix/main.cf

Thêm hoặc sửa các dòng sau:

# Domain chính
myhostname = mail.giamkichsan.com
mydomain = giamkichsan.com
myorigin = /etc/mailname

# Máy chủ của bạn sẽ gửi mail đi từ domain
inet_interfaces = all
inet_protocols = all

# Mail địa phương
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

# Các máy chủ mà mail của bạn sẽ relay
#relayhost = 

# TLS (SSL)
smtp_tls_cert_file=/etc/letsencrypt/live/mail.giamkichsan.com/fullchain.pem
smtp_tls_key_file=/etc/letsencrypt/live/mail.giamkichsan.com/privkey.pem
smtp_use_tls=yes
smtp_tls_loglevel = 2
smtp_tls_security_level=may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# TLS cho Postfix SMTPD (receiving)
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.giamkichsan.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.giamkichsan.com/privkey.pem
smtpd_use_tls=yes
smtpd_tls_loglevel = 2
smtpd_tls_security_level = may
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_tls_auth_only = yes
smtpd_recipient_restrictions = 
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_unauth_destination

# My networks (chỉ mạng nội bộ gửi mail)
# mynetworks = 127.0.0.0/8 [::1]/128

Bước 4: Bật STARTTLS cho cổng SMTP

Trong file /etc/postfix/master.cf, đảm bảo dòng SMTPS (465) có STARTTLS:

smtps inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject

Điều này cho phép các client kết nối và nâng cấp lên TLS.


Bước 5: Kiểm tra cấu hình

Kiểm tra cấu hình Postfix:

sudo systemctl restart postfix
sudo systemctl status postfix
sudo postfix check

Bước 7: Kiểm tra SSL/TLS

Bạn có thể dùng openssl để kiểm tra:

openssl s_client -connect mail.giamkichsan.com:465 -starttls smtp

Nếu thành công, bạn sẽ thấy thông tin chứng chỉ và kết nối được mã hóa TLS.

Bước 8: Cách giải quyết Gmail từ chối email vì domain mail.giamkichsan.com chưa có SPF/DKIM

1a. Cấu hình SPF cho domain

👉 Vào DNS của giamkichsan.com kiểm tra SPF

dig txt giamkichsan.com

Nếu chưa có thì add DNS record (TXT) cho giamkichsan.com:

Type: TXT
Name: @
Value:
v=spf1 ip4:109.199.101.177 -all

Lưu ý:

  • 109.199.101.177 = IP VPS gửi mail
  • -all = chỉ cho phép IP này gửi mail

1b. SPF là gì

  • SPF xác thực IP nào được phép gửi mail thay domain.
  • Nó kiểm tra mail đến từ server hợp lệ hay không.
  • SPF chỉ dựa trên địa chỉ gửi (envelope sender), không kiểm tra nội dung.

2. Cài đặt DKIM (nếu muốn tăng uy tín)

1️⃣ Cài OpenDKIM

sudo apt update
sudo apt install opendkim opendkim-tools -y

2️⃣ Tạo thư mục lưu key DKIM

sudo mkdir -p /etc/opendkim/keys/giamkichsan.com
sudo chown -R opendkim:opendkim /etc/opendkim
sudo chmod -R 700 /etc/opendkim

3️⃣ Tạo DKIM key

cd /etc/opendkim/keys/giamkichsan.com
sudo opendkim-genkey -s mail -d giamkichsan.com
sudo chown opendkim:opendkim mail.private
sudo chmod 600 mail.private
  • -s mail → selector (bạn có thể đổi tên)
  • -d giamkichsan.com → domain của bạn
  • Sau khi chạy xong, bạn sẽ có 2 file:
  • mail.private → private key
  • mail.txt → public key để thêm vào DNS

4️⃣ Cấu hình OpenDKIM

Mở file /etc/opendkim.conf và chỉnh / thêm các dòng:

sudo nano /etc/opendkim.conf
# Phiên bản OpenDKIM
Syslog                  yes
UMask                   002
UserID                  opendkim:opendkim

# Thư mục chứa key riêng
KeyTable                /etc/opendkim/KeyTable
SigningTable            /etc/opendkim/SigningTable
ExternalIgnoreList      /etc/opendkim/TrustedHosts
TrustedHosts            /etc/opendkim/TrustedHosts

# Chế độ tự động chọn selector nếu có nhiều key
AutoRestart             yes
AutoRestartRate         10/1h
Mode                    sv
Canonicalization        relaxed/simple

##
Domain                  giamkichsan.com
Socket                  inet:12301@localhost // Chinh sua phu hop server

** Tạo các file hỗ trợ

a) KeyTable

sudo nano /etc/opendkim/KeyTable

Thêm hoặc sửa dòng:

#cú pháp chuẩn: keyname  domain:selector:/duong/dan/toi/private.key
mail._domainkey.giamkichsan.com giamkichsan.com:mail:/etc/opendkim/keys/giamkichsan.com/mail.private
  • mail là selector (có thể đặt tùy ý)
  • Đường dẫn tới private key của bạn

b) SigningTable

sudo nano /etc/opendkim/SigningTable
*@giamkichsan.com mail._domainkey.giamkichsan.com
  • Nghĩa là tất cả email từ domain @giamkichsan.com sẽ dùng key mail._domainkey.giamkichsan.com

c) TrustedHosts

sudo nano /etc/opendkim/TrustedHosts
127.0.0.1
localhost
giamkichsan.com
Phân quyền đúng (rất quan trọng)
sudo chown opendkim:opendkim /etc/opendkim/KeyTable
sudo chown opendkim:opendkim /etc/opendkim/SigningTable
sudo chown opendkim:opendkim /etc/opendkim/TrustedHosts
sudo chmod 640 /etc/opendkim/KeyTable
sudo chmod 640 /etc/opendkim/SigningTable
sudo chmod 640 /etc/opendkim/TrustedHosts
  • Các host này được tin cậy để gửi mail qua DKIM.

5️⃣ Cấu hình Postfix kết nối OpenDKIM

Chỉnh file /etc/postfix/main.cf, thêm:

sudo nano /etc/postfix/main.cf

Thêm nội dung dưới vào cuối file:

milter_default_action = accept
milter_protocol = 6
smtpd_milters = inet:localhost:12301
non_smtpd_milters = $smtpd_milters

6️⃣ Khởi động OpenDKIM và Postfix

sudo systemctl enable opendkim
sudo systemctl restart opendkim
sudo systemctl restart postfix

Kiểm tra lỗi

sudo journalctl -xeu opendkim.service | tail -50 //Nếu lỗi opendkim.service
sudo journalctl -u opendkim -xe

//Hoac chay debug neu van loi
sudo opendkim -f -x /etc/opendkim.conf

7️⃣ Thêm public DKIM vào DNS

Mở file mail.txt vừa tạo, copy nội dung TXT record. Ví dụ:

sudo nano /etc/opendkim/keys/giamkichsan.com/mail.txt
hoặc
sudo cat /etc/opendkim/keys/giamkichsan.com/mail.txt
mail._domainkey    IN    TXT    "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GN...rest_of_key..."
  • mail → selector (-s mail lúc tạo key)
  • Thêm record TXT này vào DNS của domain giamkichsan.com

Lưu ý: DNS có thể mất 15–60 phút để propagate.


8️⃣ Test DKIM

Sau khi DNS update:

opendkim-testkey -d giamkichsan.com -s mail -vvv

Nếu kết quả OK → DKIM đã hoạt động.

4 Test gửi mail
echo "Test gửi mail qua Gmail relay" | mail -s "Test Mail $(date)" duanvc2811@gmail.com

6️⃣ Kiểm tra mail queue / log

mailq # Mail còn trong queue hay đã gửi
tail -f /var/log/mail.log 
[hoac] sudo tail -f /var/log/syslog | grep --color=auto -E "postfix|DKIM|SPF|warning|error"
  • Nếu mail gửi thành công → ra khỏi queue, Gmail nhận ngay
  • Nếu bị lỗi → log sẽ chỉ ra ngay (thường là lỗi password hoặc TLS)

Nguyên nhân thường gặp

  1. File log /var/log/mail.log bị xóa, quyền sai hoặc filesystem readonly.
  2. Rsyslog không có quyền ghi vào thư mục /var/log.
  3. Một số hệ thống mới Ubuntu dùng systemd-journald để log thay vì file riêng cho mail, hoặc rsyslog chưa được cấu hình để ghi mail.

Cách fix

1️⃣ Tạo lại file log và cấp quyền

sudo touch /var/log/mail.log
sudo chown syslog:adm /var/log/mail.log
sudo chmod 640 /var/log/mail.log

2️⃣ Khởi động lại rsyslog

sudo systemctl restart rsyslog

3️⃣ Khởi động lại Postfix

sudo systemctl restart postfix

4️⃣ Kiểm tra log realtime

sudo tail -f /var/log/mail.log

Hãy bình luận đầu tiên

Để lại một phản hồi

Thư điện tử của bạn sẽ không được hiện thị công khai.


*