C # में HTML ईमेल बॉडी बनाना


114

निम्न करने के लिए स्ट्रिंगर का उपयोग करने की तुलना में C # में HTML ईमेल उत्पन्न करने का एक बेहतर तरीका है (System.Net.Mail के माध्यम से भेजने के लिए)।

string userName = "John Doe";
StringBuilder mailBody = new StringBuilder();
mailBody.AppendFormat("<h1>Heading Here</h1>");
mailBody.AppendFormat("Dear {0}," userName);
mailBody.AppendFormat("<br />");
mailBody.AppendFormat("<p>First part of the email body goes here</p>");

इत्यादि इत्यादि?


खैर, यह वास्तव में समाधान पर निर्भर करता है जैसा कि मैं इसे देखता हूं। मैंने उपयोगकर्ता-इनपुट को हथियाने और इसे अलग-अलग पेटेंट से स्वचालित रूप से प्रारूपित करने से सब कुछ किया है। Html मेल के साथ मैंने जो सबसे अच्छा समाधान किया है, वह वास्तव में xml + xslt स्वरूपण था क्योंकि हम मेल-अप के इनपुट को जानते थे।
साइबर

यह निर्भर करता है कि आपकी आवश्यकताएं कितनी जटिल हैं। मेरे पास एक बार एक एप्लिकेशन था जो एक HTML ईमेल में एक तालिका प्रदान करता था और मैंने HTML को रेंडर करने के लिए एक ASP.NET ग्रिडड्यूव का उपयोग किया था - तालिका उत्पन्न करने के लिए स्ट्रैटनिंग स्ट्रिंग्स गन्दा होता था।
रिचर्डॉड

जवाबों:


181

आप MailDefinition वर्ग का उपयोग कर सकते हैं ।

आप इसका उपयोग कैसे करते हैं:

MailDefinition md = new MailDefinition();
md.From = "test@domain.com";
md.IsBodyHtml = true;
md.Subject = "Test of MailDefinition";

ListDictionary replacements = new ListDictionary();
replacements.Add("{name}", "Martin");
replacements.Add("{country}", "Denmark");

string body = "<div>Hello {name} You're from {country}.</div>";

MailMessage msg = md.CreateMailMessage("you@anywhere.com", replacements, body, new System.Web.UI.Control());

इसके अलावा, मैंने एक ब्लॉग पोस्ट लिखा है कि कैसे MailDefinition क्लास का उपयोग करके टेम्पलेट का उपयोग करके C # में HTML ई-मेल बॉडी जेनरेट किया जाए


11
मुझे यह भी पता नहीं था कि यह मौजूद है, सरासर प्रतिभाशाली है ... +1 और स्वीकृत
Rob

5
+1। अच्छा है, हालांकि सीमित है, शायद कई उपयोगों को शामिल करता है। यदि आप प्रोग्रामेटिक रूप से HTML और / या लूप के उन आइटम्स को सेट करना चाहते हैं जो रेंडरिंग की आवश्यकता है, तो यह इतना उपयोगी नहीं है।
एंथनीवजोन

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

4
क्योंकि, से, cc, और bcc क्षेत्रों को निर्दिष्ट करने के लिए सीमित विकल्पों के कारण मैं MailDefinition वर्ग का उपयोग करने में असहज था। यह वेब UI नियंत्रण के लिए एक नाम स्थान पर भी निर्भर करता है - जो मेरे लिए कोई मतलब नहीं है। मेरा जवाब नीचे देखें ...
सेठ

+1 के रूप में मुझे नहीं पता था कि यह वर्ग अस्तित्व में है, हालांकि अंतर्निहित कार्यान्वयन केवल प्रतिस्थापन सूची पर निर्भर है और Regex.Replace(body, pattern, replacement, RegexOptions.IgnoreCase);प्रत्येक कुंजी / मान जोड़ी के लिए चल रहा है ... उस विवरण के प्रकाश में, यह वर्ग उतना मूल्य प्रदान नहीं करता है जितना ऊपर उपयोग किया गया है जब तक कि किसी मौजूदा संदर्भ के साथ काम न किया जाए System.Web.UI.Controls
क्रिस बैक्सटर

27

System.Web.UI.tmlTextWriter वर्ग का उपयोग करें।

StringWriter writer = new StringWriter();
HtmlTextWriter html = new HtmlTextWriter(writer);

html.RenderBeginTag(HtmlTextWriterTag.H1);
html.WriteEncodedText("Heading Here");
html.RenderEndTag();
html.WriteEncodedText(String.Format("Dear {0}", userName));
html.WriteBreak();
html.RenderBeginTag(HtmlTextWriterTag.P);
html.WriteEncodedText("First part of the email body goes here");
html.RenderEndTag();
html.Flush();

string htmlString = writer.ToString();

व्यापक HTML के लिए जिसमें स्टाइल विशेषताओं का निर्माण शामिल है HtmlTextWriter शायद जाने का सबसे अच्छा तरीका है। हालाँकि यह उपयोग करने के लिए थोड़ा क्लिंक हो सकता है और मार्कअप जैसे कुछ डेवलपर्स को आसानी से पढ़ा जा सकता है, लेकिन संबंध इंडेंटेशन के साथ व्यापक रूप से HtmlTextWriter की पसंद थोड़ी अजीब है।

इस उदाहरण में आप XmlTextWriter का भी प्रभावी ढंग से उपयोग कर सकते हैं: -

writer = new StringWriter();
XmlTextWriter xml = new XmlTextWriter(writer);
xml.Formatting = Formatting.Indented;
xml.WriteElementString("h1", "Heading Here");
xml.WriteString(String.Format("Dear {0}", userName));
xml.WriteStartElement("br");
xml.WriteEndElement();
xml.WriteElementString("p", "First part of the email body goes here");
xml.Flush();

2
यह सुपर प्राचीन है
डैनियल

1
यह मेरे लिए सबसे अच्छा जवाब था। सरल और बिंदु तक (हालांकि माना जाता है कि बहुत ही स्पष्ट है)। MailDefinition निफ्टी था, लेकिन वह नहीं था जिसकी मुझे तलाश थी।
इहलिक्स

नमस्ते, उदाहरण के लिए कोई इनलाइन स्टाइल कैसे जोड़ेगा h1?
ईज़ी

जब ईमेल पॉप अप खोला गया था, तो शरीर, iam मेरे संदर्भ में div टैग का उपयोग करके इसे <25> के रूप में प्रदान कर रहा था। u कृपया अंतिम चरण के साथ मदद करें कि एक उचित प्रतिपादन कैसे करें
स्पष्टीकरण

17

अपडेट किया गया उत्तर :

SmtpClientइस उत्तर में प्रयुक्त वर्ग, के लिए दस्तावेज़ीकरण , अब पढ़ता है, 'अप्रचलित ("SmtpClient और इसके प्रकार के नेटवर्क खराब रूप से डिज़ाइन किए गए हैं, हम दृढ़ता से आपको https://github.com/jstedfast/MailKit और https: github का उपयोग करने की सलाह देते हैं। .com / jstedfast / MimeKit के बजाय ") '।

स्रोत: https://www.infoq.com/news/2017/04/MailKit-MimeKit-Official

मूल उत्तर :

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

नीचे प्रस्तुत दृष्टिकोण MSDN प्रलेखन और कोडप्रोजेक्ट.कॉम पर कुरैशी की पोस्ट पर आधारित है ।

नोट: यह उदाहरण एम्बेडेड संसाधनों से HTML फ़ाइल, चित्र और अनुलग्नक को निकालता है, लेकिन इन तत्वों के लिए धाराएँ प्राप्त करने के लिए अन्य विकल्पों का उपयोग करना ठीक है, जैसे कि हार्ड-कोडिंग स्ट्रिंग्स, स्थानीय फ़ाइलें, और इसी तरह।

Stream htmlStream = null;
Stream imageStream = null;
Stream fileStream = null;
try
{
    // Create the message.
    var from = new MailAddress(FROM_EMAIL, FROM_NAME);
    var to = new MailAddress(TO_EMAIL, TO_NAME);
    var msg = new MailMessage(from, to);
    msg.Subject = SUBJECT;
    msg.SubjectEncoding = Encoding.UTF8;
 
    // Get the HTML from an embedded resource.
    var assembly = Assembly.GetExecutingAssembly();
    htmlStream = assembly.GetManifestResourceStream(HTML_RESOURCE_PATH);
 
    // Perform replacements on the HTML file (if you're using it as a template).
    var reader = new StreamReader(htmlStream);
    var body = reader
        .ReadToEnd()
        .Replace("%TEMPLATE_TOKEN1%", TOKEN1_VALUE)
        .Replace("%TEMPLATE_TOKEN2%", TOKEN2_VALUE); // and so on...
 
    // Create an alternate view and add it to the email.
    var altView = AlternateView.CreateAlternateViewFromString(body, null, MediaTypeNames.Text.Html);
    msg.AlternateViews.Add(altView);
 
    // Get the image from an embedded resource. The <img> tag in the HTML is:
    //     <img src="pid:IMAGE.PNG">
    imageStream = assembly.GetManifestResourceStream(IMAGE_RESOURCE_PATH);
    var linkedImage = new LinkedResource(imageStream, "image/png");
    linkedImage.ContentId = "IMAGE.PNG";
    altView.LinkedResources.Add(linkedImage);
 
    // Get the attachment from an embedded resource.
    fileStream = assembly.GetManifestResourceStream(FILE_RESOURCE_PATH);
    var file = new Attachment(fileStream, MediaTypeNames.Application.Pdf);
    file.Name = "FILE.PDF";
    msg.Attachments.Add(file);
 
    // Send the email
    var client = new SmtpClient(...);
    client.Credentials = new NetworkCredential(...);
    client.Send(msg);
}
finally
{
    if (fileStream != null) fileStream.Dispose();
    if (imageStream != null) imageStream.Dispose();
    if (htmlStream != null) htmlStream.Dispose();
}

9
कृपया एक उत्तर पोस्ट न करें जो अनिवार्य रूप से आपके ब्लॉग पोस्ट का लिंक है। यदि / जब आपका ब्लॉग गायब हो जाता है, तो यहां आपका उत्तर बहुत बेकार हो जाता है। पोस्ट के "कुंजी" भागों को अपने उत्तर में यहाँ शामिल करने पर विचार करें।
रोब

1
यहां ब्लॉग लेख की सामग्री को ले जाया गया। धन्यवाद, @Rob
सेठ

1
FWIW इस कोड का परीक्षण किया गया है और इसका उपयोग उत्पादन एप्लिकेशन में किया जा रहा है।
सेठ

1
यह थोड़ा भ्रमित करने वाला है, क्योंकि कुछ अन्य पुस्तकालयों में, HTML को अनुलग्नक के रूप में भेजा जाता है। मेरा सुझाव है कि इसे साफ करने के लिए इस नमूने से पीडीएफ अटैचमेंट हिस्से को हटा दें। इसके अलावा, msg.Body इस नमूना कोड में कभी सेट नहीं किया गया है, मुझे लगता है कि इसे बॉडी वेरिएबल सौंपा जाना चाहिए?
गुडलुगुर एगल्सन

1
एक महत्वपूर्ण चरण गायब है, जो msg.IsBodyHtml = true को सेट कर रहा है। इस उत्तर को यहां देखें: stackoverflow.com/questions/7873155/…
गुडालुगुर एगिल्सन

6

मैं इस कार्य के लिए dotLiquid का उपयोग करता हूं

यह एक टेम्पलेट लेता है, और एक अनाम वस्तु की सामग्री के साथ विशेष पहचानकर्ताओं को भरता है।

//define template
String templateSource = "<h1>{{Heading}}</h1>Dear {{UserName}},<br/><p>First part of the email body goes here");
Template bodyTemplate = Template.Parse(templateSource); // Parses and compiles the template source

//Create DTO for the renderer
var bodyDto = new {
    Heading = "Heading Here",
    UserName = userName
};
String bodyText = bodyTemplate.Render(Hash.FromAnonymousObject(bodyDto));

यह संग्रह के साथ भी काम करता है, कुछ ऑनलाइन उदाहरण देखें ।


क्या TemplateSource एक .html फ़ाइल हो सकती है? या बेहतर अभी तक एक .cshtml रेजर फ़ाइल?
ozzy432836

1
@Ozzy यह वास्तव में किसी भी (पाठ) फ़ाइल हो सकती है। DotLiquid भी टेम्पलेट सिंटैक्स को बदलने की अनुमति देता है यदि यह आपकी टेम्पलेट फ़ाइल के साथ हस्तक्षेप करता है।
मार्सेल

5

मैं किसी प्रकार के टेम्प्लेट का उपयोग करके पुनः प्राप्त करूंगा। इसे अप्रोच करने के लिए कई अलग-अलग तरीके हैं लेकिन अनिवार्य रूप से ईमेल का एक टेम्प्लेट पकड़ें जहां कुछ (डिस्क पर, डेटाबेस आदि में) और बस मुख्य डेटा (IE: प्राप्तकर्ता नाम आदि) को टेम्प्लेट में डालें।

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


सहमत, सभी जवाब बहुत अलग तरीकों का उपयोग कर एक ही बात करते हैं। String.Format आप सभी की जरूरत है और आप इनमें से किसी का उपयोग कर सकते हैं अपने खुद के टेम्पलेट बना।
user1040975 19

4

MailDefinition के विकल्प के रूप में, RazorEngine https://github.com/Antaris/RazbEngine पर एक नज़र डालें ।

यह एक बेहतर समाधान की तरह दिखता है।

इसके लिए जिम्मेदार ...

ईमेल wth ईमेल टेम्प्लेट कैसे भेजें c #

उदाहरण के लिए

using RazorEngine;
using RazorEngine.Templating;
using System;

namespace RazorEngineTest
{
    class Program
    {
        static void Main(string[] args)
        {
    string template =
    @"<h1>Heading Here</h1>
Dear @Model.UserName,
<br />
<p>First part of the email body goes here</p>";

    const string templateKey = "tpl";

    // Better to compile once
    Engine.Razor.AddTemplate(templateKey, template);
    Engine.Razor.Compile(templateKey);

    // Run is quicker than compile and run
    string output = Engine.Razor.Run(
        templateKey, 
        model: new
        {
            UserName = "Fred"
        });

    Console.WriteLine(output);
        }
    }
}

कौन सा आउटपुट ...

<h1>Heading Here</h1>
Dear Fred,
<br />
<p>First part of the email body goes here</p>

यहाँ शीर्षक

प्रिय फ्रेड,

ईमेल बॉडी का पहला भाग यहाँ जाता है


यह सबसे अधिक विकल्प देगा जब छोरों और ifs की आवश्यकता हो
CMS

3

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

इसके अलावा आप html नियंत्रण (System.Web.UI.tmlControls) का उपयोग करना शुरू कर सकते हैं और उन्हें प्रस्तुत कर सकते हैं, इस तरह से आप कभी-कभी उन्हें विरासत में ले सकते हैं और जटिल सशर्त लेआउट के लिए अपना खुद का क्लैस बना सकते हैं।


1

हो सकता है कि आप इस समय मौजूद कुछ टेम्प्लेट रूपरेखाओं पर एक नज़र डालना चाहें। उनमें से कुछ एमवीसी के परिणामस्वरूप स्पिन ऑफ हैं लेकिन इसकी आवश्यकता नहीं है। स्पार्क एक अच्छा है।


सिर्फ एक FYI करें - आपके उत्तर में यूआरएल संदर्भ अब प्रासंगिक नहीं है; एक समाचार वेबसाइट की ओर जाता है।
जियोवानी मार्टिनेज

1

यदि आप पूर्ण .NET फ्रेमवर्क पर निर्भरता नहीं चाहते हैं, तो एक पुस्तकालय भी है जो आपके कोड की तरह दिखता है:

string userName = "John Doe";

var mailBody = new HTML {
    new H(1) {
        "Heading Here"
    },
    new P {
        string.Format("Dear {0},", userName),
        new Br()
    },
    new P {
        "First part of the email body goes here"
    }
};

string htmlString = mailBody.Render();

यह खुला स्रोत है, आप इसे http://sourceforge.net/projects/htmlplusplus/ से डाउनलोड कर सकते हैं

डिस्क्लेमर: मैं इस लाइब्रेरी का लेखक हूं, यह उसी मुद्दे को हल करने के लिए लिखा गया था - एक आवेदन से एक HTML ईमेल भेजें।


1

एक व्यावसायिक संस्करण जो मैं उत्पादन में उपयोग करता हूं और आसान रखरखाव के लिए अनुमति देता है लिमलैब्स टेम्प्लेट इंजन , इसे 3+ वर्षों से उपयोग कर रहा है और मुझे कोड (अपडेट, लिंक आदि) को अपडेट किए बिना पाठ टेम्पलेट में परिवर्तन करने की अनुमति देता है -) के रूप में सरल हो सकता है

Contact templateData = ...; 
string html = Template
     .FromFile("template.txt")
     .DataFrom(templateData )
     .Render();

जैसा कि मैंने किया था, एक नज़र डालते हुए; यहाँ वर्णित विभिन्न उत्तरों का प्रयास करने के बाद।

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