2009-11-23 31 views

Trả lời

20

Mã bên dưới thực hiện những gì bạn muốn và thực hiện theo đúng cách. Đọc lại những gì bạn cho mình đăng tải trong các bình luận

Từ: RFC2821: 4.4 Trace Information

Khi máy chủ cung cấp SMTP làm các "giao thức" của một tin nhắn, nó chèn một dòng lợi nhuận-đường tại đầu dữ liệu thư. Điều này sử dụng của đường dẫn trả về là bắt buộc; mail hệ thống PHẢI hỗ trợ nó. Đường dẫn trả về duy trì thông tin trong số từ lệnh MAIL. Tại đây, giao hàng cuối cùng có nghĩa là thư đã để lại môi trường SMTP. Thông thường, điều này có nghĩa là nó đã được gửi đến người dùng đích hoặc một thư thả xuống được liên kết, nhưng trong một số trường hợp, có thể được xử lý và truyền khác bởi hệ thống thư khác.

và một vài dòng sau.

Hệ thống SMTP có nguồn gốc thông báo KHÔNG NÊN gửi thư đã có tiêu đề Đường dẫn trả về.

Nếu bạn đọc kỹ điều này, bạn sẽ hiểu rằng chỉ đại lý máy chủ/phân phối cuối cùng mới được thêm tiêu đề Return-Path. Nó không phải là một cái gì đó bạn là khách hàng (cố gắng để gửi một mail) nên làm. Máy chủ SMTP cuối cùng sẽ căn cứ tiêu đề Return-Path trên địa chỉ người gửi của phong bì (SMTP MAIL FROM phần).

Vì vậy, thiết lập mail.smtp.from là cách chính xác để nói với java rằng địa chỉ người gửi phong bì phải khác với phần from.

Nếu bạn gặp khó khăn khi hiểu những gì khác nhau của from chỉ là hãy xem một phiên smtp telnet. Nơi [email protected] phải tương ứng với smtp.mail.from[email protected] để m.addFrom(...);

telnet smtp.example.com 25 
220 smtp.example.com ESMTP ..... 

helo computername 
250 smtp.example.com Hello computername [123.123.123.123] 

mail from:<[email protected]> 
250 <[email protected]> is syntactically correct 

rcpt to:<[email protected]> 
250 <[email protected]> verified 

data 
354 Enter message, ending with "." on a line by itself 
To: Joey <[email protected]> 
From: Joey <[email protected]> 
Subject: Joey 

Hey Joey! 

. 
250 OK id=.... 

Quit 

props.put("mail.smtp.from", "[email protected]"); 
Session session = Session.getDefaultInstance(props, null); 
MimeMessage m = new MimeMessage(session); 
m.addFrom(InternetAddress.parse("[email protected]")); 
+0

Tôi tin rằng nó sẽ là giải pháp. Nhưng từ những gì tôi đọc, máy chủ thư phải hỗ trợ nó. "Khi máy chủ SMTP phân phối thực hiện" giao hàng cuối cùng "của một tin nhắn, nó sẽ chèn một đường dẫn trả về ở đầu dữ liệu thư. Việc sử dụng đường dẫn trả về này là bắt buộc, các hệ thống thư PHẢI hỗ trợ nó. đường dẫn lưu giữ thông tin trong từ lệnh MAIL. " trong http://www.ietf.org/rfc/rfc2821.txt – Ricardo

+0

Kiểm tra câu trả lời mở rộng – jitter

+0

tôi đã cố gắng thực hiện điều này trên nhiều cấp độ khác của mã, đây là giải pháp duy nhất đã hoạt động cho tôi – kommradHomer

6

Tôi đã có kinh nghiệm cùng một vấn đề và tìm ra giải pháp duy nhất thảo luận việc đưa tài sản "mail.smtp.from" props.put (" mail.smtp.from "," [email protected] ");

Vẫn còn giải pháp này không phù hợp với tôi vì tôi đang gửi rất nhiều email từ những người dùng khác nhau, do đó, việc tạo lại phiên cho mỗi e-mail sẽ là khủng khiếp đối với tính tiên đoán.

Vì vậy, tôi tìm thấy một giải pháp khác sau khi đọc nguồn JavaMail:

1) Sử dụng SMTPMessage (mở rộng MimeMessage) thay vì MimeMessage.

2) Sử dụng phương thức setEnvelopeFrom (String).

3) Sử dụng SMTPTransport để gửi e-mail (Tôi không thử với người khác).

Dưới đây là một ví dụ mã:

SMTPMessage message = new SMTPMessage(session); 
message.setEnvelopeFrom("[email protected]"); 
... 
transport.sendMessage(message, message.getAllRecipients()); 
+0

tôi khi phương thức "mail.smtp.from" không thành công. Cảm ơn! Thú vị. – Nick

+0

không hoạt động đối với tôi – Anita

Các vấn đề liên quan