2010-06-21 27 views
13

के साथ परीक्षण मेल मैं अपने एपेंगेन एप्लिकेशन से मेल भेजने के लिए जावमेल का उपयोग कर रहा हूं। यह तैनाती में पूरी तरह से काम करता है, लेकिन मैं यह समझ नहीं सकता कि विकास सर्वर का उपयोग करके इसे कैसे किया जाए। जब भी मुझे sendmail का परीक्षण करने की आवश्यकता होती है, मुझे उस एप्लिकेशन को तैनात करना पड़ता है जो काफी परेशान है।एपेंगिन विकास सर्वर (जावा)

पृष्ठभूमि जानकारी (क्यों लॉग काम नहीं करते):

हम ईमेल ऐप्लिकेशन इंजन विकास सर्वर पर लॉग करने के लिए जाना पता है। हालांकि, विकास सर्वर से ईमेल भेजने के लिए प्राथमिक कारण ईमेल के प्रारूप का परीक्षण करने में सक्षम होना है। यह कैसा दिखता है? ईमेल टेम्पलेट में परिवर्तन करने की आवश्यकता है, इसलिए यह ईमेल क्लाइंट ए, बी, और सी में अच्छा दिखता है, और इसे हर बार एक वास्तविक, डिफ़ॉल्ट ऐपेंगेन संस्करण पर तैनाती की परेशानी के बिना जल्दी से किया जा सकता है।

हम स्पैमर नहीं हैं। हम किसी भी प्रकार की सुरक्षा को रोकने की कोशिश नहीं कर रहे हैं। संक्षेप में, हम वैध रूप से एक या अधिक ईमेल क्लाइंट में वास्तविक, वास्तविक ईमेल को देखने में सक्षम होना चाहते हैं और फिर तुरंत कोड परिवर्तन कर सकते हैं ताकि हम संपादन की दर्दनाक प्रक्रिया के बिना उन्हें ट्विक कर सकें, संकलित करें, 5 मिनट प्रतीक्षा करें इसके लिए तैनाती, परीक्षण, चक्र दोहराएं। चूंकि प्रत्येक ईमेल क्लाइंट ईमेल को कैसे प्रस्तुत करता है, इसमें कोई मानक नहीं है, इसलिए इस दर्दनाक प्रक्रिया को कई ग्राहकों में कुछ काम करने की कोशिश करके बढ़ाया जाता है।

प्रश्न:

कैसे जावा गूगल एप इंजन विकास सर्वर स्थानीय कंप्यूटर या ईमेल के परीक्षण के उद्देश्य से एक SMTP सेवा असली, वास्तविक ईमेल ग्राहकों को भेजा से ईमेल भेजने के लिए विन्यस्त किया जा सकता?

उत्तर

3
the docs से

:

जब विकास सर्वर में चल रहे एक आवेदन मेल सेवा एक ई-मेल संदेश भेजने के लिए कहता है, संदेश लॉग में छपा है। जावा डेवलपमेंट सर्वर ईमेल संदेश नहीं भेजता है।

तो जब आप मेल भेजने का इरादा रखते हैं तो बस लॉग जांचें, और सुनिश्चित करें कि यह वहां दिखाई देता है। वास्तव में कोई वास्तविक मेल नहीं भेजा जाएगा।

+1

यह ऐसा नहीं करेगा क्योंकि मुझे अन्य चीजों को भी जांचना होगा; क्या संदेश सही स्वरूपित है, चाहे अनुलग्नक डाउनलोड किए जा सकें और क्या मेल पहले स्थान पर पहुंचा जा रहा है या नहीं। – akula1001

+0

आप विकास सर्वर के साथ उस तरह के एकीकरण परीक्षण नहीं कर सकते हैं। मेरा सुझाव है कि आप या तो तैनाती में सेट करें उदाहरण के लिए एक अलग ऐप या ऐप इंजन एपीआई के बजाय अपने मेल सर्वर का उपयोग करें। – hleinone

+0

@ हेलिनोन - बस आपको यह बताना चाहता था कि इस प्रश्न पर एक बक्षीस है, और ऐसा लगता है कि आप इसे हल करने के बारे में जान सकते हैं। – jmort253

12

ग्रहण से, रन मेनू, डीबग कॉन्फ़िगरेशन ... का चयन करें, और फिर अपने ऐप के कॉन्फ़िगरेशन का चयन करें। तर्क टैब, फिर "वीएम तर्क" अनुभाग में, सेट वीएम गुण इस तरह में:

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

+0

यह वास्तव में ईमेल नहीं भेजता है, है ना? यह सिर्फ लॉग पर कच्चे मार्कअप प्रिंट करता है? सही बात? – jmort253

+0

यह लंबे समय से मैंने इस प्रश्न का उत्तर दिया है और मुझे वास्तव में याद नहीं है। यह जांचने के लिए कि क्या मेल भेज रहा है या नहीं, आप टेस्ट-मेल-सर्वर-टूल का उपयोग करके इसका परीक्षण कर सकते हैं http://www.toolheap.com/test-mail-server-tool/ यदि आप विंडोज प्लेटफार्म पर काम कर रहे हैं। – zawhtut

6

जब मैं एक ई-मेल सेवा कार्यान्वयन मैं एक शांत संकेत इस्तेमाल किया साथ काम किया। तो यदि आप MimeMessage का भी उपयोग करते हैं, और केवल यह जांचना चाहते हैं कि संदेश अपेक्षित रूप से प्रारूपित है या नहीं, यह जांचना कि क्या अनुलग्नक हैं, HTML अच्छी तरह से स्वरूपित है, छवियों का सही संदर्भ है और इसी तरह, आप संपूर्ण संदेश बना सकते हैं, और डीबग के दौरान आप

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

हर बार यह क्रियान्वित किया जाता है MimeMessage instane emailSent.eml में सहेज लिया जाएगा: इस तरह की कुछ कोड है। यह फ़ाइल आप अपने ई-मेल रीडर के साथ खोल सकते हैं और जांच सकते हैं कि सबकुछ ठीक है या नहीं।

बेशक आपको -Dmail.debug = 1 पैरामीटर के साथ अपने आवेदन को निष्पादित करने की आवश्यकता है।

संलग्न फाइल, पाठ संदेश और इस दृष्टिकोण के साथ एचटीएमएल संदेश के साथ एक उदाहरण इस तरह हो सकता है:

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

हाय स्पाएथ, यह बहुत अच्छा लग रहा है! अछा सुझाव। एक प्रश्न, क्या आप जीएई विकास सर्वर से फाइल सिस्टम को लिख सकते हैं, या आप इसे जीएई जावा एसडीके के बाहर चला रहे हैं? – jmort253

+1

मैं 'GAE' के बाहर दौड़ रहा हूं। ** लेकिन **, यदि आप इसे किसी फ़ाइल में सहेज नहीं सकते हैं तो आप उदाहरण के लिए: मानक आउटपुट पर प्रिंट कर सकते हैं और फ़ाइल में प्रतिलिपि बना सकते हैं (जैसे mimeMessage सभी संलग्नक बेस 64 एन्कोडेड के साथ एक टेक्स्ट फ़ाइल है), यह एक समाधान हो सकता है यह जांचने के लिए कि क्या संलग्नक हैं, एचटीएमएल स्वरूपित, लिंक ठीक है, छवियों का सही संदर्भ है और इसी तरह। इसलिए आपको इस परिवर्तन की आवश्यकता है: 'msg.writeTo (System.out);' '। Msgstr" नया फ़ाइलऑटपुटस्ट्रीम (नई फ़ाइल ("/ tmp/sentEmail.eml")); ' –

+0

ठीक है, मैं पहले से ही लिख रहा हूं आउटपुट स्ट्रीम में पूरा टेम्पलेट, लेकिन एक ईमेल संदेश के रूप में नहीं बल्कि एक टेम्पलेट के रूप में। यह वास्तव में ऐसा नहीं लगता है कि इसे लागू करने में मुझे लंबा लगेगा। मैं इस सप्ताहांत का परीक्षण करूंगा। धन्यवाद। – jmort253

2

GAE JavaMail का उपयोग करता है, तो यह यह काम कर पाने के लिए भी मुश्किल नहीं है। दो चीजें हैं जिन्हें आपको बदलने की आवश्यकता होगी।

सबसे पहले अपने एसटीएमपी सर्वर के लिए अपना जावामेल सत्र स्थापित करना है। ऐसा करने के लिए, Session.getDefaultInstance का उपयोग करने के बजाय, Session.getInstance का उपयोग करें, कम से कम mail.smtp.host गुण प्रदान करें। JavaMail SMTP reference देखें, या सिर्फ एक सामान्य जावामेल एसएमटीपी ट्यूटोरियल देखें।

दूसरा परिवर्तन यह है कि आपको अपने ईमेल को संभालने वाले जीएई को रोकने की आवश्यकता है। यह एसडीके जार में लाइन

rfc822=gm 

META-INF/javamail.address.map में की वजह से ऐसा करता है। आप या तो अपना पता नक्शा शामिल कर सकते हैं - लेकिन यह कष्टप्रद है क्योंकि मुझे लगता है कि आप इसे केवल डिबगिंग के लिए चाहते हैं - या कोड से पता मानचित्र को संशोधित करें।

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

आपके द्वारा पहले चरण में बनाए गए सत्र पर जितना आसान है। इससे आपके सभी ईमेल मानक एसएमटीपी हैंडलर को रूट करना चाहिए।

1

आप विकास सर्वर

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"); 

पर ईमेल स्थापित करने के लिए निम्न कार्य करें और ईमेल भेजने के लिए सामान्य रूप से सत्र का उपयोग कर सकते हैं:

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(); 
} 

इसके अतिरिक्त आप में निम्न दो पुस्तकालयों जोड़ने की जरूरत युद्ध के तहत/पथ और वेब-INF/lib का निर्माण:

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

आप उन्हें गुगल करके आसानी से लिंक पा सकते हैं।

अंत में आप smtp सर्वर के रूप में जीमेल का उपयोग करना चाहते हैं, तो आप अपने खाते में जाएं, और कम seucre क्षुधा https://www.google.com/settings/security/lesssecureapps

संबंधित मुद्दे