Xin chào! Ở các phần trước tôi đã hướng dẫn các bạn cách cài email server với Postfix và Dovecot, cài đặt và cấu hình cơ bản Roundcude để có một giao diện quản lý email một cách thân thiện. Tiếp theo phần này và cũng là phần cuối tôi sẽ hướng dẫn các bạn cách cấu hình để bạn có thể sử dụng nhiều email domain trên server email sẵn có, việc này sẽ giúp tiết kiệm chi phí cũng như công sức cài đặt một email server mới. Ngoài ra, tôi cũng sẽ hướng dẫn các bạn một số cấu hình để gửi email không bị vào mục Spam.
I. Cấu hình sử dụng nhiều email domain trên server mail có sẵn
Để cấu hình nhiều email domain trên server email đã cài và cấu hình xong với Postfix cần thay đổi một chút trong file main.cf. Tất nhiên domain mới bạn muốn cấu hình cần phải được trỏ 2 bản ghi A và MX như hướng dẫn trong phần #1. Mở file trong đường dẫn /etc/postfix/main.cf với lệnh sau
sudo vi /etc/postfix/main.cf
Sau đó tìm dòng mynetworks. Bạn thêm domain bạn đã trỏ DNS về server email của bạn. Lưu ý thêm domain vào dòng này rất quan trọng, vì nếu bạn quên bước này email của bạn sẽ không thể gửi ra ngoài được. Ví dụ thay đổi dòng mynetworks từ:
mynetworks = 127.0.0.0/8, 45.23.44.0/24
Thành:
mynetworks = 127.0.0.0/8, 45.23.44.0/24, example2.com, example3.com
Tiếp theo bạn cần tạo 2 file để map domain và user cho từng domain đó. Sử dụng lệnh sau để tạo 2 file đó:
touch /etc/postfix/virtual_domains touch /etc/postfix/virtual_users
Mở file virtual_domains và thêm các domain bạn mới trỏ cùng domain sẵn có từ trước như sau:
example.com OK example2.com OK example3.com OK
Sau đó bạn tạo user và password trên Centos bằng lệnh sau:
useradd -m admin_example2 -s /sbin/nologin passwd admin_example2
Tương tự bạn có thể tạo các user của các domain khác và đánh dấu thế nào để dễ nhận biết user đó thuộc domain nào là tuỳ theo các bạn, như mình là username_domain. Việc tạo là cần thiết vì khi một email được gửi đến Postfix cần phải biết email đó là của user nào. Sau khi tạo xong các user cần thiết, bạn cần thay đổi file virtual_users như sau.
sudo vi /etc/postfix/virtual_users #Thêm các dòng như bên dưới admin@example.com admin_example admin@example2.com admin_example2 admin@example3.com admin_example3
Ở đoạn ví dụ phía trên thì bên phải là email mà bạn sẽ dùng để gửi nhận ra bên ngoài và bên phải là user map với email đó. Nếu bạn muốn tự động forward đến một email khác thì bạn chỉ cẩn đổi cột user thành email sẽ nhận forward. Giống như thế này:
#Từ admin@example.com admin_example #Thành admin@example.com abc@gmail.com xyz@yahoo.com
Bạn có thể forward tới một hoặc nhiều email cùng lúc bằng cách thêm các email muốn nhận forward ngăn cách bằng khoảng trắng. Sau khi đã sửa xong 2 file virtual_domains và virtual_users thì bạn lưu và đóng 2 file đó lại. Sau đó lại mở file main.cf lên để sử tiếp như sau:
sudo vi /etc/postfix/main.cf #Thêm 2 dòng sau vào cuối file main.cf virtual_alias_domains = hash:/etc/postfix/virtual_domains virtual_alias_maps = hash:/etc/postfix/virtual_users
Sau đó lưu file và chạy các lệnh sau để map và restart lại Postfix:
postmap /etc/postfix/virtual_domains postmap /etc/postfix/virtual_users sudo systemctl restart postfix
Lưu ý: Sau mỗi lần bạn sửa file virtual_users và virtual_domains đều cần chạy lại những lệnh này đê Postfix map lại các cấu hình. Điều này rất quan trọng vì nếu không các cấu hình mới sẽ không nhận.
II. Sử dụng Roundcube với nhiều email domain
Roundcube là giao diện quản lý mail khá thân thiện và dễ sử dụng. Nhưng mặc định Roundcube chỉ chạy với một email domain. Tôi cũng đã thử tìm hiểu các plugin hỗ trợ việc sử dụng nhiều email domain với Roundcube nhưng cấu hình khá phức tạp và sử dụng không như mong muốn. May thay chỉnh sửa source code của Roundcube cũng không khó khăn lắm vì nó sử dụng PHP. Sau đây tôi sẽ hướng dẫn các bạn chỉnh sửa một chút để có thể sử dụng nhiều email domain với Roundcube một cách dễ dàng.
Bạn hãy mở source code Roundcube đang chạy trên server của bạn lên. Sau đó mở file index.php (file này nằm ngay root của thư mục source Roundcube). Ta sẽ sửa những dòng sau:
$RCMAIL->kill_session();
// Thêm đoạn code này vào để validate định dạng email.
$user_input = rcube_utils::get_input_value('_user', rcube_utils::INPUT_POST);
$valid_email = true;
if ( !filter_var($user_input, FILTER_VALIDATE_EMAIL) ) {
$valid_email = false;
}
Chú ý đoạn code mới thêm đặt ngay sau dòng $RCMAIL->kill_session(); . Tiếp theo vẫn trong file index.php đó, tìm đoạn code sau:
$auth = $RCMAIL->plugins->exec_hook('authenticate', array(
'host' => $RCMAIL->autoselect_host(),
'user' => trim(rcube_utils::get_input_value('_user', rcube_utils::INPUT_POST)),
'pass' => rcube_utils::get_input_value('_pass', rcube_utils::INPUT_POST, true, $pass_charset),
'valid' => $request_valid,
'cookiecheck' => true,
));
// Sửa thành như sau
if ( $valid_email ) {
$auth = $RCMAIL->plugins->exec_hook('authenticate', array(
'host' => $RCMAIL->autoselect_host(),
'user' => trim(rcube_utils::get_input_value('_user', rcube_utils::INPUT_POST)),
'pass' => rcube_utils::get_input_value('_pass', rcube_utils::INPUT_POST, true, $pass_charset),
'valid' => $request_valid,
'cookiecheck' => true,
));
// Lấy username cho từ email, gán lại 2 biến $auth['host'] và $auth['user'] để phù hợp với code cũ.
if ( strpos($auth['user'], '@')) {
$explode_user_domain = explode('@', $auth['user']);
$auth['host'] = 'mail.' . $explode_user_domain[1];
$auth['user'] = $explode_user_domain[0];
}
}
Tiếp theo tìm đoạn điều kiện if như sau và thêm điều kiện validate email vào trong đó như sau:
//Từ
// Login
if ($auth['valid'] && !$auth['abort']
&& $RCMAIL->login($auth['user'], $auth['pass'], $auth['host'], $auth['cookiecheck'])) {
// Thành
// Login
if ($auth['valid'] && !$auth['abort']
&& $RCMAIL->login($auth['user'], $auth['pass'], $auth['host'], $auth['cookiecheck'])
&& $valid_email //<---- thêm cái dòng này vào.
) {
Cuối cùng là tìm dòng $error_message (nó nằm ở dòng số khoảng 181 – 183) để thêm một đoạn thông báo lỗi khi người dùng nhập sai định dạng email:
$error_message = !empty($auth['error']) && !is_numeric($auth['error']) ? $auth['error'] : ($error_labels[$error_code] ?: 'loginfailed');
// Thêm đoạn if như bên dưới.
if ( !$valid_email ) {
$error_message = 'Username must be email address.';
}
Sau khi hoàn tất các bước trên, lưu file index.php và update code mới lên server của bạn và thử xem kết quả thế nào. Mật khẩu của user đăng nhập trên Roundcube chính là mật khẩu user bạn tạo từ câu lệnh useradd trên Centos.









(3 lượt thả tim)



