ฉันจะตั้งค่า postfix เพื่อเก็บอีเมลในไฟล์แทนที่จะส่งต่อได้อย่างไร


9

ฉันต้องการเรียกใช้การแสดงละครของเซิร์ฟเวอร์ที่ใช้งานจริงในสภาพแวดล้อมท้องถิ่น ระบบรันแอปพลิเคชั่น PHP ซึ่งจะส่งอีเมลไปยังลูกค้าในสถานการณ์ต่าง ๆ และฉันต้องการแน่ใจว่าไม่มีอีเมลใดถูกส่งมาจากสภาพแวดล้อมการจัดเตรียม

ฉันสามารถปรับแต่งรหัสเพื่อให้ใช้ผู้ส่งอีเมลปลอมได้ แต่ฉันต้องการเรียกใช้รหัสเดียวกันกับสภาพแวดล้อมการใช้งานจริง ฉันสามารถใช้ MTA อื่น (Postfix เป็นสิ่งที่เราใช้ในการผลิต) แต่ฉันต้องการสิ่งที่ติดตั้งง่ายภายใต้ Debian / Ubuntu :)

ดังนั้นฉันต้องการตั้งค่าการติดตั้ง Postfix ในเครื่องเพื่อจัดเก็บอีเมลทั้งหมดในไฟล์ (อย่างน้อยหนึ่งไฟล์) แทนที่จะส่งต่อ ที่จริงแล้วฉันไม่สนใจว่ามันจะถูกเก็บไว้อย่างไรตราบใดที่เป็นไปได้ที่จะตรวจสอบอีเมลที่ส่งไป แม้แต่ตัวเลือกการตั้งค่าที่บอกให้ postfix เก็บอีเมลในคิวอีเมลจะทำงาน (ฉันสามารถกำจัดคิวเมื่อฉันโหลดเซิร์ฟเวอร์ staging ด้วยสำเนาจากการผลิต)

ฉันรู้ว่าสิ่งนี้เป็นไปได้ฉันไม่ได้พบโซลูชันออนไลน์ที่ดีสำหรับสิ่งที่ดูเหมือนว่าเป็นความต้องการทั่วไป

ขอบคุณ!

คำตอบ:


12

ฉันสร้างการส่งข้อมูลใหม่ด้วยคำสั่งไพพ์ที่เขียนอีเมลลงไปยังไฟล์

โดยทั่วไป:

  1. สร้างผู้ใช้ที่จะเป็นเจ้าของอีเมล (หรือใช้ที่มีอยู่) ฉันเรียกว่าฉันemail
  2. mkdir /home/email/bin
  3. วางสคริปต์ต่อไปนี้ใน/home/email/bin/mail_eater(ใช้ PHP แต่คุณสามารถเขียนเวอร์ชันของคุณเองในภาษาที่คุณชอบมันแค่ต่อท้าย stdin กับไฟล์):

    #!/usr/bin/php
    <?php
    $fd = fopen("php://stdin", "r");
    $email = "";
    while (!feof($fd)) {
        $email .= fread($fd, 1024);
    }
    fclose($fd);
    $fh = fopen('/home/email/email.txt','a');
    fwrite($fh, $email."\n-------------------------------------------------------\n\n");
    fclose($fh);
    
  4. chmod a+x /home/email/bin/mail_eater
  5. touch /home/email/email.txt
  6. chmod a+r /home/email/email.txt
  7. สร้างการขนส่งใหม่โดยใช้ไฟล์นี้โดยต่อท้ายบรรทัดต่อไปนี้ในmaster.cf:

    file_route unix -    n    n    -    -    pipe user=email  argv=/home/email/bin/mail_eater
    
  8. ใช้สิ่งนี้เป็นการขนส่งเริ่มต้นในmain.cf:

    default_transport = file_route
    

มี :)


3

คุณสามารถใส่โดเมนเหล่านั้นลง$mydestinationในmain.cfได้ดังนั้น postfix จะแสดงผลแบบโลคัล

คุณสามารถตั้งค่าผู้ใช้ในท้องถิ่นที่แตกต่างกันหากคุณต้องการหรือคุณสามารถตั้งค่าที่อยู่ที่รับอีเมลแบบโลคัลเพื่อส่งอีเมลไปยังบัญชีเดียวรายละเอียดเพิ่มเติมที่นี่: http://www.postfix.org/ADDRESS_REWRITING_README.html#luser_relay

สำหรับโดเมนทั้งหมด:

mydestination = pcre:/etc/postfix/mydestinations

และ/etc/postfix/mydestinationsควรมี

/.*/    ACCEPT

ฉันไม่สามารถทดสอบได้ในขณะนี้ แต่ควรใช้งานได้


ฉันไม่ทราบว่าโดเมนปลายทางมีลักษณะอย่างไร (มาจากฐานข้อมูลลูกค้าจริง) ฉันจะตรวจสอบลิงก์ว่า
GomoX

ขอบคุณสำหรับการอัปเดตฉันโพสต์วิธีแก้ไขปัญหาของฉันเองเพราะดูเหมือนว่า "สะอาดกว่า" แต่คุณก็ดูเหมือนว่ามันจะทำงานได้ดีเช่นกัน
GomoX

เพื่อให้ทำงานได้ตามที่ตั้งใจไว้สิ่งนี้ต้องมีการตั้งค่าlocal_recipient_maps = ด้วย มันอธิบายไว้ในลิงค์ที่คุณให้ แต่ฉันคิดว่ามันควรจะกล่าวถึงในคำตอบ
jojman

2

ลอง (ใน main.cf):

defer_transports = smtp

จากนั้นคุณสามารถดูคิวpostqueue -pและดูเนื้อหาด้วยpostcat


0

คุณสามารถดู "nullmailer" ได้ทั้งนี้ขึ้นอยู่กับการกระจายของคุณ นี่เป็นรีเลย์ MTA ซึ่งรีเลย์ไปยัง SMTP อื่นบนเครือข่ายหรือระยะไกลของคุณ นี่อาจเป็น SMTP ที่ไม่ถูกต้องและในกรณีนี้มันอาจจะใส่ลงในคิวบนโฟลเดอร์ในเครื่องเท่านั้น

บนเดเบียนและอูบุนตูมีให้ใช้แทน MTA สำหรับระบบของคุณ


0

สิ่งนี้ถูกคัดลอกและแก้ไขเล็กน้อยจากบล็อกของฉันhttp://blog.malowa.de/2011/04/postfix-as-spam-trap-server.html :

คุณไม่จำเป็นต้องกำหนดค่า Postfix เพื่อทำหน้าที่เป็น nullmailer Postfix มาพร้อมกับเครื่องมือที่เรียกว่าsmtp-sinkกลลวง smtp-sink มีวัตถุประสงค์หลักเพื่อทำหน้าที่เป็นเครื่องมือทดสอบสำหรับไคลเอนต์ SMTP ซึ่งต้องใช้เซิร์ฟเวอร์เพื่อเล่น ดังนั้นคุณสามารถกำหนดค่าให้บันทึกการสนทนาทั้งหมดหรือแม้แต่ถ่ายโอนแต่ละเมลที่ได้รับไปยังไฟล์ หลังจำเป็นสำหรับ nullmailer

ไม่มีไฟล์การกำหนดค่าเพื่อกำหนดค่า smtp-sink ทุกอย่างทำได้ผ่านตัวเลือกบรรทัดคำสั่ง

smtp-sink -c -d "%Y%m%d%H/%M." -f . -u postfix -R /tmp/ -B "550 5.3.0 The recipient does not like your mail. Don't try again." -h spamtrap.example.com 25 1024

ลองมาดูอย่างใกล้ชิดกับแต่ละพารามิเตอร์

-u postfix
Runs the program under the user "postfix"
-R /tmp/
Sets the output directory to /tmp/. In this directory the mails will be stored. If you have a high spam volume (hundreds of Spam per minute) it is recommended to write the mails to a ramdisk
-d "%Y%m%d%H/%M."
Writes the mail to a directory of the format "YearMonthDayHour" and in this directory the files are name "Month.RandomID". Note that the dates are in UTC
-c
Write statistics about connection counts and message counts to stdout while running
-f .
Reject the mail after END-OF-DATA. But the mail will be saved. Cool, isn't it?!
-B "550 5.3.0 The recipient does not like your mail. Don't try again"
This is the rejection message after END-OF-DATA.
-h spamtrap.example.com
Announce the hostname spamtrap.example.com
25
The port to listen on. Can be prepended with an IP or host if you want to bind on a special interface.
1024
The backlog count of connections that can wait in the TCP/IP stack before they get a free slot for sending mail.

คุณสามารถค้นหาข้อมูลเพิ่มเติมได้ในหน้า man ของ smtp-sink แต่สิ่งเหล่านี้เป็นสิ่งสำคัญในการเรียกใช้ spamtrap ที่ดักจับทั้งหมด ในการกำหนดค่านี้โปรแกรมจะรับจดหมายที่มีขนาดใดก็ได้จากผู้ส่งไปยังผู้รับที่มี IPv4 และ IPv6 ข้อ จำกัด เพียงอย่างเดียวคือมีการเชื่อมต่อ 256 พร้อมกันที่เป็นไปได้ด้วยการเชื่อมต่อที่อยู่ในคิว 1024 รายการและโปรแกรมถูกตั้งค่าสถานะการทดลอง ดังนั้นห้ามใช้ smtp-sink ในสภาพแวดล้อมการใช้งานจริง

ตัวเลือก -B ใช้ได้กับ Postfix เวอร์ชันที่ใหม่กว่าเท่านั้น ใน 2.7.1 มันหายไป ใน 2.8.2 เป็นปัจจุบัน ที่ไหนสักแห่งในระหว่างมันถูกนำมาใช้

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