การส่งอีเมลจากโค้ด Java - วิธีที่เชื่อถือได้

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

ดังนั้นสิ่งที่ฉันทำคือรับอีเมล Apache Commons (ซึ่งอิงตาม API อีเมล "อย่างเป็นทางการ" ของ Java) และฉันกำลังส่งอีเมลด้วยวิธีที่ง่ายที่สุดที่มีอยู่ กล่าวคือ โดยไม่ต้องตรวจสอบสิทธิ์กับเซิร์ฟเวอร์ smtp ฉันแค่ค้นหา MX แบบง่ายๆ บนชื่อโฮสต์ปลายทาง รับเซิร์ฟเวอร์ MX และพยายามทิ้งข้อความของฉันไปที่ชื่อโฮสต์แรก (ไม่ว่าอีเมลจะถูกปฏิเสธหรือไม่นั้นเป็นปัญหาที่แตกต่างไปจากเดิมอย่างสิ้นเชิง และฉันอาจจะถามคำถามเพิ่มเติมเกี่ยวกับ ยุ่งวุ่นวายกับ return-path: vs. from: vs. Reply-to: และวิธีการจัดการส่วนหัวเหล่านี้ (ไม่) ใน java) กลับมาสู่ธุรกิจ... ดังนั้นฉันจึงพยายามส่งข้อความของฉันไปที่เซิร์ฟเวอร์อีเมลโดยมีคะแนนการตั้งค่าน้อยที่สุด

นี่คือตัวอย่าง: ฉันต้องการเขียนถึง [email protected] การค้นหา MX บอกฉันว่า domain.com ทราบถึงเซิร์ฟเวอร์ MX สองเครื่อง และเซิร์ฟเวอร์เหล่านี้ได้แก่ mail1.domain.com ด้วยการตั้งค่า 10 และ mail2.domain.com ด้วยการตั้งค่า 20 วิธี rfc ในการทำสิ่งต่างๆ คือการไปที่เซิร์ฟเวอร์ที่มีค่ากำหนดน้อยที่สุด และวางเมลไปที่นั่น นั่นคือสิ่งที่ฉันทำ

และสุดท้ายปัญหาของฉัน: จะเกิดอะไรขึ้นถ้าเซิร์ฟเวอร์นั้นไม่สามารถใช้งานได้ในทางใดทางหนึ่ง? มันค่อนข้างง่าย - ฉันไปที่เซิร์ฟเวอร์อื่น แต่ Apache Commons (และฉันสงสัยว่า java mail api) ไม่อนุญาตให้ฉันทำเช่นนั้น ตัวแปร mail.smtp.host ถูกรูทภายในอุปกรณ์ประกอบฉากของเซสชันในข้อความในอีเมล และฉันไม่สามารถรับมันได้

ดังนั้นวิธีที่ดีที่สุดในการจัดการปัญหานี้คืออะไร? ฉันควรสร้างอีเมลของฉันทั้งหมดจากด้านบนด้วยชื่อโฮสต์ใหม่ (mail2) หรือมีวิธีที่ชาญฉลาดในการทำให้ทั้งหมดนี้ทำงานใน java โดยไม่เจ็บปวดมากนักหรือไม่


person ingenious    schedule 09.07.2013    source แหล่งที่มา


คำตอบ (1)


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

สิ่งที่คุณควรทำคือใช้เมลเซิร์ฟเวอร์ที่มีอยู่ (หนึ่ง!) ซึ่งได้รับการกำหนดค่าไว้เพื่อให้คุณอนุญาตการส่งต่อเมลขาออก หรือถ้าคุณไม่มีสิทธิ์เข้าถึงเซิร์ฟเวอร์ดังกล่าว (ซึ่งฉันสงสัย) ให้ตั้งค่าและดำเนินการเซิร์ฟเวอร์ของคุณเอง . จากนั้น คุณกำหนดค่าเซิร์ฟเวอร์ นี้ ใน mail.smtp.host และลืมทุกสิ่งที่คุณได้เรียนรู้เกี่ยวกับการค้นหา DNS ลำดับความสำคัญของเซิร์ฟเวอร์ และความกังวลของคุณเกี่ยวกับสิ่งที่ต้องทำหากไม่มีเซิร์ฟเวอร์ MX ใดที่สามารถเข้าถึงได้

person jarnbjo    schedule 09.07.2013
comment
ใช่ ฉันเคยพิจารณาใช้ aspirin หรือ james หรือแม้แต่เซิร์ฟเวอร์ SMTP ภายนอกที่ทำงานได้อย่างสมบูรณ์ (แต่ในกรณีหลังนี้ ลูกค้าแต่ละรายจะต้องตั้งค่าเซิร์ฟเวอร์ smtp ของตัวเอง และนั่นเป็นวิธีที่ต้องขอจากลูกค้าเหล่านี้มากจริงๆ วัน :) ) แต่ดูเหมือนว่าจะต้องใช้ความพยายามมากเกินไปในการแก้ปัญหาง่ายๆ เช่นนี้ หรือบางทีแค่ความคิดของฉันเรื่องความเรียบง่ายและเกินกำลังก็เบ้ :) - person ingenious; 09.07.2013
comment
ฉันไม่รู้ว่าซอฟต์แวร์ของคุณควรจะทำงานที่ไหนหรือไคลเอนต์ประเภทไหนที่คุณกำลังพูดถึง แต่ถ้าซอฟต์แวร์ของคุณจำเป็นต้องส่งอีเมลขาออก IMHO ก็ไม่ต้องการเซิร์ฟเวอร์ SMTP ที่ทำงานอยู่มากเกินไป บริษัทต่างๆ มีเซิร์ฟเวอร์ SMTP ทำงานอยู่แล้ว และผู้ใช้ตามบ้านรายใดไม่สามารถเข้าถึงเซิร์ฟเวอร์ SMTP จากผู้ให้บริการอินเทอร์เน็ตหรือผู้ให้บริการอีเมล เช่น GMail หรือ Hotmail - person jarnbjo; 09.07.2013
comment
ฉันยอมรับ ใช้เซิร์ฟเวอร์อีเมลที่มีอยู่ หากคุณยังคงต้องการดำเนินการนี้ด้วยตนเอง คุณอาจจำเป็นต้องใช้ JavaMail API โดยตรง เพื่อให้คุณสามารถใช้วิธี Transport.connect เพื่อเชื่อมต่อโดยตรงกับเซิร์ฟเวอร์ใดก็ได้ที่คุณต้องการ - person Bill Shannon; 09.07.2013
comment
ฉันเห็นด้วยกับคุณทั้งสองอย่างสุดใจ แต่ถึงกระนั้นฉันก็มีข้อกำหนดของตัวเองและไปแบบนั้นไม่ได้ (เชื่อฉันเถอะ ฉันได้ลองโต้แย้งแล้วว่าควรใช้เซิร์ฟเวอร์ SMTP ที่มีอยู่แล้ว) ฉันยังต้องการทำสิ่งที่ถูกต้อง (ish) @BillShannon Apache Commons Mail จัดการทั้ง com.sun.mail.smtp.SMTPTransport และ javax.mail.Transport ได้ค่อนข้างดี โปรดทราบว่าการทำสิ่งที่ฉันต้องการนั้นเป็นไปไม่ได้ แต่มันดูน่าเกลียดสำหรับฉันนิดหน่อย (รอข้อยกเว้น หากตรวจพบว่ามีใครถูกจับได้ ให้สร้างข้อความใหม่และลองทิ้งไว้ที่โฮสต์ MX ถัดไป ฯลฯ) - person ingenious; 11.07.2013
comment
ฉันไม่แน่ใจว่าฉันเห็นวิธีอื่น คุณกำลังใช้งานเซิร์ฟเวอร์การส่ง SMTP ครึ่งหนึ่งในแอปพลิเคชันของคุณอย่างมีประสิทธิภาพ - person Bill Shannon; 12.07.2013