JavaMail API - เซิร์ฟเวอร์ SMTP

SMTP เป็นคำย่อของ Simple Mail Transfer Protocol. เป็นมาตรฐานอินเทอร์เน็ตสำหรับการส่งจดหมายอิเล็กทรอนิกส์ (อีเมล) ผ่านเครือข่าย Internet Protocol (IP) SMTP ใช้พอร์ต TCP 25 การเชื่อมต่อ SMTP ที่ปลอดภัยโดย SSL เป็นที่รู้จักโดย SMTPS ชวเลขแม้ว่า SMTPS จะไม่ใช่โปรโตคอลในสิทธิ์ของตนเอง

JavaMail API มีแพ็คเกจ com.sun.mail.smtpซึ่งทำหน้าที่เป็นผู้ให้บริการโปรโตคอล SMTP เพื่อเข้าถึงเซิร์ฟเวอร์ SMTP ตารางต่อไปนี้แสดงรายการคลาสที่รวมอยู่ในแพ็คเกจนี้:

คลาส คำอธิบาย
SMTPMessage คลาสนี้เป็นความเชี่ยวชาญเฉพาะของคลาส MimeMessage ที่ช่วยให้คุณระบุอ็อพชันและพารามิเตอร์ SMTP ต่างๆที่จะใช้เมื่อข้อความนี้ถูกส่งผ่าน SMTP
SMTPSSL การขนส่ง คลาสนี้ใช้คลาสนามธรรมการขนส่งโดยใช้ SMTP ผ่าน SSL สำหรับการส่งข้อความและการขนส่ง
SMTP การขนส่ง คลาสนี้ใช้คลาสนามธรรมการขนส่งโดยใช้ SMTP สำหรับการส่งข้อความและการขนส่ง

ตารางต่อไปนี้แสดงรายการข้อยกเว้นที่เกิดขึ้น:

ข้อยกเว้น คำอธิบาย
SMTPAddressFailedException ข้อยกเว้นนี้จะเกิดขึ้นเมื่อไม่สามารถส่งข้อความได้
SMTPAddressSucceededException ข้อยกเว้นนี้ถูกผูกมัดกับ SendFailedException เมื่อคุณสมบัติmail.smtp.reportsuccessเป็นจริง
SMTPSenderFailedException ข้อยกเว้นนี้จะเกิดขึ้นเมื่อไม่สามารถส่งข้อความได้
SMTPSendFailedException ข้อยกเว้นนี้จะเกิดขึ้นเมื่อไม่สามารถส่งข้อความได้ข้อยกเว้นรวมถึงที่อยู่ของผู้ส่งซึ่งเซิร์ฟเวอร์อีเมลปฏิเสธ

com.sun.mail.smtpผู้ให้บริการใช้การตรวจสอบสิทธิ์ SMTP เป็นทางเลือก ในการใช้การตรวจสอบสิทธิ์ SMTP คุณจะต้องตั้งค่าคุณสมบัติmail.smtp.authหรือระบุชื่อผู้ใช้และรหัสผ่านสำหรับการขนส่ง SMTP เมื่อเชื่อมต่อกับเซิร์ฟเวอร์ SMTP คุณสามารถทำได้โดยใช้หนึ่งในวิธีต่อไปนี้:

  • ระบุอ็อบเจ็กต์ Authenticator เมื่อสร้างเซสชันเมลของคุณและระบุข้อมูลชื่อผู้ใช้และรหัสผ่านระหว่างการโทรกลับของ Authenticator คุณสมบัติmail.smtp.userสามารถตั้งค่าเพื่อระบุชื่อผู้ใช้เริ่มต้นสำหรับการโทรกลับ แต่ยังคงต้องระบุรหัสผ่านอย่างชัดเจน วิธีนี้ช่วยให้คุณใช้วิธีการส่งแบบคงที่ในการส่งข้อความ ตัวอย่างเช่น:

  • Transport.send(message);
  • เรียกเมธอด Transport connect อย่างชัดเจนด้วยอาร์กิวเมนต์ชื่อผู้ใช้และรหัสผ่าน ตัวอย่างเช่น:

    Transport tr = session.getTransport("smtp");
    tr.connect(smtphost, username, password);
    msg.saveChanges();
    tr.sendMessage(msg, msg.getAllRecipients());
    tr.close();

ผู้ให้บริการโปรโตคอล SMTP สนับสนุนคุณสมบัติต่อไปนี้ซึ่งอาจถูกตั้งค่าในวัตถุ JavaMail Session คุณสมบัติจะถูกตั้งค่าเป็นสตริงเสมอ ตัวอย่างเช่น:

props.put("mail.smtp.port", "587");

ที่นี่ Type คอลัมน์อธิบายวิธีการตีความสตริง

ชื่อ ประเภท คำอธิบาย
mail.smtp.user สตริง ชื่อผู้ใช้เริ่มต้นสำหรับ SMTP
mail.smtp.host สตริง เซิร์ฟเวอร์ SMTP ที่จะเชื่อมต่อ
mail.smtp.port int พอร์ตเซิร์ฟเวอร์ SMTP ที่จะเชื่อมต่อหากเมธอด connect () ไม่ได้ระบุอย่างชัดเจน ค่าเริ่มต้นคือ 25
mail.smtp.connectiontimeout int ค่าหมดเวลาของการเชื่อมต่อซ็อกเก็ตเป็นมิลลิวินาที ค่าเริ่มต้นคือการหมดเวลาไม่สิ้นสุด
mail.smtp.timeout int ค่าการหมดเวลาของ Socket I / O หน่วยเป็นมิลลิวินาที ค่าเริ่มต้นคือการหมดเวลาไม่สิ้นสุด
mail.smtp.from สตริง ที่อยู่อีเมลที่จะใช้สำหรับคำสั่ง SMTP MAIL นี่เป็นการตั้งค่าที่อยู่สำหรับส่งคืนซองจดหมาย ค่าดีฟอลต์คือ msg.getFrom () หรือ InternetAddress.getLocalAddress ()
mail.smtp.localhost สตริง ชื่อโลคัลโฮสต์ที่ใช้ในคำสั่ง SMTP HELO หรือ EHLO ค่าเริ่มต้นเป็น InetAddress.getLocalHost (). getHostName () โดยปกติไม่จำเป็นต้องตั้งค่าหาก JDK และบริการชื่อของคุณได้รับการกำหนดค่าอย่างเหมาะสม
mail.smtp.localaddress สตริง ที่อยู่ภายในเครื่อง (ชื่อโฮสต์) เพื่อเชื่อมโยงเมื่อสร้างซ็อกเก็ต SMTP ค่าดีฟอลต์คือแอดเดรสที่เลือกโดยคลาส Socket โดยปกติไม่ควรต้องตั้งค่า
mail.smtp.localport int หมายเลขพอร์ตภายในที่จะเชื่อมโยงเมื่อสร้างซ็อกเก็ต SMTP ค่าดีฟอลต์คือหมายเลขพอร์ตที่เลือกโดยคลาส Socket
mail.smtp.ehlo บูลีน หากเป็นเท็จอย่าพยายามลงชื่อเข้าใช้ด้วยคำสั่ง EHLO ค่าเริ่มต้นเป็นจริง
mail.smtp.auth บูลีน หากเป็นจริงให้พยายามพิสูจน์ตัวตนผู้ใช้โดยใช้คำสั่ง AUTH ค่าเริ่มต้นเป็นเท็จ
mail.smtp.auth.mechanisms สตริง หากตั้งค่าไว้รายการกลไกการตรวจสอบสิทธิ์ที่ต้องพิจารณา ระบบจะใช้เฉพาะกลไกที่เซิร์ฟเวอร์รองรับและสนับสนุนโดยการนำไปใช้งานในปัจจุบัน ค่าเริ่มต้นคือ "LOGIN PLAIN DIGEST-MD5 NTLM" ซึ่งรวมถึงกลไกการตรวจสอบสิทธิ์ทั้งหมดที่สนับสนุนโดยการใช้งานปัจจุบัน
mail.smtp.auth.login.disable บูลีน หากเป็นจริงให้ป้องกันการใช้คำสั่ง AUTH LOGIN ค่าเริ่มต้นเป็นเท็จ
mail.smtp.auth.plain.disable บูลีน หากเป็นจริงให้ป้องกันการใช้คำสั่ง AUTH PLAIN ค่าเริ่มต้นเป็นเท็จ
mail.smtp.auth.digest-md5.disable บูลีน ถ้าเป็นจริงให้ป้องกันการใช้คำสั่ง AUTH DIGEST-MD5 ค่าเริ่มต้นเป็นเท็จ
mail.smtp.auth.ntlm.disable บูลีน ถ้าเป็นจริงให้ป้องกันการใช้คำสั่ง AUTH NTLM ค่าเริ่มต้นเป็นเท็จ
mail.smtp.auth.ntlm.domain สตริง โดเมนรับรองความถูกต้อง NTLM
mail.smtp.auth.ntlm.flags int แฟล็กเฉพาะโปรโตคอล NTLM
mail.smtp.submitter สตริง ผู้ส่งที่จะใช้ในแท็ก AUTH ในคำสั่ง MAIL FROM โดยทั่วไปจะใช้โดยรีเลย์อีเมลเพื่อส่งต่อข้อมูลเกี่ยวกับผู้ส่งต้นฉบับของข้อความ
mail.smtp.dsn.notify สตริง อ็อพชัน NOTIFY สำหรับคำสั่ง RCPT ไม่เคยหรือบางอย่างผสมระหว่างความสำเร็จความล้มเหลวและความล่าช้า (คั่นด้วยเครื่องหมายจุลภาค)
mail.smtp.dsn.ret สตริง ตัวเลือก RET สำหรับคำสั่ง MAIL ทั้ง FULL หรือ HDRS
mail.smtp.sendpartial บูลีน หากตั้งค่าเป็นจริงและข้อความมีที่อยู่ที่ถูกต้องและบางส่วนที่ไม่ถูกต้องให้ส่งข้อความต่อไปโดยรายงานความล้มเหลวบางส่วนด้วย SendFailedException หากตั้งค่าเป็นเท็จ (ค่าเริ่มต้น) ข้อความจะไม่ถูกส่งไปยังผู้รับหากมีที่อยู่ผู้รับไม่ถูกต้อง
mail.smtp.sasl.enable บูลีน หากตั้งค่าเป็น true ให้พยายามใช้แพ็กเกจ javax.security.sasl เพื่อเลือกกลไกการพิสูจน์ตัวตนสำหรับล็อกอิน ค่าเริ่มต้นเป็นเท็จ
mail.smtp.sasl.mechanisms สตริง รายการที่คั่นด้วยช่องว่างหรือจุลภาคของชื่อกลไก SASL ที่จะพยายามใช้
mail.smtp.sasl.authorizationid สตริง ID การอนุญาตที่จะใช้ในการพิสูจน์ตัวตน SASL หากไม่ได้ตั้งค่า ID การพิสูจน์ตัวตน (ชื่อผู้ใช้) จะถูกใช้
mail.smtp.sasl.realm สตริง ขอบเขตที่จะใช้กับการพิสูจน์ตัวตน DIGEST-MD5
mail.smtp.quitwait บูลีน หากตั้งค่าเป็นเท็จคำสั่ง QUIT จะถูกส่งและการเชื่อมต่อจะถูกปิดทันที หากตั้งค่าเป็น true (ค่าเริ่มต้น) ทำให้การขนส่งรอการตอบสนองต่อคำสั่ง QUIT
mail.smtp.reportsuccess บูลีน หากตั้งค่าเป็นจริงทำให้การขนส่งรวม SMTPAddressSucceededException สำหรับแต่ละแอดเดรสที่สำเร็จ
mail.smtp.socketFactory โรงงานซ็อกเก็ต หากตั้งค่าเป็นคลาสที่ใช้อินเทอร์เฟซ javax.net.SocketFactory คลาสนี้จะถูกใช้เพื่อสร้างซ็อกเก็ต SMTP
mail.smtp.socketFactory.class สตริง หากตั้งค่าให้ระบุชื่อของคลาสที่ใช้อินเตอร์เฟส javax.net.SocketFactory คลาสนี้จะใช้ในการสร้างซ็อกเก็ต SMTP
mail.smtp.socketFactory.fallback บูลีน หากตั้งค่าเป็น true ความล้มเหลวในการสร้างซ็อกเก็ตโดยใช้คลาสโรงงานของซ็อกเก็ตที่ระบุจะทำให้ซ็อกเก็ตถูกสร้างขึ้นโดยใช้คลาส java.net.Socket ค่าเริ่มต้นเป็นจริง
mail.smtp.socketFactory.port int ระบุพอร์ตที่จะเชื่อมต่อเมื่อใช้โรงงานซ็อกเก็ตที่ระบุ หากไม่ได้ตั้งค่าพอร์ตเริ่มต้นจะถูกใช้
mail.smtp.ssl.enable บูลีน หากตั้งค่าเป็นจริงให้ใช้ SSL เพื่อเชื่อมต่อและใช้พอร์ต SSL ตามค่าเริ่มต้น ค่าเริ่มต้นเป็นเท็จสำหรับโปรโตคอล "smtp" และเป็นจริงสำหรับโปรโตคอล "smtps"
mail.smtp.ssl.checkserveridentity บูลีน หากตั้งค่าเป็น true ให้ตรวจสอบข้อมูลประจำตัวเซิร์ฟเวอร์ตามที่ระบุโดย RFC 2595 ค่าดีฟอลต์คือ false
mail.smtp.ssl.trust สตริง หากตั้งค่าไว้และไม่ได้ระบุโรงงานซ็อกเก็ตให้เปิดใช้งาน MailSSLSocketFactory
หากตั้งค่าเป็น "*" โฮสต์ทั้งหมดจะเชื่อถือได้
หากตั้งค่าเป็นรายการโฮสต์ที่คั่นด้วยช่องว่างโฮสต์เหล่านั้นจะเชื่อถือได้
มิฉะนั้นความน่าเชื่อถือจะขึ้นอยู่กับใบรับรองที่เซิร์ฟเวอร์นำเสนอ
mail.smtp.ssl.socketFactory โรงงานซ็อกเก็ต SSL หากตั้งค่าเป็นคลาสที่ขยายคลาส javax.net.ssl.SSLSocketFactory คลาสนี้จะถูกใช้เพื่อสร้างซ็อกเก็ต SMTP SSL
mail.smtp.ssl.socketFactory.class สตริง หากตั้งค่าให้ระบุชื่อของคลาสที่ขยายคลาส javax.net.ssl.SSLSocketFactory คลาสนี้จะถูกใช้เพื่อสร้างซ็อกเก็ต SMTP SSL
mail.smtp.ssl.socketFactory.port int ระบุพอร์ตที่จะเชื่อมต่อเมื่อใช้โรงงานซ็อกเก็ตที่ระบุ หากไม่ได้ตั้งค่าพอร์ตเริ่มต้นจะถูกใช้
mail.smtp.ssl.protocols สตริง ระบุโปรโตคอล SSL ที่จะเปิดใช้งานสำหรับการเชื่อมต่อ SSL ค่าคุณสมบัติเป็นรายการโทเค็นที่คั่นด้วยช่องว่างซึ่งยอมรับได้สำหรับเมธอด javax.net.ssl.SSLSocket.setEnabledProtocols
mail.smtp.starttls.enable บูลีน หากเป็นจริงให้เปิดใช้งานคำสั่ง STARTTLS (หากเซิร์ฟเวอร์รองรับ) เพื่อสลับการเชื่อมต่อเป็นการเชื่อมต่อที่มีการป้องกัน TLS ก่อนที่จะออกคำสั่งล็อกอินใด ๆ ค่าเริ่มต้นเป็นเท็จ
mail.smtp.starttls.required บูลีน หากเป็นจริงต้องใช้คำสั่ง STARTTLS หากเซิร์ฟเวอร์ไม่รองรับคำสั่ง STARTTLS หรือคำสั่งล้มเหลววิธีการเชื่อมต่อจะล้มเหลว ค่าเริ่มต้นเป็นเท็จ
mail.smtp.socks.host สตริง ระบุชื่อโฮสต์ของพร็อกซีเซิร์ฟเวอร์ SOCKS5 ที่จะใช้สำหรับการเชื่อมต่อกับเมลเซิร์ฟเวอร์
mail.smtp.socks.port สตริง ระบุหมายเลขพอร์ตสำหรับพร็อกซีเซิร์ฟเวอร์ SOCKS5 สิ่งนี้ควรใช้เฉพาะในกรณีที่พร็อกซีเซิร์ฟเวอร์ไม่ได้ใช้หมายเลขพอร์ตมาตรฐาน 1080
mail.smtp.mailextension สตริง สตริงส่วนขยายที่จะต่อท้ายคำสั่ง MAIL
mail.smtp.userset บูลีน หากตั้งค่าเป็นจริงให้ใช้คำสั่ง RSET แทนคำสั่ง NOOP ในเมธอด isConnected ในบางกรณี sendmail จะตอบสนองช้าหลังจากคำสั่ง NOOP หลาย ๆ การใช้ RSET ช่วยหลีกเลี่ยงปัญหาการส่งอีเมลนี้ ค่าเริ่มต้นเป็นเท็จ

โดยทั่วไปแอปพลิเคชันไม่ควรใช้คลาสในแพ็คเกจนี้โดยตรง ควรใช้ API ที่กำหนดโดยแพ็คเกจ javax.mail (และแพ็กเกจย่อย) แทน ตัวอย่างเช่นแอปพลิเคชันไม่ควรสร้างอินสแตนซ์ของ SMTPTransport โดยตรง แต่ควรใช้เมธอดเซสชัน getTransport เพื่อรับอ็อบเจ็กต์ Transport ที่เหมาะสม

ตัวอย่างการใช้งานเซิร์ฟเวอร์ SMPT จะแสดงให้เห็นในบทที่ส่งอีเมล์