क्या मैं ASP.NET के साथ HTML / ईमेल टेम्प्लेट सेट कर सकता हूँ?


97

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

अगर मैं HTML को C # स्ट्रिंग शाब्दिक के अंदर एम्बेड करता हूं, तो यह बदसूरत है और उन्हें भागने के बारे में चिंता करनी होगी। शीर्ष लेख और पाद लेख के लिए समतल फ़ाइलें शामिल हो सकती हैं, लेकिन इसके बारे में कुछ ठीक नहीं लगता है।

किसी .ASPXपेज को किसी भी तरह से टेम्प्लेट के रूप में उपयोग करने के लिए क्या आदर्श होगा , फिर उस पृष्ठ की सेवा के लिए मेरा कोड बताएं, और ईमेल के लिए लौटे HTML का उपयोग करें।

क्या ऐसा करने का एक अच्छा और आसान तरीका है? क्या इस समस्या को हल करने के लिए एक बेहतर तरीका है?

अपडेट किया गया:
मैंने एक उत्तर जोड़ा, जो आपको ईमेल टेम्प्लेट के रूप में एक मानक .aspx पृष्ठ का उपयोग करने में सक्षम बनाता है। बस आप की तरह सभी चर को सामान्य रूप से प्रतिस्थापित करें, डेटाबाइंडिंग आदि का उपयोग करें, फिर पृष्ठ के आउटपुट, और वॉइला पर कब्जा करें! आपके पास अपना HTML ईमेल है!

CATAT के साथ अद्यतन !!!:
मैं सिर्फ कुछ aspx पृष्ठों पर MailDefinition वर्ग का उपयोग ठीक कर रहा था, लेकिन जब चल रहे सर्वर प्रक्रिया के दौरान इस वर्ग का उपयोग करने की कोशिश कर रहा था, तो यह विफल रहा। मेरा मानना ​​है कि ऐसा इसलिए था क्योंकि MailDefinition.CreateMailMessage () विधि को संदर्भ के लिए एक वैध नियंत्रण की आवश्यकता होती है, भले ही वह हमेशा कुछ न करे। इस वजह से, मैं अपने दृष्टिकोण को एस्पक्स पेज या मुन के दृष्टिकोण का उपयोग करने की सलाह दूंगा, जो कि एक आरएक्सएक्स पेज का उपयोग कर रहा है, जो थोड़ा बेहतर लगता है।


C # और Comlang टेम्पलेट भाषा का उपयोग करके अपने ईमेल बनाने और भेजने के लिए AlphaMail का उपयोग करने के लिए एक और समाधान होगा ।
टिमोथी ई। जोहानसन

1
@JohnBubriski: मैं उस नियंत्रण समस्या के आसपास काम करता हूं, जिसका उल्लेख आपने "CATAT के साथ अद्यतन" new System.Web.UI.Control()में किया है mailDefinition.CreateMailMessage("somebody@fake.com", iDictionaryReplacements, new System.Web.UI.Control())
थियोफिलस

हां, मैंने भी ऐसा किया है, लेकिन रेजर के आगमन को देखते हुए, यह एक अच्छा विचार नहीं है।
जॉन Bubriski

जवाबों:


73

यहाँ पहले से ही उत्तर के एक टन है, लेकिन मैं एक महान लेख पर ठोकर खाई कि ईमेल टेम्प्लेटिंग के साथ रेजर का उपयोग कैसे करें। रेजर को ASP.NET MVC 3 के साथ धकेल दिया गया था, लेकिन रेजर का उपयोग करने के लिए MVC की आवश्यकता नहीं है। यह ईमेल टेम्प्लेट करने की बहुत ही धीमी प्रक्रिया है

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

RazorEngine के साथ HTML ईमेल उत्पन्न करना - भाग 01 - परिचय

ASP.NET के बाहर रेजर टेम्पलेट का उत्तोलन: वे HTML अनिमोर के लिए नहीं हैं!

RazorEngine के साथ ASP.NET में स्मार्ट ईमेल टेम्प्लेट

इसी तरह के स्टैकओवरफ्लो QA

नए RazorEngine एपीआई का उपयोग कर अस्थायी

MVC के बिना रेजर का उपयोग करना

क्या asp.net के बाहर रेजर व्यू इंजन का उपयोग करना संभव है


1
+1 लेकिन सावधान रहें यदि उपयोगकर्ता टेम्प्लेट प्रदान कर रहे हैं, क्योंकि वे टेम्प्लेट से C # कोड चला सकते हैं, जिससे वे आपके सिस्टम में अधिक शक्ति देंगे, जितना आप चाहते हैं।
एरोनल्स

आप सुरक्षा के बारे में क्या सोचते हैं। इस टेम्प्लेटिंग इंजन का उपयोग करने से संभवत: पूरे फाइल सिस्टम को प्रारूपित किया जा सकता है। मुझे इंजन पसंद है, लेकिन यह मुझे दूसरे इंजनों पर एक नजर डालने के लिए मजबूर करता है।
der_chirurg

55

आप किसी नियंत्रण को लोड करने का प्रयास भी कर सकते हैं, और फिर उसे स्ट्रिंग पर रेंडर करके HTML बॉडी के रूप में सेट कर सकते हैं:

// Declare stringbuilder to render control to
StringBuilder sb = new StringBuilder();

// Load the control
UserControl ctrl = (UserControl) LoadControl("~/Controls/UserControl.ascx");

// Do stuff with ctrl here

// Render the control into the stringbuilder
StringWriter sw = new StringWriter(sb);
Html32TextWriter htw = new Html32TextWriter(sw);
ctrl.RenderControl(htw);

// Get full body text
string body = sb.ToString();

आप हमेशा की तरह अपने ईमेल का निर्माण कर सकते हैं:

MailMessage message = new MailMessage();
message.From = new MailAddress("from@email.com", "from name");
message.Subject = "Email Subject";
message.Body = body;
message.BodyEncoding = Encoding.ASCII;
message.IsBodyHtml = true;

SmtpClient smtp = new SmtpClient("server");
smtp.Send(message);

आप उपयोगकर्ता नियंत्रण में अन्य नियंत्रण शामिल कर सकते हैं, जैसे हेडर और फ़ूटर, और डेटा बाइंडिंग जैसी कार्यक्षमता का लाभ भी उठा सकते हैं।


मैं किसी भी तरह यह जवाब याद किया पहली बार के आसपास ... अच्छा एक। मेरे समाधान के समान है, लेकिन एक aspx के बजाय एक asxx के साथ। मुझे अभी भी लगता है कि एस्पक्स बेहतर होगा, क्योंकि यह एक नियंत्रण के बजाय एक पूर्ण पृष्ठ पेश करेगा, लेकिन यह वही है जो मुझे लगता है।
जॉन Bubriski

हां, आप या तो समाधान का उपयोग कर सकते हैं ... वे उसी तरह से काम करते हैं। इस दृष्टिकोण का एक लाभ स्थिरता है। उदाहरण के लिए, आप एक उपयोगकर्ता को एक आदेश सारांश दिखा सकते हैं और उसी ईमेल को पुन: उपयोग करके पुष्टिकरण ईमेल में ठीक उसी चीज़ को शामिल कर सकते हैं।
मुन

मामूली बिंदु लेकिन आप पहले कोड ब्लॉक में एक स्ट्रिंगबर्ल घोषित करने के लिए एक पंक्ति याद कर रहे हैं।
Kirschstein

9
उदाहरण यह नहीं समझाता है कि कोड कहाँ रहता है, क्या यह एक पृष्ठ है?, क्योंकि LoadControl एक पृष्ठ / नियंत्रण विधि है।
श्रेज स्मिलोवित्ज़

@Mun, आप ctrl नामक एक चर में usercontrol को लोड करते हैं, और आप इसे अपने कोड में फिर से संदर्भित नहीं करते हैं। यह कैसे काम करना है?
मफिन मैन

35

आप MailDefinition वर्ग की कोशिश कर सकते हैं


4
मैं केवल यह बताना चाहता हूं कि यह बुनियादी ईमेल के लिए अच्छा है, लेकिन कुछ भी जटिल नहीं है। MailDefinition वर्ग डेटाबाइंडिंग का समर्थन नहीं करता है। केवल एक चीज जो वास्तव में करती है वह है स्ट्रिंग रिप्लेसमेंट। हालाँकि, इसका निर्माण सदस्यता खाता निर्माण विज़ार्ड में भी किया गया है।
जॉन Bubriski

4
MailDefinition class को templated content रेंडर करने के लिए एक Control प्राप्त करना होगा .. इतना अच्छा नहीं।
युकी

17

यदि आप उपयोगकर्ता नाम, उत्पाद नाम, ... आदि जैसे मापदंडों को पारित करना चाहते हैं, तो आप अपने अंतिम ईमेल / एचटीएमएल के उत्पादन के लिए ओपन सोर्स टेम्पलेट इंजन एनवीलोसिटी का उपयोग कर सकते हैं ।

NVelocity टेम्पलेट ( MailTemplate.vm ) का एक उदाहरण :

A sample email template by <b>$name</b>.
<br />

Foreach example :
<br />    
#foreach ($item in $itemList)

[Date: $item.Date] Name: $item.Name, Value: $itemValue.Value
<br /><br />

#end

अपने आवेदन में MailTemplate.vm द्वारा मेल बॉडी बनाना:

VelocityContext context = new VelocityContext();
context.Put("name", "ScarletGarden");
context.Put("itemList", itemList);

StringWriter writer = new StringWriter();

Velocity.MergeTemplate("MailTemplate.vm", context, writer);

string mailBody = writer.GetStringBuilder().ToString();

परिणाम मेल बॉडी है:

स्कारलेटगार्डन द्वारा एक नमूना ईमेल टेम्पलेट ।

उदाहरण के लिए:

[दिनांक: १२.०२.२०० ९] नाम: आइटम १, मूल्य: ० ९

[दिनांक: २१.०२.२०० ९] नाम: आइटम ४, मूल्य: ५२

[दिनांक: ०१.०३.२०० ९] नाम: आइटम २, मूल्य: २१

[दिनांक: २३.०३.२०० ९] नाम: आइटम ६, मूल्य: २४

टेम्प्लेट संपादित करने के लिए, शायद आप FCKEditor का उपयोग कर सकते हैं और अपने टेम्प्लेट को फ़ाइलों में सहेज सकते हैं ।


7

Mail.dll ईमेल घटक में ईमेल टेम्पलेट इंजन शामिल है:

यहाँ सिंटैक्स अवलोकन है:

<html>
<body>
Hi {FirstName} {LastName},

Here are your orders: 
{foreach Orders}
    Order '{Name}' sent to <strong>{Street}</strong>. 
{end}

</body>
</html>

और कोड जो टेम्पलेट को लोड करता है, c # ऑब्जेक्ट से डेटा भरता है और एक ईमेल भेजता है:

Mail.Html(Template
              .FromFile("template.txt")
              .DataFrom(_contact)
              .Render())
    .Text("This is text version of the message.")
    .From(new MailBox("alice@mail.com", "Alice"))
    .To(new MailBox("bob@mail.com", "Bob"))
    .Subject("Your order")
    .UsingNewSmtp()
    .WithCredentials("alice@mail.com", "password")
    .Server("mail.com")
    .WithSSL()
    .Send();

आप ईमेल टेम्पलेट इंजन ब्लॉग पोस्ट पर अधिक जानकारी प्राप्त कर सकते हैं ।

या सिर्फ Mail.dll ईमेल घटक डाउनलोड करें और इसे आज़माएं।

कृपया ध्यान दें कि यह एक व्यावसायिक उत्पाद है जिसे मैंने बनाया है।


6

यदि लचीलापन आपके किसी और चीज में से एक है, तो XSLT एक अच्छा विकल्प हो सकता है, जो पूरी तरह से .NET फ्रेमवर्क द्वारा समर्थित है और आप उपयोगकर्ता को उन फ़ाइलों को संपादित करने में भी सक्षम होंगे। यह लेख ( http://www.aspfree.com/c/a/XML/XSL-Transformations-using-ASP-NET/ ) एक शुरुआत के लिए उपयोगी हो सकता है (msdn में इसके बारे में अधिक जानकारी है)। जैसा कि स्कारलेटगार्डन एनवीलोसिटी ने कहा है कि यह एक और अच्छा विकल्प है, लेकिन मैं इसके "बिल्ट-इन" .NET फ्रेमवर्क सपोर्ट और प्लेटफॉर्म एग्नोस्टिक के लिए XSLT को प्राथमिकता देता हूं।


मैंने पहले कभी इस बारे में नहीं सोचा था, लेकिन कई अन्य तरीकों की कोशिश करने के बाद मैंने पाया कि इसने IXmlSerializableअपनी कक्षाओं में इंटरफ़ेस को जोड़ने के साथ काम किया । कुछ ही पंक्तियों में मैं अपनी कक्षा को ईमेल में बदल सकता हूं।
cjbarth

उरग, मैंने XSLT के बारे में बुरे सपने देखे हैं। संभवतः सबसे गैर-सहज प्रोग्रामिंग / मार्कअप भाषा, जिसके साथ मैंने काम किया है। और दूसरों के लिए बनाए रखने के लिए असंभव और यहां तक ​​कि खुद के लिए 1 महीने के बाद आप पहले अपने XSLT कोडित।
PussInBoots

5

मुझे लगता है कि आप भी कुछ ऐसा कर सकते हैं:

.Aspx पेज बनाएँ, और इसे OnLoad विधि के अंत में रखें, या इसे मैन्युअल रूप से कॉल करें।

    StringBuilder sb = new StringBuilder();
    StringWriter sw = new StringWriter(sb);
    HtmlTextWriter htmlTW = new HtmlTextWriter(sw);
    this.Render(htmlTW);

मुझे यकीन नहीं है कि इसके साथ कोई संभावित मुद्दे हैं, लेकिन ऐसा लगता है कि यह काम करेगा। इस तरह, आप MailDefinition वर्ग के बजाय एक पूर्ण विशेषताओं वाले .aspx पृष्ठ का उपयोग कर सकते हैं, जो केवल पाठ प्रतिस्थापन का समर्थन करता है।


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

महान! क्या आपके पास इसके साथ कोई समस्या थी?
जॉन Bubriski

इसलिए जब आप मेल टेम्प्लेट में परिवर्तन करने की आवश्यकता होती है तो आप अपने उपयोगकर्ताओं को .aspx फ़ाइलों को संपादित करने देते हैं। मुझे लगता है कि एक संभावित मुद्दा है।
ब्रायन

मैं ऐसा नहीं सोचता, कम से कम, अन्य टेम्पलेट्स की तुलना में कोई जोखिम नहीं जो वे संपादित कर सकते थे। दी, अगर वे जानते थे कि वे क्या कर रहे हैं, तो वे नुकसान पहुंचा सकते हैं, लेकिन इस मामले में कम से कम, इसकी संभावना नहीं है। यह एक जटिल .aspx पृष्ठ नहीं होगा, जो प्लेसहोल्डर के साथ टेम्पलेट का अधिक होगा।
जॉन Bubriski

कुछ समय हो गया है, मुझे पता है, लेकिन क्या आपको अपना अंतिम समाधान याद है? मैं इस विशेष दृष्टिकोण के साथ काम करने में सक्षम नहीं था Page, कम से कम जब प्रतिपादन के लिए एक सामान्य विस्तार विधि का उपयोग कर। इस प्रकार मैं बदल गया UserControl; नीचे मेरा जवाब देखें। अब तक यह अच्छी तरह से काम कर रहा है ... मुझे यह जानने में दिलचस्पी होगी कि आपने उस समय कैसे काम किया।
InteXX

4

सुनिश्चित करें कि आप एक html टेम्पलेट बना सकते हैं और मैं एक टेक्स्ट टेम्पलेट भी सुझाऊंगा। टेम्पलेट में आप बस [BODY] को उस स्थान पर रख सकते हैं जहाँ शरीर रखा जाएगा और फिर आप बस टेम्पलेट में पढ़ सकते हैं और शरीर को नई सामग्री से बदल सकते हैं। आप ईमेल का उपयोग कर भेज सकते हैं। शुरू में ईमेल बनाने के बाद आपको बस सभी प्राप्तकर्ताओं को ईमेल भेजने के माध्यम से लूप करना होगा। मेरे लिए एक जादू की तरह काम किया।

using System.Net.Mail;

// Email content
string HTMLTemplatePath = @"path";
string TextTemplatePath = @"path";
string HTMLBody = "";
string TextBody = "";

HTMLBody = File.ReadAllText(HTMLTemplatePath);
TextBody = File.ReadAllText(TextTemplatePath);

HTMLBody = HTMLBody.Replace(["[BODY]", content);
TextBody = HTMLBody.Replace(["[BODY]", content);

// Create email code
MailMessage m = new MailMessage();

m.From = new MailAddress("address@gmail.com", "display name");
m.To.Add("address@gmail.com");
m.Subject = "subject";

AlternateView plain = AlternateView.CreateAlternateViewFromString(_EmailBody + text, new System.Net.Mime.ContentType("text/plain"));
AlternateView html = AlternateView.CreateAlternateViewFromString(_EmailBody + body, new System.Net.Mime.ContentType("text/html"));
mail.AlternateViews.Add(plain);
mail.AlternateViews.Add(html);

SmtpClient smtp = new SmtpClient("server");
smtp.Send(m);

आप StreamReader सामान को काट सकते हैं और File.ReadAllText (पाथ) के साथ बदल सकते हैं
जॉन शीहान

यह एक अच्छी शुरुआत है, लेकिन केवल हेडर और फुटर के लिए कार्यक्षमता प्रदान करता है। यह वास्तव में शरीर के साथ मदद नहीं करता है।
जॉन Bubriski

आपको केवल इतना करना है कि HTMLBody और TextBody फील्ड्स में वांछित बॉडी कंटेंट को दर्ज करना है या आप उन्हें फाइलों में भी स्टोर कर सकते हैं
जोश में

4

यहां एक और विकल्प है जो अधिक जटिल ईमेल टेम्पलेट्स के लिए XSL परिवर्तनों का उपयोग करता है: .NET अनुप्रयोगों से HTML- आधारित ईमेल भेजना


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

2

ऐसा करते समय सावधान रहें, SPAM फ़िल्टर ASP.net जेनरेट किए गए HTML को ब्लॉक करने लगते हैं, जाहिरा तौर पर ViewState के कारण, इसलिए यदि आप ऐसा करने जा रहे हैं तो सुनिश्चित करें कि उत्पादित Html साफ है।

मैं व्यक्तिगत रूप से आपके वांछित परिणाम प्राप्त करने के लिए Asp.net MVC का उपयोग करूंगा। या NVelocity इस पर काफी अच्छा है


1

आदर्श क्या होगा। किसी भी तरह एक टेम्पलेट के रूप में एक .ASPX पृष्ठ का उपयोग करें, तो बस उस पृष्ठ की सेवा करने के लिए मेरा कोड बताएं, और ईमेल के लिए लौटे HTML का उपयोग करें।

आप ASPX पृष्ठ को हिट करने और परिणामी HTML प्राप्त करने के लिए आसानी से एक WebRequest का निर्माण कर सकते हैं। थोड़े और काम के साथ, आप शायद इसे बिना WebRequest के पूरा कर सकते हैं। एक PageParser और एक Response.Filter आपको पृष्ठ चलाने और आउटपुट पर कब्जा करने की अनुमति देगा ... हालाँकि कुछ और सुरुचिपूर्ण तरीके हो सकते हैं।


1

मुझे उन परियोजनाओं में से 1 पर एक समान आवश्यकता थी जहां आपको प्रत्येक दिन बड़ी संख्या में ईमेल भेजने पड़ते थे, और ग्राहक विभिन्न प्रकार के ईमेल के लिए html टेम्पलेट्स पर पूर्ण नियंत्रण चाहते थे।

बड़ी संख्या में ईमेल भेजे जाने के कारण, प्रदर्शन एक प्राथमिक चिंता थी।

हम एसक्यूएल सर्वर में स्थिर सामग्री के साथ आए थे, जहां आप विभिन्न प्रकार के ईमेल के लिए संपूर्ण HTML टेम्पलेट मार्क (प्लेसहोल्डर के साथ, जैसे [UserFirstName], [UserLastName] जो रन टाइम में वास्तविक डेटा के साथ बदल दिए जाते हैं।

तब हमने इस डेटा को asp.net cache में लोड किया है - इसलिए हम html टेम्पलेट को बार-बार नहीं पढ़ते हैं - लेकिन केवल जब वे वास्तव में बदले जाते हैं

हमने क्लाइंट को एक व्यवस्थापक वेब फॉर्म के माध्यम से इन टेम्प्लेट को संशोधित करने के लिए एक WYSIWYG संपादक दिया। जब भी अपडेट किया गया, हम asp.net कैश रीसेट करें।

और फिर हमारे पास ईमेल लॉग के लिए एक अलग तालिका थी - जहां भेजे जाने वाले प्रत्येक ईमेल को लॉग किया गया था। इस तालिका में emailType, emailSent और numberOfTries नामक फ़ील्ड थे।

हम बस महत्वपूर्ण ईमेल प्रकारों के लिए हर 5 मिनट में एक नौकरी चलाते हैं (जैसे नया सदस्य साइन अप, पासवर्ड भूल गए) जिसे asap भेजने की आवश्यकता है

हम कम महत्वपूर्ण ईमेल प्रकारों (जैसे प्रचार ईमेल, समाचार ईमेल, आदि) के लिए हर 15 मिनट में एक और नौकरी चलाते हैं

इस तरह आप नॉन स्टॉप ईमेल भेजने वाले अपने सर्वर को ब्लॉक नहीं करते हैं और आप बैच में मेल प्रोसेस करते हैं। एक बार ईमेल भेजे जाने के बाद आप ईमेल फ़ील्ड को 1 पर सेट करते हैं।


लेकिन आपने संग्रह कैसे संभाला?
रारी

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

1

ध्यान दें कि aspx और ascx समाधान के लिए एक वर्तमान HttpContext की आवश्यकता होती है, इसलिए बिना काम के अतुल्यकालिक (जैसे थ्रेड्स में) का उपयोग नहीं किया जा सकता है।


1

मुझे लगता है कि आसान उत्तर MvcMailer है। यह NuGet पैकेज है जो आपको ईमेल बनाने के लिए अपने पसंदीदा दृश्य इंजन का उपयोग करने देता है। यहाँ NuGet पैकेज और परियोजना प्रलेखन देखें

आशा करता हूँ की ये काम करेगा!


हम्म, अजीब इस जवाब ध्यान का इतना नहीं मिला है ?!
पूसइन्बूट्स

1

DotLiquid एक और विकल्प है। आप एक वर्ग मॉडल से मान निर्दिष्ट करते हैं {{ user.name }}और फिर रनटाइम के दौरान आप उस कक्षा में डेटा, और मार्कअप के साथ टेम्पलेट प्रदान करते हैं, और यह आपके लिए मूल्यों को मर्ज कर देगा। यह कई मायनों में रेजर टेम्पलेटिंग इंजन का उपयोग करने के समान है। यह लूप जैसी अधिक जटिल चीजों और टाउपर जैसे विभिन्न कार्यों का समर्थन करता है। अच्छी बात यह है कि ये "सुरक्षित" हैं ताकि उपयोगकर्ता जो टेम्पलेट बनाते हैं वे आपके सिस्टम को क्रैश नहीं कर सकते हैं या आप की तरह असुरक्षित कोड नहीं लिख सकते हैं: http://dotliquidmarkup.org/try-online


0

यदि आप ASPNET और संबद्ध उपयोगकर्ताओं को फ़ाइल पढ़ने और लिखने की अनुमति देने में सक्षम हैं, तो आप मानक String.Format()धारकों के साथ HTML फ़ाइल का उपयोग आसानी से कर सकते हैं {0},{1:C} पूरा करने के लिए , आदि) के ।

System.IOनाम से कक्षाओं का उपयोग करते हुए, स्ट्रिंग के रूप में, फ़ाइल में पूरी तरह से पढ़ें । एक बार आपके पास वह स्ट्रिंग होने के बाद, इसे पहले तर्क के रूप में पास करेंString.Format() , और पैरामीटर प्रदान करें।

उस स्ट्रिंग को इधर-उधर रखें, और ई-मेल के शरीर के रूप में उपयोग करें, और आप अनिवार्य रूप से कर रहे हैं। हम आज (दर्जनों छोटे) साइटों पर ऐसा करते हैं, और कोई समस्या नहीं है।

मुझे ध्यान देना चाहिए कि यह सबसे अच्छा काम करता है अगर (ए) आप एक बार में ई-मेल के ज़िल नहीं भेज रहे हैं, (बी) आप प्रत्येक ई-मेल को निजीकृत नहीं कर रहे हैं (अन्यथा आप एक टन तार खाते हैं) और (सी) ) HTML फ़ाइल स्वयं अपेक्षाकृत छोटी है।


0

ईमेल संदेश IsBodyHtml = true पर सेट करें

अपनी वह वस्तु लें जिसमें आपकी ईमेल सामग्री हो, ऑब्जेक्ट को सीरियल करें और html सामग्री उत्पन्न करने के लिए xml / xslt का उपयोग करें।

अगर आप अल्टरनेटिव व्यूज करना चाहते हैं तो वही करें जो जैमिन प्लेन टेक्स्ट कंटेंट बनाने के लिए एक अलग xslt टेम्पलेट का उपयोग करता है।

इसका एक बड़ा फायदा यह है कि अगर आप अपने लेआउट को बदलना चाहते हैं तो आपको xslt टेम्पलेट को अपडेट करना होगा।


0

सबसोनिक (www.subsonicproject.com) को देखें। वे कोड उत्पन्न करने के लिए बिल्कुल ऐसा कर रहे हैं - टेम्पलेट मानक ASPX है, और यह c # आउटपुट करता है। आपके परिदृश्य के लिए वही विधि पुन: प्रयोज्य होगी।


0

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


0

मुझे राज का जवाब पसंद है। DNN जैसे ListManager और चौखटे जैसे कार्यक्रम समान काम करते हैं, और यदि गैर-तकनीकी उपयोगकर्ताओं द्वारा आसान संपादन की आवश्यकता होती है, तो SQL में संग्रहीत HTML को संशोधित करने के लिए WYSIWYG संपादकों को जाने के लिए एक सबसे आसान, सरल तरीका है और आसानी से हेडर से स्वतंत्र रूप से संयोजन कर सकते हैं। आदि, साथ ही साथ गतिशील रूप से मान सम्मिलित करने के लिए टोकन का उपयोग करना।

उपरोक्त विधि (या कोई भी, वास्तव में) का उपयोग करते समय ध्यान रखने वाली एक बात यह है कि आप किस प्रकार के स्टाइल और टैग को संपादकों को सम्मिलित करने की अनुमति देते हैं, इस बारे में सख्त और सावधान रहना चाहिए। यदि आपको लगता है कि ब्राउज़र फ़िक्‍ती हैं, तब तक प्रतीक्षा करें जब तक कि आप यह न देख लें कि ईमेल क्लाइंट एक ही चीज़ को कैसे रेंडर करते हैं ...


0

कैनावर के उत्तर के समान, लेकिन NVelocity के बजाय, मैं हमेशा " StringTemplate " का उपयोग करता हूं, जिसे मैं कॉन्फ़िगरेशन फ़ाइल से टेम्पलेट लोड करता हूं, या File.ReadAllText () का उपयोग करके एक बाहरी फ़ाइल लोड करता हूं और मान सेट करता हूं।

यह एक जावा प्रोजेक्ट है लेकिन C # पोर्ट सॉलिड है और मैंने इसे कई प्रोजेक्ट्स में इस्तेमाल किया है (बस इसे किसी बाहरी फाइल में टेम्प्लेट का इस्तेमाल करके ईमेल टेम्प्लेट करने के लिए इस्तेमाल किया है)।

विकल्प हमेशा अच्छे होते हैं।


0

यहाँ WebClient वर्ग का उपयोग करने का एक सरल तरीका है :

public static string GetHTMLBody(string url)
{
    string htmlBody;

    using (WebClient client = new WebClient ())
    {
        htmlBody = client.DownloadString(url);
    }

    return htmlBody;
}

तो बस इसे इस तरह से कॉल करें:

string url = "http://www.yourwebsite.com";
message.Body = GetHTMLBody(url);

बेशक, आपके सीएसएस को सबसे ईमेल क्लाइंट (जैसे कि आउटलुक) में वेबपेज की शैलियों को दिखाने के लिए लाइन में खड़ा होना होगा। यदि आपका ई-मेल डायनामिक कंटेंट (पूर्व ग्राहक का नाम) प्रदर्शित करता है, तो मैं डेटा को पॉप्युलेट करने के लिए आपकी वेबसाइट पर QueryStrings का उपयोग करने की सलाह दूंगा। (उदा। http://www.yourwebsite.com?CustomerName=bus )


हालांकि, मुझे लगता है कि अधिकांश अन्य उत्तर साइट पर वापस वेब अनुरोध किए बिना यानी आपकी साइट पर ईमेल बॉडी को होस्ट करने के लिए करते हैं।
रुप

@ समझ में आता है, लेकिन कई बार लोग ई-मेल का "वेब संस्करण" देखना चाहते हैं। यह समाधान उस परिदृश्य के लिए एकदम सही काम करता है।
ROFLwTIME

0

@ बर्डेव एक अच्छा समाधान प्रदान करता है, लेकिन दुर्भाग्य से यह सभी मामलों में आदर्श नहीं है। मेरा उनमें से एक था।

मैं एक वेबसाइट में WebForms का उपयोग कर रहा हूं (कसम खाता हूं कि मैं कभी भी एक वेबसाइट का उपयोग नहीं करूंगा - वीएस 2013 में पीटीए क्या है)।

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

रेजर पर फिर से निक्स।

इसलिए मैं इसके बजाय इस छोटे ढांचे के साथ आया था (हैट कंट्रोल के लिए @ मून को टिप्स और स्ट्रॉन्ग टाइपिंग के लिए @imatoria)। बस एकमात्र संभावित परेशानी स्थल के बारे में मैं देख सकता हूं कि आपको अपने वर्ग नाम के साथ अपने .ASCX फ़ाइल नाम को रखने के लिए सावधान रहना होगा। यदि आप भटकते हैं, तो आपको एक रनटाइम त्रुटि मिलेगी।

FWIW: मेरे परीक्षण में कम से कम RenderControl () कॉल पेज कंट्रोल को पसंद नहीं करता है, इसलिए मैं UserControl के साथ गया।

मुझे पूरा यकीन है कि मैंने यहां सब कुछ शामिल किया है; मुझे पता है अगर मैं कुछ बाहर छोड़ दिया।

HTH

उपयोग:

Partial Class Purchase
  Inherits UserControl

  Private Sub SendReceipt()
    Dim oTemplate As MailTemplates.PurchaseReceipt

    oTemplate = MailTemplates.Templates.PurchaseReceipt(Me)
    oTemplate.Name = "James Bond"
    oTemplate.OrderTotal = 3500000
    oTemplate.OrderDescription = "Q-Stuff"
    oTemplate.InjectCss("PurchaseReceipt")

    Utils.SendMail("{0} <james.bond@mi6.co.uk>".ToFormat(oTemplate.Name), "Purchase Receipt", oTemplate.ToHtml)
  End Sub
End Class

बेस क्लास:

Namespace MailTemplates
  Public MustInherit Class BaseTemplate
    Inherits UserControl

    Public Shared Function GetTemplate(Caller As TemplateControl, Template As Type) As BaseTemplate
      Return Caller.LoadControl("~/MailTemplates/{0}.ascx".ToFormat(Template.Name))
    End Function



    Public Sub InjectCss(FileName As String)
      If Me.Styler IsNot Nothing Then
        Me.Styler.Controls.Add(New Controls.Styler(FileName))
      End If
    End Sub



    Private ReadOnly Property Styler As PlaceHolder
      Get
        If _Styler Is Nothing Then
          _Styler = Me.FindNestedControl(GetType(PlaceHolder))
        End If

        Return _Styler
      End Get
    End Property
    Private _Styler As PlaceHolder
  End Class
End Namespace

"फैक्टरी" वर्ग:

Namespace MailTemplates
  Public Class Templates
    Public Shared ReadOnly Property PurchaseReceipt(Caller As TemplateControl) As PurchaseReceipt
      Get
        Return BaseTemplate.GetTemplate(Caller, GetType(PurchaseReceipt))
      End Get
    End Property
  End Class
End Namespace

टेम्प्लेट क्लास:

Namespace MailTemplates
  Public MustInherit Class PurchaseReceipt
    Inherits BaseTemplate

    Public MustOverride WriteOnly Property Name As String
    Public MustOverride WriteOnly Property OrderTotal As Decimal
    Public MustOverride WriteOnly Property OrderDescription As String
  End Class
End Namespace

ASCX हैडर:

<%@ Control Language="VB" ClassName="_Header" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional //EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<!--
  See https://www.campaignmonitor.com/blog/post/3317/ for discussion of DocType in HTML Email
-->

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title></title>
  <asp:PlaceHolder ID="plcStyler" runat="server"></asp:PlaceHolder>
</head>
<body>

ASCX पाद:

<%@ Control Language="VB" ClassName="_Footer" %>

</body>
</html>

ASCX टेम्पलेट:

<%@ Control Language="VB" AutoEventWireup="false" CodeFile="PurchaseReceipt.ascx.vb" Inherits="PurchaseReceipt" %>

<%@ Register Src="_Header.ascx" TagName="Header" TagPrefix="uc" %>
<%@ Register Src="_Footer.ascx" TagName="Footer" TagPrefix="uc" %>

<uc:Header ID="ctlHeader" runat="server" />

  <p>Name: <asp:Label ID="lblName" runat="server"></asp:Label></p>
  <p>Order Total: <asp:Label ID="lblOrderTotal" runat="server"></asp:Label></p>
  <p>Order Description: <asp:Label ID="lblOrderDescription" runat="server"></asp:Label></p>

<uc:Footer ID="ctlFooter" runat="server" />

ASCX टेम्पलेट कोड:

Partial Class PurchaseReceipt
  Inherits MailTemplates.PurchaseReceipt

  Public Overrides WriteOnly Property Name As String
    Set(Value As String)
      lblName.Text = Value
    End Set
  End Property



  Public Overrides WriteOnly Property OrderTotal As Decimal
    Set(Value As Boolean)
      lblOrderTotal.Text = Value
    End Set
  End Property



  Public Overrides WriteOnly Property OrderDescription As Decimal
    Set(Value As Boolean)
      lblOrderDescription.Text = Value
    End Set
  End Property
End Class

सहायकों:

'
' FindNestedControl helpers based on tip by @andleer
' at http://stackoverflow.com/questions/619449/
'

Public Module Helpers
  <Extension>
  Public Function AllControls(Control As Control) As List(Of Control)
    Return Control.Controls.Flatten
  End Function



  <Extension>
  Public Function FindNestedControl(Control As Control, Id As String) As Control
    Return Control.Controls.Flatten(Function(C) C.ID = Id).SingleOrDefault
  End Function



  <Extension>
  Public Function FindNestedControl(Control As Control, Type As Type) As Control
    Return Control.Controls.Flatten(Function(C) C.GetType = Type).SingleOrDefault
  End Function



  <Extension>
  Public Function Flatten(Controls As ControlCollection) As List(Of Control)
    Flatten = New List(Of Control)

    Controls.Traverse(Sub(Control) Flatten.Add(Control))
  End Function


  <Extension>
  Public Function Flatten(Controls As ControlCollection, Predicate As Func(Of Control, Boolean)) As List(Of Control)
    Flatten = New List(Of Control)

    Controls.Traverse(Sub(Control)
                        If Predicate(Control) Then
                          Flatten.Add(Control)
                        End If
                      End Sub)
  End Function



  <Extension>
  Public Sub Traverse(Controls As ControlCollection, Action As Action(Of Control))
    Controls.Cast(Of Control).ToList.ForEach(Sub(Control As Control)
                                               Action(Control)

                                               If Control.HasControls Then
                                                 Control.Controls.Traverse(Action)
                                               End If
                                             End Sub)
  End Sub



  <Extension()>
  Public Function ToFormat(Template As String, ParamArray Values As Object()) As String
    Return String.Format(Template, Values)
  End Function



  <Extension()>
  Public Function ToHtml(Control As Control) As String
    Dim oSb As StringBuilder

    oSb = New StringBuilder

    Using oSw As New StringWriter(oSb)
      Using oTw As New HtmlTextWriter(oSw)
        Control.RenderControl(oTw)
        Return oSb.ToString
      End Using
    End Using
  End Function
End Module



Namespace Controls
  Public Class Styler
    Inherits LiteralControl

    Public Sub New(FileName As String)
      Dim _
        sFileName,
        sFilePath As String

      sFileName = Path.GetFileNameWithoutExtension(FileName)
      sFilePath = HttpContext.Current.Server.MapPath("~/Styles/{0}.css".ToFormat(sFileName))

      If File.Exists(sFilePath) Then
        Me.Text = "{0}<style type=""text/css"">{0}{1}</style>{0}".ToFormat(vbCrLf, File.ReadAllText(sFilePath))
      Else
        Me.Text = String.Empty
      End If
    End Sub
  End Class
End Namespace



Public Class Utils
  Public Shared Sub SendMail(Recipient As MailAddress, Subject As String, HtmlBody As String)
    Using oMessage As New MailMessage
      oMessage.To.Add(Recipient)
      oMessage.IsBodyHtml = True
      oMessage.Subject = Subject.Trim
      oMessage.Body = HtmlBody.Trim

      Using oClient As New SmtpClient
        oClient.Send(oMessage)
      End Using
    End Using
  End Sub
End Class

0

बस पुस्तकालय मैं मिश्रण में उपयोग कर रहा हूँ फेंक: https://github.com/lukencode/FluentEmail

यह रेजरलाइट का उपयोग करके ईमेल प्रदान करता है, ईमेल बनाने के लिए धाराप्रवाह शैली का उपयोग करता है, और बॉक्स से बाहर कई प्रेषकों का समर्थन करता है। यह ASP.NET DI के लिए एक्सटेंशन विधियों के साथ आता है। सादे पाठ और HTML समर्थन के साथ उपयोग करने के लिए सरल, थोड़ा सेटअप।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.