JavaMail API - Máy chủ SMTP

SMTP là từ viết tắt của Simple Mail Transfer Protocol. Nó là một tiêu chuẩn Internet để truyền thư điện tử (e-mail) qua các mạng Giao thức Internet (IP). SMTP sử dụng cổng TCP 25. Các kết nối SMTP được bảo mật bằng SSL được gọi là SMTPS viết tắt, mặc dù SMTPS không phải là một giao thức theo đúng nghĩa của nó.

JavaMail API có gói com.sun.mail.smtphoạt động như nhà cung cấp giao thức SMTP để truy cập máy chủ SMTP. Bảng sau liệt kê các lớp có trong gói này:

Lớp họcSự miêu tả
SMTPMessageLớp này là một chuyên môn của lớp MimeMessage cho phép bạn chỉ định các tùy chọn và tham số SMTP khác nhau sẽ được sử dụng khi thông báo này được gửi qua SMTP.
SMTPSSLTransportLớp này triển khai lớp trừu tượng Vận tải bằng cách sử dụng SMTP qua SSL để gửi và truyền tải thông điệp.
SMTPTransportLớp này thực hiện lớp trừu tượng Vận chuyển bằng cách sử dụng SMTP để gửi và truyền tải thông điệp.

Bảng sau liệt kê các ngoại lệ được đưa ra:

ngoại lệSự miêu tả
SMTPAddressFailedExceptionNgoại lệ này được đưa ra khi không thể gửi tin nhắn.
SMTPAddressSucceededExceptionNgoại lệ này được nối với một SendFailedException khi thuộc tính mail.smtp.reportsuccess là true.
SMTPSenderFailedExceptionNgoại lệ này được đưa ra khi không thể gửi tin nhắn.
SMTPSendFailedExceptionNgoại lệ này được đưa ra khi thư không thể được gửi. Ngoại lệ bao gồm địa chỉ của người gửi mà máy chủ thư từ chối.

Các com.sun.mail.smtpnhà cung cấp sử dụng Xác thực SMTP tùy chọn. Để sử dụng xác thực SMTP, bạn sẽ cần đặt thuộc tính mail.smtp.auth hoặc cung cấp Truyền tải SMTP với tên người dùng và mật khẩu khi kết nối với máy chủ SMTP. Bạn có thể thực hiện việc này bằng một trong các cách sau:

  • Cung cấp đối tượng Authenticator khi tạo Phiên thư của bạn và cung cấp thông tin tên người dùng và mật khẩu trong quá trình gọi lại Authenticator. Thuộc tính mail.smtp.user có thể được đặt để cung cấp tên người dùng mặc định cho lệnh gọi lại, nhưng mật khẩu vẫn cần được cung cấp rõ ràng. Cách tiếp cận này cho phép bạn sử dụng phương thức gửi Vận chuyển tĩnh để gửi tin nhắn. Ví dụ:

  • Transport.send(message);
  • Gọi phương thức kết nối truyền tải một cách rõ ràng với các đối số tên người dùng và mật khẩu. Ví dụ:

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

Nhà cung cấp giao thức SMTP hỗ trợ các thuộc tính sau, có thể được đặt trong đối tượng JavaMail Session. Các thuộc tính luôn được đặt dưới dạng chuỗi. Ví dụ:

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

Đây Type cột mô tả cách diễn giải chuỗi.

TênKiểuSự miêu tả
mail.smtp.userChuỗiTên người dùng mặc định cho SMTP.
mail.smtp.hostChuỗiMáy chủ SMTP để kết nối.
mail.smtp.portintCổng máy chủ SMTP để kết nối, nếu phương thức connect () không chỉ định rõ ràng một cổng. Mặc định là 25.
mail.smtp.connectiontimeoutintGiá trị thời gian chờ của kết nối socket tính bằng mili giây. Mặc định là thời gian chờ vô hạn.
mail.smtp.timeoutintGiá trị thời gian chờ I / O của ổ cắm tính bằng mili giây. Mặc định là thời gian chờ vô hạn.
mail.smtp.fromChuỗiĐịa chỉ email để sử dụng cho lệnh SMTP MAIL. Điều này đặt địa chỉ trả lại phong bì. Mặc định thành msg.getFrom () hoặc InternetAddress.getLocalAddress ().
mail.smtp.localhostChuỗiTên máy chủ cục bộ được sử dụng trong lệnh SMTP HELO hoặc EHLO. Mặc định là InetAddress.getLocalHost (). GetHostName (). Thông thường không cần phải đặt nếu JDK và dịch vụ tên của bạn được định cấu hình đúng cách.
mail.smtp.localaddressChuỗiĐịa chỉ cục bộ (tên máy chủ) để liên kết khi tạo ổ cắm SMTP. Mặc định là địa chỉ được chọn bởi lớp Socket. Thông thường không cần phải thiết lập.
mail.smtp.localportintSố cổng cục bộ để liên kết khi tạo ổ cắm SMTP. Mặc định là số cổng được chọn bởi lớp Socket.
mail.smtp.ehlobooleanNếu sai, đừng cố đăng nhập bằng lệnh EHLO. Giá trị mặc định là true.
mail.smtp.authbooleanNếu đúng, hãy cố gắng xác thực người dùng bằng lệnh AUTH. Giá trị mặc định là false.
mail.smtp.auth.mechanisms ChuỗiNếu được đặt, hãy liệt kê các cơ chế xác thực cần xem xét. Chỉ các cơ chế được hỗ trợ bởi máy chủ và được hỗ trợ bởi triển khai hiện tại mới được sử dụng. Mặc định là "LOGIN PLAIN DIGEST-MD5 NTLM", bao gồm tất cả các cơ chế xác thực được triển khai hiện tại hỗ trợ.
mail.smtp.auth.login.disable booleanNếu đúng, ngăn sử dụng lệnh AUTH LOGIN. Mặc định là sai.
mail.smtp.auth.plain.disablebooleanNếu đúng, ngăn sử dụng lệnh AUTH PLAIN. Mặc định là sai.
mail.smtp.auth.digest-md5.disablebooleanNếu đúng, ngăn sử dụng lệnh AUTH DIGEST-MD5. Mặc định là sai.
mail.smtp.auth.ntlm.disablebooleanNếu đúng, ngăn sử dụng lệnh AUTH NTLM. Mặc định là sai.
mail.smtp.auth.ntlm.domainChuỗiMiền xác thực NTLM.
mail.smtp.auth.ntlm.flagsintCờ dành riêng cho giao thức NTLM.
mail.smtp.submitter ChuỗiNgười gửi để sử dụng trong thẻ AUTH trong lệnh MAIL FROM. Thường được sử dụng bởi một trình chuyển tiếp thư để chuyển thông tin về người gửi thư ban đầu.
mail.smtp.dsn.notify ChuỗiTùy chọn NOTIFY cho lệnh RCPT. KHÔNG BAO GIỜ, hoặc một số kết hợp của THÀNH CÔNG, THẤT BẠI và TRÌ HOÃN (phân tách bằng dấu phẩy).
mail.smtp.dsn.retChuỗiTùy chọn RET cho lệnh MAIL. FULL hoặc HDRS.
mail.smtp.sendpartialbooleanNếu được đặt thành true và thư có một số địa chỉ hợp lệ và một số địa chỉ không hợp lệ, hãy gửi thư đó, báo cáo lỗi một phần với SendFailedException. Nếu được đặt thành false (mặc định), thư sẽ không được gửi đến bất kỳ người nhận nào nếu có địa chỉ người nhận không hợp lệ.
mail.smtp.sasl.enablebooleanNếu được đặt thành true, hãy cố gắng sử dụng gói javax.security.sasl để chọn cơ chế xác thực cho đăng nhập. Giá trị mặc định là false.
mail.smtp.sasl.mechanismsChuỗiDanh sách tên cơ chế SASL được phân tách bằng dấu cách hoặc dấu phẩy để cố gắng sử dụng.
mail.smtp.sasl.authorizationid ChuỗiID ủy quyền để sử dụng trong xác thực SASL. Nếu không được đặt, ID xác thực (tên người dùng) sẽ được sử dụng.
mail.smtp.sasl.realmChuỗiLĩnh vực sử dụng với xác thực DIGEST-MD5.
mail.smtp.quitwait booleanNếu được đặt thành false, lệnh QUIT sẽ được gửi và kết nối ngay lập tức bị đóng. Nếu được đặt thành true (mặc định), sẽ làm cho quá trình truyền tải đợi phản hồi đối với lệnh QUIT.
mail.smtp.reportsuccess booleanNếu được đặt thành true, làm cho quá trình truyền tải bao gồm một SMTPAddressSucceededException cho mỗi địa chỉ thành công.
mail.smtp.socketFactory Nhà máy ổ cắmNếu được đặt thành một lớp triển khai giao diện javax.net.SocketFactory, thì lớp này sẽ được sử dụng để tạo các ổ cắm SMTP.
mail.smtp.socketFactory.classChuỗiNếu được đặt, hãy chỉ định tên của một lớp triển khai giao diện javax.net.SocketFactory. Lớp này sẽ được sử dụng để tạo các ổ cắm SMTP.
mail.smtp.socketFactory.fallbackbooleanNếu được đặt thành true, việc không tạo được ổ cắm bằng cách sử dụng lớp nhà máy ổ cắm đã chỉ định sẽ khiến ổ cắm được tạo bằng lớp java.net.Socket. Giá trị mặc định là true.
mail.smtp.socketFactory.port intChỉ định cổng để kết nối khi sử dụng nhà máy ổ cắm được chỉ định. Nếu không được đặt, cổng mặc định sẽ được sử dụng.
mail.smtp.ssl.enablebooleanNếu được đặt thành true, hãy sử dụng SSL để kết nối và sử dụng cổng SSL theo mặc định. Mặc định là false cho giao thức "smtp" và true cho giao thức "smtps".
mail.smtp.ssl.checkserveridentitybooleanNếu được đặt thành true, hãy kiểm tra danh tính máy chủ như được chỉ định bởi RFC 2595. Giá trị mặc định là false.
mail.smtp.ssl.trust ChuỗiNếu được đặt và chưa chỉ định nhà máy sản xuất ổ cắm, hãy cho phép sử dụng MailSSLSocketFactory.
Nếu được đặt thành "*", tất cả các máy chủ đều được tin cậy.
Nếu được đặt thành danh sách các máy chủ được phân tách bằng khoảng trắng, các máy chủ đó được tin cậy.
Nếu không, sự tin cậy phụ thuộc vào chứng chỉ mà máy chủ xuất trình.
mail.smtp.ssl.socketFactory Nhà máy ổ cắm SSLNếu được đặt thành một lớp mở rộng lớp javax.net.ssl.SSLSocketFactory, lớp này sẽ được sử dụng để tạo các ổ cắm SSL SMTP.
mail.smtp.ssl.socketFactory.classChuỗiNếu được đặt, hãy chỉ định tên của lớp mở rộng lớp javax.net.ssl.SSLSocketFactory. Lớp này sẽ được sử dụng để tạo các ổ cắm SSL SMTP.
mail.smtp.ssl.socketFactory.portintChỉ định cổng để kết nối khi sử dụng nhà máy ổ cắm được chỉ định. Nếu không được đặt, cổng mặc định sẽ được sử dụng.
mail.smtp.ssl.protocols chuỗiChỉ định các giao thức SSL sẽ được bật cho các kết nối SSL. Giá trị thuộc tính là danh sách mã thông báo được phân tách bằng khoảng trắng được chấp nhận cho phương thức javax.net.ssl.SSLSocket.setEnabledProtocols.
mail.smtp.starttls.enable booleanNếu đúng, hãy cho phép sử dụng lệnh STARTTLS (nếu được máy chủ hỗ trợ) để chuyển kết nối sang kết nối được bảo vệ bởi TLS trước khi đưa ra bất kỳ lệnh đăng nhập nào. Giá trị mặc định là false.
mail.smtp.starttls.requiredbooleanNếu đúng, yêu cầu sử dụng lệnh STARTTLS. Nếu máy chủ không hỗ trợ lệnh STARTTLS hoặc lệnh không thành công, phương pháp kết nối sẽ không thành công. Giá trị mặc định là false.
mail.smtp.socks.hostchuỗiChỉ định tên máy chủ của máy chủ proxy SOCKS5 sẽ được sử dụng cho các kết nối với máy chủ thư.
mail.smtp.socks.port chuỗiChỉ định số cổng cho máy chủ proxy SOCKS5. Điều này chỉ cần được sử dụng nếu máy chủ proxy không sử dụng số cổng tiêu chuẩn là 1080.
mail.smtp.mailextensionChuỗiChuỗi mở rộng để nối vào lệnh MAIL.
mail.smtp.usersetbooleanNếu được đặt thành true, hãy sử dụng lệnh RSET thay vì lệnh NOOP trong phương thức isConnected. Trong một số trường hợp, sendmail sẽ phản hồi chậm sau nhiều lệnh NOOP; việc sử dụng RSET sẽ tránh được sự cố gửi mail này. Giá trị mặc định là false.

Nói chung, các ứng dụng không cần phải sử dụng trực tiếp các lớp trong gói này. Thay vào đó, họ nên sử dụng các API được xác định bởi gói javax.mail (và các gói con). Ví dụ, các ứng dụng không bao giờ được tạo trực tiếp các phiên bản của SMTPTransport. Thay vào đó, họ nên sử dụng phương thức Session getTransport để có được một đối tượng Truyền tải thích hợp.

Ví dụ để sử dụng máy chủ SMPT được trình bày trong chương Gửi email .