2010-06-21 45 views
13

Tôi đang sử dụng javamail để gửi thư từ ứng dụng appengine của mình. Nó hoạt động hoàn hảo trong việc triển khai, nhưng tôi không thể tìm ra cách để làm điều này bằng cách sử dụng máy chủ phát triển. Bất cứ khi nào tôi cần kiểm tra sendmail, tôi phải triển khai ứng dụng khá khó chịu.thư thử nghiệm với máy chủ phát triển appengine (java)

Thông tin cơ sở (Tại sao các bản ghi không làm việc):

Chúng tôi biết email đi đến các bản ghi trên máy chủ phát triển appengine. Tuy nhiên, lý do chính để gửi email từ máy chủ phát triển là có thể kiểm tra định dạng của email. Nó trông thế nào? Những thay đổi cần phải được thực hiện đối với mẫu email sao cho có vẻ tốt trong các ứng dụng email A, B và C và có thể thực hiện nhanh chóng mà không gặp phải rắc rối khi triển khai lên phiên bản appengine mặc định thực, mỗi lần.

Chúng tôi không gửi spam. Chúng tôi không cố gắng phá vỡ bất kỳ loại bảo mật nào. Tóm lại, chúng tôi muốn hợp pháp có thể xem email thực, thực tế trong một hoặc nhiều ứng dụng email và sau đó thực hiện thay đổi mã ngay lập tức để chúng tôi có thể chỉnh sửa chúng mà không phải trải qua quá trình chỉnh sửa, biên dịch, chờ 5 phút để nó triển khai, kiểm tra, lặp lại chu kỳ. Vì không có tiêu chuẩn nào về cách mỗi ứng dụng email hiển thị một email, quá trình siêng năng này được khuếch đại bằng cách cố gắng làm việc gì đó ở nhiều khách hàng.

Câu hỏi:

Làm thế nào các máy chủ phát triển động cơ Java Google App có thể được cấu hình để gửi email từ máy tính cục bộ hoặc một dịch vụ SMTP cho mục đích thử nghiệm các email gửi đến thực tế, khách hàng email thực tế?

Trả lời

3

Từ the docs:

Khi một ứng dụng đang chạy trong máy chủ phát triển gọi dịch vụ thư để gửi một tin nhắn email, thông điệp được in để đăng nhập. Máy chủ phát triển Java không gửi thông báo email.

Vì vậy, chỉ cần kiểm tra nhật ký khi bạn dự định gửi thư và đảm bảo rằng nhật ký hiển thị ở đó. Không có thư thực sự thực sự sẽ được gửi đi.

+1

Điều này sẽ không làm vì tôi cũng cần kiểm tra những thứ khác; cho dù tin nhắn có được định dạng đúng hay không, cho dù tệp đính kèm có thể tải xuống hay không và liệu thư có được gửi ở nơi đầu tiên hay không. – akula1001

+0

Bạn không thể thực hiện thử nghiệm tích hợp kiểu đó với máy chủ phát triển. Tôi khuyên bạn nên thiết lập trong triển khai với ví dụ như một ứng dụng riêng biệt hoặc sử dụng máy chủ thư của riêng bạn thay vì API App Engine. – hleinone

+0

@hleinone - Chỉ muốn cho bạn biết có một tiền thưởng về câu hỏi này và có vẻ như bạn có thể biết cách giải quyết vấn đề này. – jmort253

12

Từ Eclipse, chọn menu Chạy, Cấu hình gỡ lỗi ..., sau đó chọn cấu hình của ứng dụng. Chọn tab Arguments, sau đó trong “đối số VM”, hãy đặt VM tính như thế này:

-Dmail.log_mail_level=WARNING -Dmail.log_mail_body=true

+0

Điều này không thực sự gửi email mặc dù, phải không? Nó chỉ in đánh dấu nguyên bản vào nhật ký? Chính xác? – jmort253

+0

Đã lâu rồi tôi trả lời câu hỏi này và tôi thực sự không nhớ. Để kiểm tra xem thư có đang gửi đi hay không, bạn có thể kiểm tra nó bằng cách sử dụng công cụ kiểm tra-mail-server-công cụ http://www.toolheap.com/test-mail-server-tool/ nếu bạn đang làm việc trên nền tảng Windows. – zawhtut

6

Khi tôi làm việc với một thực hiện dịch vụ e-mail tôi đã sử dụng một gợi ý tuyệt vời. Vì vậy, nếu bạn sử dụng MimeMessage và muốn kiểm tra xem thư có được định dạng như mong đợi hay không, hãy kiểm tra xem tệp đính kèm có ở đó hay không, HTML cũng được định dạng đúng, hình ảnh được tham chiếu chính xác và bạn có thể xây dựng toàn bộ thư. có một số mã như sau:

MimeMessage msg = new MimeMessage(session); 
... 
if ("1".equals(System.getProperty("mail.debug"))) { 
    msg.writeTo(new FileOutputStream(new File("/tmp/sentEmail.eml"))); 
} 

Mỗi lần thực hiện MimeMessage instane sẽ được lưu vào emailSent.eml. Tệp này bạn có thể mở bằng trình đọc e-mail của mình và kiểm tra xem mọi thứ có ổn không.

Tất nhiên bạn cần thực thi ứng dụng của mình với thông số -Dmail.debug = 1.

Một ví dụ với tập tin đính kèm, tin nhắn văn bản và tin html với cách tiếp cận này có thể là như thế này:

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.Properties; 

import javax.activation.DataHandler; 
import javax.activation.FileDataSource; 
import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.Multipart; 
import javax.mail.Session; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeBodyPart; 
import javax.mail.internet.MimeMessage; 
import javax.mail.internet.MimeMultipart; 

import org.junit.Test; 

public class MimeMessageTest { 

    @Test 
    public void tesstMimeMessage() throws MessagingException, FileNotFoundException, IOException { 
     Session session = Session.getDefaultInstance(new Properties(), null); 
     MimeMessage msg = new MimeMessage(session); 
     msg.setFrom(new InternetAddress("[email protected]", "Foo Admin")); 
     msg.addRecipient(Message.RecipientType.TO, new InternetAddress("[email protected]", "Baz User")); 
     msg.setSubject("Subject from admin e-mail to baz user"); 

     // create and fill the first message part 
     MimeBodyPart mbp1 = new MimeBodyPart(); 
     mbp1.setText("test message and so on"); 
     mbp1.setContent("<h1>test message and so on in HTML</h1>", "text/html"); 

     // create the second message part 
     MimeBodyPart mbp2 = new MimeBodyPart(); 

     // attach the file to the message 
     FileDataSource fds = new FileDataSource("/tmp/fileToBeAttached"); 
     mbp2.setDataHandler(new DataHandler(fds)); 
     mbp2.setFileName(fds.getName()); 

     // create the Multipart and add its parts to it 
     Multipart mp = new MimeMultipart(); 
     mp.addBodyPart(mbp1); 
     mp.addBodyPart(mbp2); 

     // add the Multipart to the message 
     msg.setContent(mp); 

     if ("1".equals(System.getProperty("debug"))) { 
      msg.writeTo(new FileOutputStream(new File("/tmp/sentEmail.eml"))); 
     } 
    } 
} 
+0

Hi Spaeth, điều này có vẻ tuyệt vời! Ý kiến ​​hay. Một câu hỏi, bạn có thể ghi vào hệ thống tập tin từ máy chủ Phát triển GAE hay bạn đang chạy điều này bên ngoài SDK Java GAE? – jmort253

+1

Tôi đang chạy bên ngoài 'GAE'. ** NHƯNG **, nếu bạn không thể lưu nó vào một tập tin bạn có thể ví dụ: in nó ra tiêu chuẩn ra và sao chép/quá khứ vào một tập tin (như mimeMessage là một tập tin văn bản với tất cả các tập tin đính kèm Base64 mã hóa), đây có thể là một giải pháp để kiểm tra xem tệp đính kèm có ở đó, định dạng HTML, liên kết ok, hình ảnh được tham chiếu đúng cách hay không. Vì vậy, bạn cần thay đổi này: 'msg.writeTo (System.out);' thay vì 'msg.writeTo (new FileOutputStream (tệp mới ("/tmp/sentEmail.eml ")));' –

+0

Ok, tôi đã viết toàn bộ khuôn mẫu cho luồng đầu ra, nhưng không phải là một thông điệp email mà chỉ là một mẫu. Điều này thực sự không giống như nó sẽ đưa tôi lâu để thực hiện. Tôi sẽ kiểm tra điều này vào cuối tuần. Cảm ơn bạn. – jmort253

2

GAE sử dụng JavaMail, vì vậy nó không quá khó khăn để có được nó làm việc. Có hai điều bạn cần phải thay đổi.

Đầu tiên là thiết lập phiên JavaMail của bạn đúng cách cho máy chủ STMP của bạn. Để thực hiện việc này, thay vì sử dụng Session.getDefaultInstance, hãy sử dụng Session.getInstance, cung cấp ít nhất các thuộc tính mail.smtp.host. Xem JavaMail SMTP reference, hoặc chỉ tìm kiếm một JavaMail SMTP tutortial chung.

Thay đổi thứ hai là bạn cần phải dừng GAE xử lý email của mình. Nó thực hiện điều này vì dòng

rfc822=gm 

trong META-INF/javamail.address.map trong SDK SDK. Bạn có thể bao gồm bản đồ địa chỉ của riêng bạn - nhưng điều đó gây phiền nhiễu vì tôi cho rằng bạn chỉ muốn nó để gỡ lỗi - hoặc sửa đổi bản đồ địa chỉ từ mã. Điều đó cũng đơn giản như khi thực hiện

session.setProtocolForAddress("rfc822", "smtp"); 

trên phiên bạn đã tạo ở bước đầu tiên. Điều đó sẽ định tuyến tất cả các email của bạn đến trình xử lý SMTP tiêu chuẩn.

1

Bạn có thể làm như sau để thiết lập email trên máy chủ phát triển

final String username = "[email protected]";//change accordingly 
final String password = "xxxxxxx";//change accordingly 

// Assuming you are sending email through gmail 
String host = "smtp.gmail.com"; 

Properties props = new Properties(); 
props.put("mail.smtp.auth", "true"); 
props.put("mail.smtp.starttls.enable", "true"); 
props.put("mail.smtp.host", host); 
props.put("mail.smtp.port", "587"); 

// Get the Session object. 
Session session = Session.getInstance(props, 
new javax.mail.Authenticator() { 
protected PasswordAuthentication getPasswordAuthentication() { 
    return new PasswordAuthentication(username, password); 
} 
}); 
session.setProtocolForAddress("rfc822", "smtp"); 

Và sử dụng phiên thường để gửi email:

try { 
    Message msg = new MimeMessage(session); 
    msg.setFrom(new InternetAddress("[email protected]", "xxxx")); 
    msg.addRecipient(Message.RecipientType.TO, 
    new InternetAddress("[email protected],"Mr. User")); 
    msg.setSubject("Test email from GAE/J development"); 
    msg.setText("This is test:); 
    Transport.send(msg); 

} catch (Exception e) { 
    e.printStackTrace(); 
} 

Ngoài ra bạn cần phải thêm hai thư viện sau đây trong xây dựng đường dẫn và trong chiến tranh/WEB-INF/lib:

  • javax.mail.jar
  • javax.activation.jar

Bạn có thể tìm các liên kết dễ dàng bằng cách googling chúng.

Cuối cùng nếu bạn muốn sử dụng gmail như máy chủ smtp, bạn cần phải đi đến tài khoản của bạn, và cho phép truy cập cho các ứng dụng seucre ít https://www.google.com/settings/security/lesssecureapps

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