2010-01-24 12 views
5

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

मैं पहले से ही PropertyPlaceholderConfigurer उपयोग कर रहा हूँ और के आधार पर अगर मैं उत्पादन, परीक्षण, या देव मोड में चल रहा हूँ विभिन्न संपत्ति फाइलों में पढ़ रहा हूँ। मैं प्रॉपर्टी फ़ाइल में मानों के आधार पर JavaMailSenderImpl को कॉन्फ़िगर करता हूं। मैं प्रेषक पते के साथ एक टेम्पलेट बनाने के लिए एक SimpleMailMessage का भी उपयोग कर रहा हूं।

आदर्श रूप में वहाँ अगर मैं देव या परीक्षण मोड में चल रहा हूँ एक परीक्षण खाते में सभी बाहर जाने वाले ईमेल के पते के लिए करने के लिए फिर से लिखने के लिए एक रास्ता होगा।

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

हो सकता है कि सबसे अच्छा समाधान है, लेकिन ऐसा लगता है जैसे वहाँ ईमेल रोकना और प्राप्तकर्ता को बदलने के तरीके होना चाहिए।

क्या किसी ने इससे पहले इस समस्या का सामना किया है? आप किस समाधान के साथ आए थे?

+0

आप अपने परीक्षण कैसे निष्पादित कर रहे हैं? – Bozho

+0

बोझो - फिलहाल, मेरे पास कोई यूनिट परीक्षण नहीं है जिसमें ईमेल शामिल है। जब कोई नया खाता बनाया जाता है तो सिस्टम केवल ईमेल भेजता है। लेकिन अब मुझे कई अलग-अलग कार्रवाइयों पर नोटिस भेजने के लिए इसे विस्तारित करने की आवश्यकता है। और मैं नहीं चाहता कि सदस्यों को ये ईमेल प्राप्त हों जब परीक्षक परीक्षण सर्वर का उपयोग कर रहे हों या देव स्थानीय स्तर पर चल रहे हों। – Tauren

+0

मेरा उत्तर http: // stackoverflow देखें।कॉम/प्रश्न/85 99791/ए-सरल-स्थानीय-एसएमटीपी-सर्वर/22043597 # 22043597 –

उत्तर

1

मुझे लगता है कि आप एक विशिष्ट आवश्यकता है कि आप किसी भी कोड बदलने के लिए नहीं करना चाहते हैं राज्य में देखते हैं। मैं अभी भी JavaMailSender का एक स्टब कार्यान्वयन बनाने का सुझाव देना चाहता हूं। इस तरह, आप अपने देव और परीक्षण निर्माण में स्टब ऑब्जेक्ट इंजेक्ट कर सकते हैं।

+0

बुहब - असल में, मुझे एक स्टब बनाने में कोई फर्क नहीं पड़ता, जैसा कि आप उल्लेख करते हैं। वास्तव में, यदि यह सबसे अच्छा समाधान दिखाया गया है, तो मैं इस बिंदु पर अन्य कोड बदल सकता हूं। मैं बस अपनी सेवा परत में चीज नहीं बदलना पसंद करूंगा। तो मुझे ऐसी सख्त आवश्यकता की तरह आवाज नहीं लेनी चाहिए थी। – Tauren

1

mock-javamail पर एक नज़र डालें (पिछला उत्तर क्या सुझाता है) या संभावित रूप से भी तेज समाधान एक नकली एसएमटीपी सर्वर है जैसे Fakemail

+0

akhnaten - धन्यवाद, मुझे इन उपकरणों में से किसी के बारे में पता नहीं था, और वे निश्चित रूप से मदद कर सकते हैं। हालांकि, मैं अभी भी वास्तव में ईमेल भेजने का एक तरीका चुनना पसंद करूंगा, लेकिन मेरे द्वारा निर्दिष्ट पते पर केवल TO पता फिर से लिखा गया है। ऐसा लगता है कि ये उपकरण ऐसा नहीं करते हैं। – Tauren

+0

नकली एसएमटीपी सर्वर के साथ सभी ईमेल सामान्य रूप से एसएमटीपी के माध्यम से भेजे जाते हैं, सिवाय इसके कि एसएमटीपी सर्वर वास्तव में उन्हें वितरित नहीं करता है लेकिन उन्हें स्थानीय फाइलों में सहेजता है जहां आप उनका निरीक्षण कर सकते हैं। तो प्राप्तकर्ता को बदलने की जरूरत नहीं है। –

2

मुझे अतीत में एक समान आवश्यकता थी, और मेरा समाधान लिखना था जिसे मैंने EnvironmentSelectingFactoryBean कहा था (वसंत लंबे वर्ग के नामों को प्रोत्साहित करता है ...)। यह FactoryBean कार्यान्वयन था जो वर्तमान अनुप्रयोग envrironment के आधार पर उपलब्ध बीन्स की एक श्रृंखला में से एक "चयन" होगा।

अगर मैं तुम्हें कुछ उदाहरण एक्सएमएल दिखाने के लिए, मुझे लगता है कि आप अनुमान लगा सकेंगे कि:

<bean id="mailSender" class="com.kizoom.spring.config.EnvironmentSelectingFactoryBean"> 
    <property name="beanMap"> 
     <map> 
     <entry key="test"> 
      <bean class="org.springframework.mail.javamail.JavaMailSenderImpl"> 
       <property name="host" value="${mailhost.test}"/> 
      </bean> 
     </entry> 
     <entry key="production"> 
      <bean class="org.springframework.mail.javamail.JavaMailSenderImpl"> 
       <property name="host" value="${mailhost.production}"/> 
      </bean> 
     </entry> 
     </map> 
    </property> 
</bean> 

तो, EnvironmentSelectingFactoryBean जानता है कि क्या आप "परीक्षण" या "उत्पादन" मोड में चला रहे हैं, उचित उठाता beanMap से बीन, और यह हमारे FactoryBean.getObject() विधि से थूकता है। beanMap में दोनों बीन्स असली मेल प्रेषक हैं, स्टब्स नहीं हैं, प्रत्येक अलग-अलग प्रोपर्टी प्लेसहोल्डर मूल्यों के साथ हैं, लेकिन आप कभी भी गलत होने का जोखिम नहीं चलाते हैं।

ग्राहक कोड केवल एक JavaMailSender बीन देखेंगे।

4

नोट: मेरा जवाब मेवेन का उपयोग करने पर आधारित है, इसलिए यह किसी भी चीज़ से निर्माण के बारे में अधिक है, लेकिन वसंत का उपयोग करने से मुझे आसानी से मूल्यों को इंजेक्ट करने देता है।

मैं में एक property-placeholder का उपयोग करें और जैसे सेम का निर्माण:

JDBC।गुण:

db.url=hostname:1521/test 
db.username=awesome 
db.password=password 

applicationContext.xml (संदर्भ नाम स्थान का उपयोग कर)

<context:property-placeholder location="classpath:jdbc.properties"/> 
<bean id="yo" class="some.DataSource"> 
    <property name="url" value="${db.url}"/> 
    <property name="username" value="${db.username}"/> 
    <property name="password" value="${db.password}"/> 
</bean> 

तो मैं अलग फ़ोल्डर में वातावरण की तरह डोमेन विशिष्ट मूल्यों के साथ की दुकान:

src/main/environments 
++ prod 
+++++ jdbc.properties 
++ dev 
+++++ jdbc.properties 
++ cert 
+++++ jdbc.properties 

का उपयोग Maven प्रोफाइल (से pom.xml):

<profile> 
    <id>environment</id> 
    <activation> 
     <property> 
      <name>environment</name> 
     </property> 
    </activation> 
    <build> 
     <resources> 
      <resource> 
       <directory>src/main/environments/${environment}</directory> 
      </resource> 
     </resources> 

आप गुण फ्लेक्स -Denviroment संपत्ति के साथ किसी भी Maven आदेश चला सकते हैं:

mvn clean -Denvironment=dev test 
mvn clean -Denvironment=cert package 
mvn clean -Denvironment=prod deploy 

आदि और कहा कि पर्यावरण फ़ोल्डर से किसी भी फाइल किसी भी src/मुख्य/संसाधन फ़ाइलों के साथ लक्ष्य या विरूपण साक्ष्य में नकल कर रहे हैं।

1

संपत्ति प्लेस धारक के साथ एक और विकल्प रनटाइम पर सिस्टम प्रॉपर्टी के आधार पर गतिशील रूप से एक प्रॉपर्टी फ़ाइल लोड करना है।

/WEB-INF/config/myapp.${myapp.env}.properties

वेब-INF/conf myapp.prod.properties myapp.stag.properties होगा MyApp .test.properties

Add -Dmyapp.env = tomcat को prod या आप एप्लिकेशन सर्वर स्क्रिप्ट शुरू करते हैं।

0

सबसे अच्छा समाधान javax.mail.Session जेएनडीआई संसाधन के रूप में बनाना है। प्रोड/परीक्षण और dev के लिए आप इसे अलग-अलग सेट कर सकते हैं। और आपको अपने ऐप में सेटिंग्स बदलने के बारे में चिंता करने की ज़रूरत नहीं है क्योंकि सर्वर द्वारा केवल अंतर प्रबंधित किया जाता है।

dev * और ** परीक्षण मैं आपको javax.mail.Session का एक अच्छा नकली अनुशंसा कर सकता हूं।

  • मेल बचाने फ़ाइलों को text प्रारूप में के बजाय उन्हें बजाय mbox प्रारूप में फाइल करने के लिए
  • मेल बचाने भेजने उन्हें भेजने की:

    एक GitHub परियोजना javaMail extensionफ़ाइल परिवहन कि करने के लिए अनुमति देता है कहते हैं

  • ईमेल भेजने की बजाय लॉग जानकारी जोड़ें
संबंधित मुद्दे