วิธีกำหนดค่า postfix ให้ไพพ์อีเมลขาเข้าทั้งหมดไปยังสคริปต์ได้อย่างไร


24

ใช้ postfix ฉันต้องการให้จดหมายขาเข้าทั้งหมดไปยังที่อยู่ใด ๆ (รวมถึงที่ไม่ได้แมปกับผู้ใช้ในพื้นที่) ที่จะถูกไพพ์ไปยังสคริปต์ ฉันได้ลองกำหนดค่าmailbox_commandใน/etc/postfix/main.cf:

mailbox_command = /path/to/myscript.py

วิธีนี้ใช้งานได้ดีหากผู้ใช้เป็นผู้ใช้ภายใน แต่ล้มเหลวสำหรับผู้ใช้ที่ "ไม่รู้จัก" ที่ไม่มีนามแฝง ฉันพยายามตั้งค่าluser_relayให้กับผู้ใช้ท้องถิ่น แต่ pre-empts mailbox_commandนี้และดังนั้นคำสั่งจะไม่ถูกเรียกใช้ ฉันลองตั้งค่าlocal_recipient_maps=(สตริงว่าง) แต่ข้อความนั้นยังคงเด้ง

มีการเรียกใช้เวทมนต์ที่ฉันสามารถใช้เพื่อให้ผู้ใช้ที่รู้จักและไม่รู้จักทั้งหมดไปที่สคริปต์ด้วยหรือไม่

เต็มรูปแบบ/etc/postfix/main.cfดังต่อไปนี้ - เป็น Ubuntu เริ่มต้น 10.04 ยกเว้นmailbox_commandบรรทัด:

# 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

หลังจากสคริปต์แล้วจะเป็นอย่างไร ดูเหมือนว่าสิ่งที่สแกนไวรัสและตัวกรองสแปมทำคุณอาจพบคำแนะนำในการกำหนดค่าหนึ่งในนั้นและใช้การกำหนดค่าสำหรับสคริปต์ของคุณหรือไม่
DerfK

ข้อความไปที่เว็บแอปพลิเคชัน ดังนั้นหลังจากสคริปต์: ฐานข้อมูลการประมวลผลอื่น ๆ สิ่งอื่น ๆ แต่ไม่ใช่จดหมายธรรมดา คำถามสำคัญคือการทำให้ผู้ใช้ที่ไม่รู้จักไม่กระเด้ง - นี่เป็นสถานการณ์ปกติของไวรัส / สแปมซึ่งคุณจะเด้งผู้ใช้ที่ไม่ได้แมป
user67641

@ user67641 สวัสดีฉันต้องการฉีดเมลลงใน postfix ในสคริปต์ของฉันหรือโดยการเพิ่มบรรทัดเพิ่มเติมใน master.cf
merveotesi

คำตอบ:


32

ตกลงฉันเพิ่งได้รับการทำงานนี้ - แม้ว่าจะมีผมมากกว่าที่ฉันคิดว่ามันจะเป็น ฉันลดลงส่วนหนึ่งไปกับmaildir_command transport_mapsกุญแจสำคัญคือการทำ 5 สิ่ง:

  1. ตั้งค่าไฟล์ db เพื่อจัดการนามแฝง (และเพิ่มชื่อแทน catch-all)
  2. ตั้งค่าไฟล์ db เพื่อแมป 'การขนส่ง' สำหรับโดเมนที่ต้องสงสัยกับตัวจัดการพิเศษ
  3. รวบรวมไฟล์ db ในรูปแบบ berkeley db ที่ postfix ต้องการ
  4. ตั้งค่าตัวจัดการใน/etc/postfix/master.cfเพื่อส่งเมลไปยังสคริปต์
  5. ตั้งค่า/etc/postfix/main.cfการใช้ฐานข้อมูลสำหรับการขนส่งและฐานข้อมูลนามแฝงสำหรับtransport_mapsvirtual_alias-maps

(1) สร้าง/etc/postfix/virtual_aliasesเพื่อเพิ่มนามแฝง catch - all - localuserต้องเป็นผู้ใช้ท้องถิ่นที่มีอยู่:

@mydomain.tld   localuser@mydomain.tld

(2) สร้าง/etc/postfix/transportเพื่อเพิ่มการแมปการขนส่ง "mytransportname" สามารถเป็นอะไรก็ได้ที่คุณต้องการ; มันใช้ด้านล่างในmaster.cf:

mydomain.tld    mytransportname:

(3) ถัดไปทั้งคู่transportและvirtual_aliasesจะต้องรวบรวมเป็นไฟล์ berkeley db

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

(4) เพิ่มการขนส่งไปที่/etc/postfix/master.cf:

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

(5) ใน/etc/postfix/main.cf:

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

และ ... ดีไป! Sheesh


1
คำตอบที่เป็นประโยชน์อย่างมาก
merveotesi

1
ไม่จำเป็นต้องใช้แผนที่นามแฝงเสมือน คุณสามารถทำสิ่งเดียวกันให้สำเร็จด้วยrelay_domains(ในกรณีนี้ไฟล์การขนส่งสามารถกรองตามที่อยู่ To: ที่แท้จริง)
Brilliand

ผมพบว่าคุณสามารถกำหนดเส้นทางอีเมลเสมือนทั้งหมดสคริปต์ที่มีvirtual_transport = mailcaptcha:ในmain.cfและในmailcaptcha unix - n n - - pipe flags=FR user=vmail argv=/usr/bin/perl /usr/local/mail-captcha/verify.pl ${sender} ${recipient} master.cfดูpostfix.org/transport.5.htmlและpostfix.org/VIRTUAL_README.html
Chloe

(4) ควรอยู่ในหนึ่งบรรทัดใช่ไหม? นอกจากนี้ยังไม่ได้จำเป็นต้องมีpostfix restartหรือreloadหรือบางสิ่งบางอย่างเช่นนี้หรือไม่ สิ่งสุดท้าย: มีล็อกไฟล์เพื่อดูเมลที่มาถึง postfix หรือไม่
Basj

@Basj /var/log/mail.logแฟ้มบันทึกเป็น
fiedl

4

ครั้งเดียวที่ฉันใช้บางอย่างเช่นนี้มีไว้สำหรับกล่องจดหมายของผู้ใช้ที่ระบุ สิ่งที่จำเป็นต้องมีคือนามแฝงชื่อผู้ใช้ไปยังไพพ์และกระบวนการในนามแฝง:

พงษ์: "| /usr/local/bin/gotit.pl"

ปริมาณการใช้งานที่ส่งนี้ถูกกำหนดไว้สำหรับ "pong@mymailserver.com" ไปยังสคริปต์ perl ที่ฉันเขียนเพื่อดำเนินการ

gotit.pl (ตัวอย่างอย่าเลือกฉันสำหรับการเขียนโปรแกรมเส็งเคร็ง skillz =) มันเป็นหน้าที่ของการประมวลผลอีเมลที่ฉันส่งไปยังเซิร์ฟเวอร์ Exchange ของเรา (ซึ่งเป็นคำตอบอัตโนมัติผ่านรหัส VB ​​บางส่วน) เพื่อตรวจสอบว่า Exchange กำลังประมวลผลอีเมลในเวลาที่เหมาะสม ถ้าไม่เช่นนั้นเมลเซิร์ฟเวอร์จะส่งอีเมลแจ้งเตือนไปยังวิทยุติดตามตัวของเราและเขียนไฟล์ล็อคเพื่อให้เราไม่ได้รับจดหมายขยะอย่างต่อเนื่อง

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

ใช่และเพียงแค่เปลี่ยนเส้นทาง @ mydomain.tld ไปที่ pong และหลักที่เข้ามาทั้งหมดสำหรับ mydomain.tld จะถูกส่งไปยัง
Zaar Hai

และสำหรับพวกเราที่ใช้โดเมนเสมือนหลายรายการอย่าลืมเปลี่ยนเส้นทางไปที่ pong @ localhost เพื่อไม่ให้แนบชื่อโดเมนเริ่มต้นไปยังนามแฝง
therightstuff

0

ฉันใช้ไฟล์ flat "แบบเก่า" Mailboxเพื่อรับจดหมายทั้งหมด (แล้วตัดทุกสองสามชั่วโมงถ้ามันใหญ่) แทนที่จะใช้maildir/โฟลเดอร์ที่ทันสมัยเพื่อประมวลผลจดหมายผ่านสคริปต์ คุณสามารถเรียกใช้ logrotate บนไฟล์ได้เช่นกันฉันคิดว่ามันจะจัดการได้

วิธีนี้คุณสามารถคัดลอกจดหมายทั้งหมดไปยังกล่องจดหมายในฐานะผู้ใช้ท้องถิ่น


0

หลังจากที่มีอาการปวดหัวมากผมใส่กันแก้ปัญหานี้ขึ้นอยู่กับคู่ของแหล่งที่มาที่แตกต่างกันซึ่งส่งผลให้ในความพยายามที่น้อยมากขั้นตอนที่สำคัญได้รับการกำหนดค่าvirtual_alias_domainsเช่นเดียวกับvirtual_alias_mapsและให้แน่ใจว่าการทำแผนที่เสมือนคือการแทนเพียงmy-alias@localhost my-aliasในตัวอย่างของฉันนามแฝงคำสั่งคือไพพ์อีเมลไปยังปลายทาง API ของเว็บไซต์

นี่คือขั้นตอนที่คุณจะต้องดำเนินการ:

  • ตั้งค่าระเบียน A และ MX สำหรับโดเมนของคุณ A ระเบียน @ ชี้ไปที่ IP ของเซิร์ฟเวอร์ที่คุณจะรับอีเมลและ MX ด้วยชื่อโฮสต์ @ และค่า 10 mail.your-domain-name
  • sudo apt-get install postfix
  • เลือก "ไซต์อินเทอร์เน็ต" และป้อนชื่อโดเมนของคุณ (มีคุณสมบัติครบถ้วน)
  • sudo vi /etc/postfix/main.cf
  • เพิ่ม mail.your-domain-name ไปยังรายการmydestinationค่า
  • ผนวก
virtual_alias_domains = hash:/etc/postfix/virtual_domains
virtual_alias_maps = hash:/etc/postfix/virtual

ไปที่ท้ายไฟล์

  • 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 ไม่แสดงคำเตือน)

  • 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.