Postfix, gelen tüm e-postaları bir komut dosyasına yönlendirecek şekilde nasıl yapılandırılır?


24

Postfix'i kullanarak gelen tüm postaları, herhangi bir adrese (yerel kullanıcılarla eşleşmeyenler de dahil olmak üzere) bir betiğe aktarılmasını istiyorum. Ben ve yapılandırma konusunda denedim mailbox_commandiçinde /etc/postfix/main.cf:

mailbox_command = /path/to/myscript.py

Kullanıcı yerel bir kullanıcıysa bu harika çalışır, ancak takma adı olmayan "bilinmeyen" kullanıcılar için başarısız olur. luser_relayYerel bir kullanıcıya ayar yapmaya çalıştım , ancak bu önyargılardan mailbox_commanddolayı komut çalıştırılmıyor. Ayarlamayı denedim local_recipient_maps=(boş dize), ancak mesaj hala zıplıyor (bilinmeyen kullanıcı).

Bilinen ve bilinmeyen tüm kullanıcıların senaryoya girmesini sağlamak için kullanabileceğim sihirli bir çağrı var mı?

Dolu /etc/postfix/main.cfizler - bu, mailbox_commandçizgi hariç, varsayılan Ubuntu 10.04'tür :

# 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

Senaryodan sonra ne olacak? Bu, virüs tarayıcılarının ve spam filtrelerinin yaptığı türden bir şeye benziyor, belki bunlardan birini yapılandırmak ve betiğiniz için yapılandırmasını kullanmak için bir rehber bulabilirsiniz?
DerfK

Mesajlar bir web uygulamasına gider. Yani komut dosyasından sonra: bir veritabanı, diğer işlemler, diğer şeyler, ancak normal posta öğeleri değil. Anahtar soru, bilinmeyen kullanıcıların sıçramamasını sağlamaktır - bu, normal virüs / spam senaryosunun dışındadır;
user67641

@ user67641 merhaba benim betiğimde posta postfix içine posta enjekte gerekiyor ya da master.cf biraz daha satır ekleyerek gerekir
merveotesi

Yanıtlar:


32

Tamam, bu çalışmaya daha yeni başladım - düşündüğümden daha ince olmasına rağmen. Parçayı düşürdüm maildir_commandve birlikte gittim transport_maps. Anahtar 5 şey yapmaktır:

  1. Takma adları işlemek için bir db dosyası kurun (ve hepsini yakalama takma adı ekleyin)
  2. Söz konusu etki alanının 'aktarımını' özel bir işleyiciye eşlemek için bir db dosyası kurun.
  3. Db dosyalarını postfix'in istediği berkeley db biçiminde derleyin.
  4. İşleyiciyi /etc/postfix/master.cf, komut dosyasına posta göndermek için ayarlayın .
  5. Set /etc/postfix/main.cfiçin nakil db kullanmak transport_mapsve için takma db virtual_alias-maps.

(1) /etc/postfix/virtual_aliasesHepsini yakalama takma adı eklemek için oluşturun - localusermevcut bir yerel kullanıcı olması gerekir:

@mydomain.tld   localuser@mydomain.tld

(2) /etc/postfix/transportAktarma eşlemesi eklemek için oluşturun . "mytransportname" istediğiniz şeyi olabilir; aşağıda kullanılmıştır master.cf:

mydomain.tld    mytransportname:

(3) Sonra, her ikisi de transportve virtual_aliasesberkeley db dosyalarına derlenmelidir:

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

(4) Taşımayı şuraya ekle /etc/postfix/master.cf:

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

(5) İçinde /etc/postfix/main.cf:

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

Ve ... gitmek güzel! Sheesh.


1
son derece yararlı cevap
merveotesi 12:13

1
Sanal takma ad haritaları gerekli değildir. Aynı şeyi gerçekleştirebilirsiniz relay_domains(bu durumda taşıma dosyası asıl Kime: adrese göre filtre uygulayabilir).
Brilliand

Tüm sanal postaları virtual_transport = mailcaptcha:içinde main.cfve mailcaptcha unix - n n - - pipe flags=FR user=vmail argv=/usr/bin/perl /usr/local/mail-captcha/verify.pl ${sender} ${recipient}içinde olan bir komut dosyasına yönlendirebilirsiniz master.cf. Bkz postfix.org/transport.5.html ve postfix.org/VIRTUAL_README.html .
Chloe

(4) tek bir satırda olmalı, doğru mu? Ayrıca bir gerektirmez postfix restartveya reloadböyle falan? Son şey: posta ekine gelen postaları görmek için bir günlük dosyası var mı?
Basj

@Basj, günlük dosyası /var/log/mail.log.
fiedl,

4

Böyle bir şey kullandığım tek zaman belirli bir kullanıcının posta kutusu içindi. Gerekli olan tek şey, kullanıcının adını bir boruya ve takma adlardaki bir işleme takma ad vermek:

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

Bu, "pong@mymailserver.com" adresine gönderilen trafiği, işleme koymak için yazdığım bir perl komut dosyasına gönderdi.

gotit.pl (örnek olarak, beni crappy programlama skillz için seçmeyin =). Görev, Exchange'in e-postaları zamanında işlediğini doğrulamak için Exchange sunucumuza gönderdiğim bir e-postayı (bazı VB kodlarıyla otomatik olarak yanıtlandı) işlemekti. Olmazsa, posta sunucusu çağrı cihazlarımıza bir uyarı e-postası gönderir ve sürekli spam alamadığımız bir kilit dosyası yazar.

#! /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;
    }
}

Evet, ve sadece @ etkialanım.tld'i pong'a yönlendirin ve tüm etki alanım etki alanı.tld için yayınlanacak.
Zaar Hai

ve birden fazla sanal alan kullananlar için, pong @ localhost
dizinine

0

MailboxTüm postaları almak için eski bir stil "düz dosya" kullandım (ve büyükse her birkaç saatte bir budamak için), modern maildir/klasörleri kullanmak yerine postaları komut dosyalarıyla işlemek için kullandım . Dosya üzerinde logrotate çalıştırabilirsin, ben de yönetilebilir kalmasını beklerim.

Bu şekilde tüm postaları yerel bir kullanıcı olarak bir Posta Kutusuna kopyalayabilirsiniz.


0

Çok sayıda baş ağrısından sonra, bu çözümü çok daha az çaba harcayan birkaç farklı kaynağa dayanarak bir araya getirdim , kritik adımlar virtual_alias_domainsaynı zamanda yapılandırıldı virtual_alias_mapsve sanal haritalamanın tam olarak my-alias@localhostyerine getirilmesini sağladı my-alias. Örneğimde komut takma adı, e-postayı bir web sitesi API uç noktasına yönlendirmektir, ancak başka bir şeye kolayca iletilebilir.

İşte atmanız gereken adımlar:

  • Etki alanınız için A ve MX kayıtlarınızı, e-postaları alacağınız sunucunun IP’sini işaret eden A kayıt @ ve ana bilgisayar adı @ ile birlikte MX 10 mail.your-domain-name
  • sudo apt-get install postfix
  • "İnternet Sitesi" ni seçin ve alan adınızı girin (tam nitelikli)
  • sudo vi /etc/postfix/main.cf
  • Mail.your-domain-name'i mydestinationdeğerler listesine ekleyin
  • ekleme
virtual_alias_domains = hash:/etc/postfix/virtual_domains
virtual_alias_maps = hash:/etc/postfix/virtual

dosyanın sonuna

  • 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

(#domain alanları uyarıları bastırır)

  • 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.