Exim là một cung cụ MTA mạnh mẽ, cho phép chúng ta thực hiện gửi và nhận mail

Tổng quan quá trình routing email và transport của Exim

Đầu tiên, Exim sẽ phân biệt nơi cần gửi email tới dựa trên địa chỉ của người nhận. Exim sẽ phân loại ra 2 dạng địa chỉ là:

  • Local address - email sẽ được gửi tại localhost, các địa chỉ này đã tồn tại trên máy chủ (bằng file_append hoặc pipe_append)
  • Remote address - email sẽ được gửi tới 1 host khác bằng giao thức SMTP

Sau đó Exim sẽ lookup địa chỉ trong config của nó, nếu như hợp điều kiện nào đầu tiên, Exim sẽ sử dụng Routing đó cho việc gửi mail, nếu không trùng bất cứ điều kiện nào, Exim sẽ đưa email vào queue với trạng thái là Unrouteable Address

Sau khi địa chỉ đã tìm được Routing của đời mình, Routing đó sẽ sử dụng Transport config để đẩy email đi.

Email_Routing_Transport

Routing local

Danh sách các domain được định nghĩa là local được định nghĩe trong file congig của Exim:

1
domainlist local_domains = lsearch;/etc/virtual/domains

-> tất cả các domain có trong file /etc/virtual/domains sẽ được gửi vào local_address

Sau khi đã xác nhận được địa chỉ gửi nằm trong localhost, việc gửi mail cho các địa chỉ local tiếp túc được phân loại bởi block config Directors, tại đây Exim sẽ xác nhận rằng địa chỉ nhận tới có tồn tại trong danh sách User mà nó biết hay không, sau đó sẽ ghi nội dung email tới hòm thư của User đó hoặc chuyển tiếp vào pipe hay Alias tương ứng.

pipe_transport là phương thức gửi mail bằng cách chuyển tiếp email đó sử dụng command trên hệ thống, nó như kiểu pipeline chúng ta hay sử dụng trên Shell ấy.

1
pipe_transport | /usr/local/bin/procmail -d $local_part

Ví dụ 1 block config của Exim, driver là gì: driver là định nghĩa thuộc tính hoạt động của một block code trong Exim, các config trong Exim được chia thành các block và mỗi 1 block sẽ có 1 định nghĩa driver, giống như là khai báo thuộc tính của 1 biến, int, var, char, float ..v.v

1
2
3
virtual_localdelivery:
driver = appendfile
file = /path/to/mail/file

Driver định nghĩa là sẽ ghi vào file, vậy nên trong block config này sẽ kèm theo một số cấu hình nữa liên quan đến việc ghi email vào file.

1
2
3
virtual_address_pipe:
driver = pipe
command = /usr/local/bin/command $host $local_part

Còn đối với block này thì lại truyền email qua pipeline, cấu hình sẽ khác đi 1 chút. Lưu ý các cấu hình trên chỉ mang tính chất minh họa cho dễ hiểu :D

Routing to remote host

Đối với các remote_address, block Routers sẽ quản lý cách các email này được gửi, cụ thể là Transport nào tương ứng.

Tại mỗi Route của exim, chúng ta sẽ định nghĩa cho Transport nào sẽ quản lý cách thức mà email sẽ được gửi đi, đối với các địa chỉ local thì thường sẽ dùng phương thức ghi vào file mailbox của user . pipe_transport là phương thức gửi mail bằng cách chuyển tiếp email đó sử dụng command trên hệ thống, nó như kiểu pipeline chúng ta hay sử dụng trên Shell ấy.

Remote transport with SMTP

Lookup SMTP khi dùng nhiều tài khoản SMTP