Làm cách nào để định cấu hình postfix để chuyển tất cả email đến thành tập lệnh?


24

Sử dụng postfix, tôi muốn tất cả thư đến, đến bất kỳ địa chỉ nào (bao gồm cả những địa chỉ không ánh xạ tới người dùng cục bộ) để được chuyển đến tập lệnh. Tôi đã thử cấu hình mailbox_commandtrong /etc/postfix/main.cf:

mailbox_command = /path/to/myscript.py

Điều này hoạt động rất tốt nếu người dùng là người dùng cục bộ, nhưng nó không thành công đối với người dùng "không xác định" không có bí danh. Tôi đã thử cài đặt luser_relaycho người dùng cục bộ, nhưng cài đặt trước này mailbox_commandvà vì vậy lệnh không được chạy. Tôi đã thử cài đặt local_recipient_maps=(chuỗi trống), nhưng tin nhắn vẫn bị trả lại (người dùng không xác định).

Có một lời mời ma thuật nào tôi có thể sử dụng để đưa tất cả người dùng đã biết và chưa biết đến tập lệnh không?

Đầy đủ /etc/postfix/main.cftheo sau - đó là Ubuntu 10.04 mặc định, ngoại trừ mailbox_commanddòng:

# 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

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

myhostname = ... snip ...
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = sassafras, ... snip ...,localhost.localdomain, 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

mailbox_command = /path/to/my/script.py

Sau kịch bản thì sao? Điều này nghe có vẻ giống như những thứ mà trình quét vi-rút và bộ lọc thư rác thực hiện, có lẽ bạn có thể tìm thấy một hướng dẫn để định cấu hình một trong số đó và sử dụng cấu hình của nó cho tập lệnh của mình không?
DerfK

Các tin nhắn đi đến một ứng dụng web. Vì vậy, sau tập lệnh: một cơ sở dữ liệu, xử lý khác, công cụ khác, nhưng không phải là công cụ thư thông thường. Câu hỏi quan trọng là làm cho những người dùng không xác định không bị trả lại - đây là bên ngoài kịch bản virus / spam thông thường, nơi bạn sẽ trả lại những người dùng chưa được ánh xạ.
dùng67641

@ user67641 xin chào, tôi có cần đưa thư vào postfix trong tập lệnh của mình không hoặc bằng cách thêm một số dòng trong master.cf
merveotesi

Câu trả lời:


32

Ok, tôi chỉ làm việc này - mặc dù hairier hơn tôi nghĩ nó sẽ được. Tôi bỏ maildir_commandphần, và đi với transport_maps. Điều quan trọng là làm 5 việc:

  1. Thiết lập tệp db để xử lý các bí danh (và thêm bí danh bắt tất cả)
  2. Thiết lập tệp db để ánh xạ 'vận chuyển' cho tên miền được đề cập đến một trình xử lý đặc biệt.
  3. Biên dịch các tệp db thành định dạng db ber mà postfix muốn.
  4. Thiết lập trình xử lý /etc/postfix/master.cfđể chuyển thư đến tập lệnh.
  5. Đặt /etc/postfix/main.cfđể sử dụng db truyền tải cho transport_mapsvà db bí danh cho virtual_alias-maps.

(1) Tạo /etc/postfix/virtual_aliasesđể thêm bí danh bắt tất cả - localusercần phải là người dùng cục bộ hiện có:

@mydomain.tld   localuser@mydomain.tld

(2) Tạo /etc/postfix/transportđể thêm ánh xạ vận chuyển. "Mytransportname" có thể là bất cứ điều gì bạn muốn; nó được sử dụng dưới đây trong master.cf:

mydomain.tld    mytransportname:

(3) Tiếp theo, cả hai transportvirtual_aliasescần được biên dịch thành các tệp db berde:

$ sudo postmap /etc/postfix/virtual_aliases
$ sudo postmap /etc/postfix/transport

(4) Thêm phương tiện giao thông vào /etc/postfix/master.cf:

mytransportname   unix  -       n       n       -       -       pipe
  flags=FR user=localuser argv=/path/to/my/script.py
  ${nexthop} ${user}

(5) Trong /etc/postfix/main.cf:

  ...
  transport_maps = hash:/etc/postfix/transport
  virtual_alias_maps = hash:/etc/postfix/virtual_aliases

Và ... tốt để đi! Sheesh.


1
câu trả lời cực kỳ hữu ích
merveotesi

1
Bản đồ bí danh ảo là không cần thiết. Bạn có thể thực hiện điều tương tự với relay_domains(trong trường hợp đó, tệp vận chuyển có thể lọc dựa trên địa chỉ To: thực tế).
Brilliand

Tôi thấy bạn có thể định tuyến tất cả thư ảo đến một tập lệnh có virtual_transport = mailcaptcha:trong main.cfmailcaptcha unix - n n - - pipe flags=FR user=vmail argv=/usr/bin/perl /usr/local/mail-captcha/verify.pl ${sender} ${recipient}trong master.cf. Xem postfix.org/transport.5.htmlpostfix.org/VIRTUAL_README.html .
Chloe

(4) nên nằm trong một dòng duy nhất, đúng không? Cũng không phải là nó đòi hỏi một postfix restarthoặc reloadhoặc một cái gì đó như thế này? Điều cuối cùng: có một tệp nhật ký để xem các thư đã đến postfix không?
Basj

@Basj, tệp nhật ký là /var/log/mail.log.
fiedl

4

Lần duy nhất tôi đã sử dụng một cái gì đó như thế này là cho một hộp thư cụ thể của người dùng. Tất cả những gì được yêu cầu là bí danh tên người dùng cho một đường ống và một quá trình trong bí danh:

pong: "| /usr/local/bin/gotit.pl"

Điều này đã gửi lưu lượng truy cập cho "pong@mymailserver.com" tới một tập lệnh perl mà tôi đã viết để xử lý nó.

gotit.pl (ví dụ: đừng chọn tôi vì kỹ năng lập trình crappy =). Công việc của chúng tôi là xử lý một email tôi đã gửi đến máy chủ Exchange của chúng tôi (nơi nó được trả lời tự động thông qua một số mã VB) để xác minh rằng Exchange đang xử lý email một cách kịp thời. Nếu không, máy chủ thư sẽ gửi một email cảnh báo đến máy nhắn tin của chúng tôi và viết một tệp khóa để chúng tôi không bị spam liên tục.

#! /usr/bin/perl -w
use vars qw ( $mung $sent $tvalue $remainder $delta $fout );
$mung = time;
while (<STDIN>) {
    ($sent, $tvalue, $remainder ) = split /: /, $_, 3;
    $tvalue =~ s/(\D+)//g;
    chomp($tvalue);
    $delta = $mung-$tvalue;
    if ( $sent =~ "Sent" ) {
        $fout = "/var/spool/mailcheck/$tvalue";
        next unless ( -e $fout );
        open (TMP, "> $fout") or die "Couldn't open output file: $!\n";
        print TMP "Received in: $delta seconds.\n";
                close TMP;
        last;
    }
}

Vâng, và chỉ cần chuyển hướng @ mydomain.tld sang pong và tất cả chính đến cho mydomain.tld sẽ được dẫn.
Zaar Hai

và đối với những người trong chúng ta sử dụng nhiều tên miền ảo, đừng quên để chuyển hướng nó vào pong @ localhost để nó không đính kèm các tên miền mặc định cho bí danh
therightstuff

0

Tôi đã sử dụng một "tệp phẳng" kiểu cũ Mailboxđể nhận tất cả thư (và sau đó cắt tỉa cứ sau vài giờ nếu nó lớn), thay vì sử dụng các maildir/thư mục hiện đại , để xử lý thư qua các tập lệnh. Bạn có thể chạy logrotate trên tệp quá. Tôi cho rằng để giữ cho nó có thể quản lý được.

Bằng cách này, bạn có thể chỉ cần sao chép tất cả thư vào Hộp thư dưới dạng người dùng cục bộ.


0

Sau rất nhiều vấn đề đau đầu, tôi đã đưa ra giải pháp này dựa trên một vài nguồn khác nhau dẫn đến nỗ lực ít hơn nhiều, các bước quan trọng đã được định cấu hình virtual_alias_domainscũng như virtual_alias_mapsđảm bảo rằng ánh xạ ảo my-alias@localhostthay vì chỉ my-alias. Trong ví dụ của tôi, bí danh lệnh là chuyển email đến điểm cuối API của trang web, nhưng nó có thể dễ dàng chuyển sang một thứ khác.

Dưới đây là các bước bạn cần thực hiện:

  • Thiết lập các bản ghi A và MX cho tên miền của bạn, bản ghi A @ trỏ đến IP của máy chủ mà bạn sẽ nhận được email trên và MX với tên máy chủ @ và giá trị 10 mail.your-domain-name
  • sudo apt-get install postfix
  • Chọn "Trang web Internet" và nhập tên miền của bạn (đủ điều kiện)
  • sudo vi /etc/postfix/main.cf
  • Thêm mail.your-domain-name vào danh sách các mydestinationgiá trị
  • Nối
virtual_alias_domains = hash:/etc/postfix/virtual_domains
virtual_alias_maps = hash:/etc/postfix/virtual

đến cuối tập tin

  • sudo apt-get vi /etc/aliases
curl_email: "|curl --data-binary @- http://your-domain-name/email"
  • sudo newaliases
  • sudo apt-get vi /etc/postfix/virtual_domains
example.net   #domain
example.com   #domain
your-domain-name   #domain

(các trường #domain ngăn chặn các cảnh báo)

  • sudo postmap /etc/postfix/virtual_domains
  • sudo apt-get vi /etc/postfix/virtual
info@your-domain-name bob@gmail.com
everyone@your-domain-name bob@gmail.com jim@gmail.com
email_processor@your-domain-name curl_email@localhost
@your-domain-name catchall@whereveryouwant.com
ted@example.net jane@outlook.com
  • sudo postmap /etc/postfix/virtual
  • sudo /etc/init.d/postfix reload
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.