ปิดใช้งานการจัดส่งในท้องถิ่นใน Sendmail


31

ฉันใช้ Sendmail บนเซิร์ฟเวอร์ Centos เพื่อส่งอีเมลสำหรับสคริปต์ PHP แต่ปัญหาคือมีการส่งอีเมลไปยังกล่องจดหมายท้องถิ่นบนเครื่องมากกว่าที่ระบุไว้ในระเบียน MX สำหรับโดเมนซึ่งจริง ๆ แล้วชี้ไปที่เครื่องอื่นฉัน ใช้สำหรับอีเมล

ฉันต้องการให้ sendmail ไม่ลองและส่งจดหมายไปยังโดเมนที่เครื่องติดตั้งไว้หรือไม่มีวิธีง่าย ๆ ในการปิดใช้งานการส่งในเครื่องใช่หรือไม่

โดเมนไม่ได้อยู่ในไฟล์ชื่อโฮสต์ท้องถิ่น

ฉันได้ทำ Google ไปแล้วหลายครั้งและฉันได้ดู:

การกำหนดค่า Sendmail เพื่อไม่ส่งจดหมายไปยังเครื่องท้องถิ่น

ปิดใช้งานการจัดส่งในท้องถิ่นใน Sendmail

แต่อาจไม่มีคำตอบหรือไม่เหมาะสม

ฉันไม่ต้องการถ่ายทอดไปยังเซิร์ฟเวอร์อื่นฉันแค่อยากให้ส่งอีเมลโดยไม่คำนึงถึงโดเมน

เพื่อให้ตัวอย่าง:

ฉันมีเซิร์ฟเวอร์สองเครื่องหนึ่งคือเซิร์ฟเวอร์อีเมลที่ mail.example.com และเว็บเซิร์ฟเวอร์ซึ่งเป็น example.com เมื่อฉันใช้บริการ smtp บนเว็บเซิร์ฟเวอร์ปัจจุบันจะกำหนดเส้นทางอีเมลไปยังกล่องจดหมายท้องถิ่นใน example.com แต่ ควรจะไปที่กล่องจดหมายใน mail.example.com

เอาต์พุตของ sendmail -bt ส่งคืน:

โหมดการทดสอบที่อยู่ (ชุดกฎ 3 ไม่เรียกใช้โดยอัตโนมัติ)
เข้าสู่  
> 3,0 info@example.com
canonify อินพุต: info @ example ดอทคอม
อินพุต Canonify2: ข้อมูล 
Canonify2 ส่งคืน: ข้อมูล 
canonify return: info 
การแยกวิเคราะห์ข้อมูล 
อินพุต Parse0: ข้อมูล 
Parse0 ส่งคืน: ข้อมูล 
อินพุต ParseLocal: ข้อมูล 
ParseLocal ส่งคืน: ข้อมูล 
อินพุต Parse1: ข้อมูล 
Parse1 ส่งคืน: $ # local $: info
การแยกวิเคราะห์ส่งคืน: $ # local $: info

stalkr.net/forum/… ดูเหมือนว่าจะเป็นสิ่งที่ใกล้เคียงกับสิ่งที่ฉันตามมาจริง ๆ โดยเฉพาะการตั้งค่า MAIL_HUB ที่กล่าวถึง แต่ดูเหมือนจะใช้งานไม่ได้จริง

ลองทำสิ่งต่อไปนี้: sendmail -bt จากนั้นพิมพ์ 3,0 user@domin.com มันจะให้กฎการเขียนใหม่จำนวนมากกฎสุดท้ายควรให้รีเลย์ที่คุณใช้ โปรดระบุผลลัพธ์
Francois Wolmarans

สวัสดี Francois ฉันได้แก้ไขคำถามของฉันให้รวมเอาท์พุท

คำตอบ:


37

สิ่งที่ฉันทำเพื่อปิดใช้งานการจัดส่งในท้องถิ่น ฉันจะใช้โดเมน example.com

ที่ต้องการ:

  • example.com รายการที่ชี้ไปยังที่อยู่ IP ที่กำหนดให้หนึ่งในอินเทอร์เฟซ eth
  • / etc / hosts กำหนด example.com ที่กำหนดให้กับที่อยู่ IP เดียวกันกับด้านบน
  • example.com ระเบียน MX ที่ชี้ไปยังเซิร์ฟเวอร์ของ Google (ASPMX.L.GOOGLE.COM ฯลฯ )
  • การติดตั้ง sendmail เริ่มต้น (ของฉันอยู่บน Ubuntu)

ขั้นตอน:

vim /etc/mail/sendmail.mc

ในตอนท้าย:

define(`MAIL_HUB', `example.com.')dnl
define(`LOCAL_RELAY', `example.com.')dnl

แล้ว:

sendmailconfig (or /etc/mail/make depending on your distro)
service sendmail restart

ในการทดสอบ:

echo -e "To: user@example.com\nSubject: Test\nTest\n" | sendmail -bm -t -v
echo -e "To: user\nSubject: Test\nTest\n" | sendmail -bm -t -v

คุณควรเห็นมันกำลังเชื่อมต่อกับเซิร์ฟเวอร์ google จากนั้นคุณควรเห็นอีเมลของคุณถูกส่งไปยังกล่องจดหมายเข้าของ Google


3
มันใช้งานได้สมบูรณ์แบบฉันแค่สงสัยว่ามี หลังชื่อโดเมน
Rodrigo

ทำงานไม่มีที่ติเช่นกัน!
Filipe Pina

ขอบคุณ! ฉันพยายามแก้ไขปัญหานี้มาระยะหนึ่งแล้ว ฉันทำต่อไปนี้; ล้างและติดตั้ง sendmail ใหม่รันsendmailconfigเพิ่มบรรทัดที่คุณระบุรันsendmailconfigอีกครั้งและทำservice sendmail restartและใช้งานได้!
เลียมนิวมาร์ค

@Rodrigo example.com ด้วยจุดต่อท้ายเป็น FQDN ตามมาตรฐาน example.com ที่ไม่มีจุดนั้นสัมพันธ์กันดังนั้นจึงไม่แม่นยำตัวอย่างเช่นอาจหมายถึง example.com.yourdomain.org ขึ้นอยู่กับการตั้งค่าระบบปฏิบัติการของคุณ นี่คือความแตกต่างเหมือนกับระหว่าง/etc/passwdและetc/passwd
kubanczyk

4

ขอบคุณ sporker และ Pawel คุณทำให้ฉันไปในทิศทางที่ถูกต้องเพื่อแก้ไขปัญหานี้

ปัญหาเดิมของฉันคือ sendmail กำลังพิจารณาโดเมนของฉัน example.com บัญชีอีเมลเป็นบัญชีท้องถิ่น

ลิงก์เหล่านี้มีประโยชน์มาก: Sendmail ไปยังโดเมนท้องถิ่นโดยไม่สนใจระเบียน MX (ตอนที่ 2) http://lists.freebsd.org/pipermail/freebsd-questions/2004-September/057382.html http://objectmix.com/sendmail/ 367920-sendmail-ละเว้น-mailertable บาง-semilocal-domains.html

แต่ในกรณีของฉันเมื่อใช้ FreeBSD 8.2 สิ่งที่หลอกลวงจริง ๆ คือ:

# cd /etc/mail

# vim freebsd.mc

เพิ่มสองบรรทัดเหล่านี้:

define(`MAIL_HUB', `example.com.')dnl
define(`LOCAL_RELAY', `example.com.')dnl

ก่อนหน้านี้:

MAILER(local)
MAILER(smtp)

# make

--- นี่คือผลลัพธ์ ---

 cp freebsd.mc host.example.com.mc
 /usr/bin/m4 -D_CF_DIR_=/usr/share/sendmail/cf/   /usr/share/sendmail/cf/m4/cf.m4 host.example.com.mc > host.example.com.cf
 cp freebsd.submit.mc host.example.com.submit.mc
 /usr/bin/m4 -D_CF_DIR_=/usr/share/sendmail/cf/   /usr/share/sendmail/cf/m4/cf.m4 host.example.com.submit.mc > host.example.com.submit.cf

--- สิ้นสุดการส่งออก ---

# cp sendmail.cf sendmail.cf.bak

# cp host.example.com.cf sendmail.cf

# /etc/rc.d/sendmail restart

หวังว่านี่จะช่วยลดอาการปวดหัวกับใครบางคน


1

ฉันไม่ใช่คน sendmail แต่ฉันเชื่อว่า sendmail จะดูแลโดเมนใด ๆ ที่เก็บไว้ใน/etc/mail/local-host-namesชื่อโดเมนท้องถิ่น
คุณสามารถลองล้างไฟล์นี้ (อย่าลบมัน) และรีสตาร์ท sendmail และดูว่าคุณไปอย่างไร

แก้ไข
ชื่อไฟล์ที่ผมกล่าวถึงการตั้งค่าจริงsendmail.cfและคุณอาจไม่ได้รับการตั้งค่าให้local-host-names
มองใน/etc/mail/sendmail.cfสำหรับ

# file containing names of hosts for which we receive email 
Fw/etc/mail/local-host-names    

นี่ไม่ใช่ข้อเท็จจริงที่ทดสอบ แต่เพียงฉันคิดออกมาดัง ๆ


อ๋อครับเหตุผลที่ผมกล่าวถึงโดเมนไม่ได้อยู่ในท้องถิ่นโฮสต์ชื่อไฟล์

ขออภัยที่จะสอนให้ฉันตอบคำถามที่ฉันอ่านไม่ถูกต้อง
aussielunix

พบปัญหานี้กับชุดเซิร์ฟเวอร์ Solaris 10 ที่เพิ่งได้รับการแพตช์ (100 ชิ้นหรือมากกว่านั้นได้รับการแก้ไข แต่มีเพียงไม่กี่คนเท่านั้นที่ประสบปัญหา) นี่คือการแก้ไข! ขอบคุณ!
สัญญาณ

0

นี่อาจไม่ใช่วิธีการแก้ปัญหาที่คุณกำลังมองหา แต่ถ้าปัญหาของคุณคือผู้ใช้ "admin" หรือ "root" ได้รับอีเมลจำนวนมากและกล่องจดหมายขนาดใหญ่คุณอาจต้องการพิจารณาตั้งค่างาน cron เพื่อล้างกล่องจดหมาย ออกทุกสัปดาห์วัน ฯลฯ

เรามีเซิร์ฟเวอร์ CentOS หลายแห่งที่มีปัญหานี้ แต่สิ่งที่น่าจับตาคือเราต้องการที่จะสามารถอ่านจดหมายได้ในบางครั้งเนื่องจากสามารถช่วยวินิจฉัยปัญหาต่าง ๆ ได้ในบางครั้ง

การแก้ปัญหาคือการ cron เพียงงานและเช็ดกล่องเป็นครั้งคราว

หากเราพบปัญหา ... เราต้องการคอมเม้นท์ cron (ชั่วคราว) และอ่านบันทึกและอีเมลเพื่อหาเบาะแส

แค่คิด ... และเป็นวิธีแก้ปัญหาที่ง่ายและรวดเร็วสำหรับยา

ถ้าไม่ใช่ให้ดูที่ไฟล์ sendmail.mc และแก้ไขตามนั้น


การอัปเดตด่วน:

นี่ไม่ใช่สิ่งที่คุณต้องการ แต่อาจให้ความคิดและช่วยให้คุณเข้าใจสิ่งต่าง ๆ :

http://www.pettingers.org/code/sendmail-local.html


ขออภัยที่ไม่ได้ช่วย สิ่งที่ฉันต้องทำก็คือไม่มีจดหมายส่งในเครื่องทำไม sendmail ถึงทำยากขนาดนี้

0

ฉันเป็นบุคคลที่โพสต์ข้อความส่วนตัว แต่ดูเหมือนว่าคุณกำหนดค่าเซิร์ฟเวอร์การส่งเพื่อรับอีเมลสำหรับ @ yourdomain.com หากมี sendmail เทียบเท่ากับกลไกการขนส่งใน postfix นั่นคือสิ่งที่ฉันใช้เพื่อกำหนดเส้นทางของอีเมลภายในเซิร์ฟเวอร์ของฉัน


ฉันไม่ได้กำหนดค่ามากนักเนื่องจากเป็นค่าเริ่มต้นสำหรับการติดตั้ง sendmail ของ centos

0

ดูเหมือนว่า Ruleset 3 ของคุณจะตัดข้อมูลโดเมนออก ฉันได้รวมขั้นตอนการแก้ไขปัญหาทั่วไปไว้ด้านล่างแล้ว หากวิธีนี้ใช้ไม่ได้คุณจะต้องส่ง sendmail.cf ของคุณมาให้ฉันดู

จากผลลัพธ์ example.com จะถือว่าเป็นโดเมนท้องถิ่น ทำ nslookup:

ตั้งค่า q = mx

domain.com

หากสิ่งนี้ให้ที่อยู่ IP ของเครื่องท้องถิ่นคุณต้องดู DNS ของคุณ ดูใน / etc / hosts เพื่อให้แน่ใจว่า domain.com ไม่อยู่ในรายการ

ดูเหมือนว่าจะตัดทอน @ domain.com โปรดลองใช้บางอย่างเช่น user@stackoverflow.com เพื่อดูว่ามันแสดงว่าเป็นโดเมนท้องถิ่นหรือไม่

ตรวจสอบค่า Cw ในไฟล์ sendmail.cf ของคุณด้วย


ขอบคุณ Francois ฉันเริ่มเข้าใจ sendmail internals ดีขึ้นเล็กน้อย ฉันตัดสินใจที่จะเปลี่ยนชื่อโฮสต์ของเครื่องเพื่อแก้ไขสิ่งต่าง ๆ ในตอนนี้ดังนั้นตอนนี้จึงเป็น www.example.com แทน example.com ซึ่งหมายความว่าจะทำการจัดส่งในท้องถิ่นสำหรับ user@www.example.com แต่ ไม่ใช่ user@example.com - ซึ่งเป็นข้อตกลงที่ใช้ได้สำหรับฉันในขั้นตอนนี้

0

อาจไม่ใช่สิ่งที่คุณต้องการ แต่ SSMTP นั้นดีมากสำหรับเซิร์ฟเวอร์ขาออกเท่านั้นซึ่งคุณสามารถระบุเมลฮับได้


ขอบคุณฉันจะให้ SSMTP ดูยังคงพยายาม sendmail sendup แม้ว่าตอนนี้

0

หากคุณต้องการส่งคืนข้อผิดพลาดเมื่อพยายามส่งไปยังที่อยู่ในพื้นที่คุณสามารถใช้แผนที่การเข้าถึงและสิ่งต่อไปนี้:

@your.domain error:nouser 550 No such user here

หากคุณต้องการให้ข้อความอีเมล 'ถูกส่ง' แต่ถูกโยนทิ้งไปคุณสามารถติดตั้งรายการที่น่าเชื่อถือซึ่งเป็นชื่อแทนทุกอย่างเพื่อให้ " @your.domain" เป็น dev-null มันอาจมีประโยชน์ในการส่งอย่างน้อยrootในพื้นที่เพราะมันมักจะเป็นผู้รับรายงานอีเมลจากงาน cron ฯลฯ ลองทำสิ่งนี้ในของคุณvirtusertable:

root@your.domain local:root

@your.domain local:dev-null

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


0

การแก้ไขโดย Pawel ใช้งานได้สำหรับฉัน แต่ sendmailconfig ไม่มีอยู่บน centos ดังนั้นฉันจึงต้องเรียกใช้

cd /etc/mail    
m4 /usr/share/sendmail-cf/m4/cf.m4 sendmail.mc > sendmail.cf
service sendmail restart

เพื่อรับการกำหนดค่าอัปเดต


กฎข้อที่สองนั้นใช้งานไม่ได้ / มีอยู่ใน CentOS ของฉัน
solsol

0

เพียงยืนยันว่าคำตอบของ Pawel แก้ปัญหาที่คล้ายกันของฉัน

สำหรับผู้ที่ใช้ FreeBSD แต่ไม่สนใจที่จะเกี่ยวข้องกับไฟล์ sendmail cf drudgery มากเกินไปลำดับต่อไปนี้คือสิ่งที่คุณจะใช้เพื่อเพิ่มสองบรรทัดในตัวอย่างของ Pawel:

cd /etc/mail
make conf (generates stock .mc/.cf files with the hostname as part of the 
filename - these will NOT be overriten during an upgrade)
vi hostname.mc
(add the two lines to the .mc file right above the last two "MAILER" lines)
make conf
cp hostname.cf sendmail.cf
/etc/rc.d/sendmail restart

0

ฉันทำตามคำแนะนำเหล่านี้และสังเกตว่าเพิ่งเพิ่มขั้นตอนที่ pawel พูดถึง

"/ etc / hosts กำหนด example.com ที่กำหนดให้กับที่อยู่ IP เดียวกันกับข้างบน" โดยทั่วไปฉันเพิ่ม IP เซิร์ฟเวอร์ของฉันตามด้วยชื่อเซิร์ฟเวอร์ไปยัง/etc/hostsไฟล์และนั่นก็คือ

ก็เพียงพอแล้วสำหรับฉันที่จะได้รับอีเมลส่งผ่าน Google และกลับไปที่อีเมลของฉัน


0

หากคุณใช้ Cpanel / WHM เพื่อจัดการเซิร์ฟเวอร์ของคุณตรวจสอบให้แน่ใจว่าคุณได้เลือก Remote Mail Exchanger ใน Cpanel / WHM แทนการตรวจจับการกำหนดค่าอัตโนมัติ Remote Mail Exchanger จะส่งอีเมลทั้งหมดผ่านระเบียน MX รวมถึงโดเมนท้องถิ่น ด้วย Automatic อีเมลภายในโดเมนจะถูกกำหนดเส้นทางภายในเครื่องโดยตรงและจะไม่ถูกส่งไปยังเซิร์ฟเวอร์ภายนอกที่กำหนดไว้ในเรคคอร์ด MX

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