সি # তে এইচটিএমএল ইমেল বডি তৈরি করা হচ্ছে


114

স্ট্রিংবিল্ডারকে নিম্নলিখিত কাজগুলি করার চেয়ে সি # তে (সিস্টেম. নেট.মাইলের মাধ্যমে প্রেরণের জন্য) এইচটিএমএল ইমেল উত্পন্ন করার আরও ভাল উপায় আছে কি:

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

এবং তাই এবং তাই ঘোষণা?


ঠিক আছে, আমি এটি দেখছি হিসাবে এটি সত্যিই সমাধানের উপর নির্ভর করে। আমি ব্যবহারকারী-ইনপুটটি ধরার এবং এটি বিভিন্ন প্যাটার্স থেকে স্বয়ংক্রিয়ভাবে ফর্ম্যাট করা থেকে সমস্ত কিছু করেছি। এইচটিএমএল মেলগুলির সাথে আমি যে সেরা সমাধানটি করেছি তা হ'ল এক্সএমএল + এক্সস্ল্যাট ফর্ম্যাটিং ছিল যেহেতু আমরা আপ-ফ্রন্টের মেলটির ইনপুট জানতাম।

এটি আপনার প্রয়োজনীয়তা কতটা জটিল তা নির্ভর করে। আমি একবার একটি অ্যাপ্লিকেশন পেয়েছিলাম যা এইচটিএমএল ইমেলটিতে একটি টেবিল রেন্ডার করে এবং আমি একটি টেবিল তৈরির জন্য এইচটিএমএল-সংযুক্তকরণের স্ট্রিংগুলিকে রেন্ডার করতে একটি এএসপি.নেট গ্রিডভিউ ব্যবহার করতাম অগোছালো।
রিচার্ডড

উত্তর:


181

আপনি মেইলডিফিনিশন ক্লাস ব্যবহার করতে পারেন ।

আপনি এটি এভাবে ব্যবহার করেন:

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

এছাড়াও, আমি মেলডিফাইনিশন ক্লাসটি ব্যবহার করে টেমপ্লেটগুলি ব্যবহার করে কীভাবে সি # তে এইচটিএমএল ই-মেইল বডি তৈরি করতে পারি সে সম্পর্কে একটি ব্লগ পোস্ট লিখেছি ।


11
আমি এটিকেও জানতাম না, নিছক প্রতিভা এটি ... +1 এবং স্বীকৃত
রব

5
+1 টি। দুর্দান্ত, যদিও সীমাবদ্ধ, সম্ভবত অনেকগুলি ব্যবহার কভার করে। আপনি যদি HTML এবং / অথবা লুপের আইটেমগুলির একটি সেটের মাধ্যমে রেন্ডারিংয়ের প্রয়োজন হয় সেগুলি বিভাগের সাথে প্রোগ্রামগতভাবে অন্তর্ভুক্ত করতে চান তবে তেমন দরকারী নয়।
অ্যান্থনিডব্লু জোনস 20:25

আমি সম্প্রতি এটি সম্পর্কে সচেতন হয়েছি। এটা দুর্দান্ত। আমি অনুমান করি এটি আপনাকে বলেছে যে কোনও সমস্যায় নিজেকে লেখার আগে এমএসডিএন ডকুমেন্টেশনটি দেখার পক্ষে কতটা গুরুত্বপূর্ণ। আমি আমার নিজের ক্লাসটি লিখেছিলাম, এটি প্রায় মেইলডিফিনিশনের মতোই করেছিল। আমার পক্ষে খুব খারাপ সময়ের অপচয়।
মার্টিনহান

4
থেকে, সিসি এবং সিসি এবং সিসি ক্ষেত্রগুলি নির্দিষ্ট করার জন্য সীমাবদ্ধ বিকল্পগুলির কারণে আমি মেইল ​​ডেফিনিশন ক্লাসটি ব্যবহার করে অস্বস্তি বোধ করেছি। এটি ওয়েব ইউআই নিয়ন্ত্রণগুলির জন্য একটি নেমস্পেসের উপরও নির্ভর করে - এটি আমার কাছে বোধগম্য নয়। আমার উত্তর নীচে দেখুন ...
শেঠ

আমি জানি না যে এই শ্রেণীর অস্তিত্ব ছিল, যদিও অন্তর্নিহিত বাস্তবায়ন কেবল প্রতিস্থাপনের তালিকার উপরে পুনরাবৃত্তি করছে Regex.Replace(body, pattern, replacement, RegexOptions.IgnoreCase);এবং প্রতিটি কী / মান জোড়ার জন্য চলছে ... সেই আলোকে আলোকে এই শ্রেণিটি উপরে ব্যবহৃত হিসাবে তেমন মান সরবরাহ করে না একটি বিদ্যমান রেফারেন্স সঙ্গে কাজ না করে System.Web.UI.Controls
ক্রিস বাক্সার

27

System.Web.UI.HtmlTextWriter ক্লাসটি ব্যবহার করুন।

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

বিস্তৃত এইচটিএমএল এর জন্য শৈলীর বৈশিষ্ট্য তৈরি করার অন্তর্ভুক্ত এইচটিএমএল টেক্সট রাইটার সম্ভবত সেরা উপায়। তবে এটি ব্যবহার করা কিছুটা জটিল হয়ে উঠতে পারে এবং মার্কআপের মতো কিছু বিকাশকারী সহজেই পড়তে পারে তবে ইন্ডেন্টেশন সম্পর্কিত বিপর্যস্ত এইচটিএমএল টেক্সট রাইটারের পছন্দগুলি কিছুটা জঘন্য।

এই উদাহরণে আপনি 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
এটি আমার পক্ষে সেরা উত্তর ছিল। সহজ এবং বিন্দু (যদিও স্বীকার করা বেশ চতুর)। মেল ডেফিনিশন নিফটি ছিল, তবে আমি যা খুঁজছিলাম তা নয়।
thehelix

হাই, উদাহরণের জন্য কেউ কীভাবে ইনলাইন স্টাইলিং যুক্ত করবে h1?
ইজজি

ইমেলটি পপ আপ খুললে, বডি, আইএম আমার প্রসঙ্গে ডিভ ট্যাগ ব্যবহার করে <25> হিসাবে রেন্ডার করছিল। আপনি দয়া করে যথাযথ রেন্ডারিং কীভাবে শেষ পদক্ষেপে সহায়তা করতে পারেন
স্পষ্টকরণ

17

আপডেট উত্তর :

SmtpClientএই উত্তরের জন্য ব্যবহৃত ক্লাসটির জন্য ডকুমেন্টেশন , এখন পড়েছে, 'অপ্রচলিত ("শ্রীমতিপ্লেটিয়েন্ট এবং এর ধরণের নেটওয়ার্কগুলি খারাপভাবে ডিজাইন করা হয়েছে, আমরা আপনাকে দৃ strongly ়ভাবে https://github.com/jstedfast/MailKit এবং https: // github ব্যবহার করার পরামর্শ দিচ্ছি) .com / jsted ব্রেকফাস্ট / মাইমকিট পরিবর্তে ") '।

সূত্র: https://www.infoq.com/news/2017/04/MailKit-MimeKit- অফিসিয়াল

আসল উত্তর :

মেলডিফিনিশন ক্লাস ব্যবহার করা ভুল পদ্ধতি। হ্যাঁ, এটি সুবিধাজনক, তবে এটি আদিম এবং ওয়েব ইউআই নিয়ন্ত্রণের উপর নির্ভর করে - এটি সাধারণত কোনও সার্ভার-সাইড টাস্ক এমন কোনও কিছুর জন্য অর্থবোধ করে না।

নীচে উপস্থাপিত পদ্ধতিটি এমএসডিএন ডকুমেন্টেশন এবং কোডপ্রজেক্ট ডটকমের কুরেশির পোস্টের ভিত্তিতে তৈরি

দ্রষ্টব্য: এই উদাহরণটি এম্বেড থাকা সংস্থানগুলি থেকে এইচটিএমএল ফাইল, চিত্র এবং সংযুক্তিগুলি বের করে, তবে এই উপাদানগুলির স্ট্রিম পেতে অন্যান্য বিকল্পগুলি ব্যবহার করা ভাল, যেমন হার্ড-কোডিং স্ট্রিং, স্থানীয় ফাইল এবং।

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
এখানে ব্লগ নিবন্ধ সামগ্রী সরানো হয়েছে। ধন্যবাদ, রব
শেঠ

1
FWIW এই কোডটি পরীক্ষা করা হয়েছে এবং একটি উত্পাদন অ্যাপ্লিকেশনটিতে ব্যবহৃত হচ্ছে।
শেঠ

1
এটি কিছুটা বিভ্রান্তিকর, যেহেতু অন্য কয়েকটি লাইব্রেরিতে এইচটিএমএল সংযুক্তি হিসাবে প্রেরণ করা হয়। আমি আরও স্পষ্ট করার জন্য এই নমুনা থেকে পিডিএফ সংযুক্তি অংশটি সরিয়ে দেওয়ার পরামর্শ দিচ্ছি। তদুপরি, msg.Body কখনও এই নমুনা কোডে সেট করা হয় না, আমি ধরে নিই যে এটি বডি ভেরিয়েবল বরাদ্দ করা উচিত?
গুদলাউগুর এগিলসন

1
একটি মূল পদক্ষেপ অনুপস্থিত, যা সেটিংটি ঠিক আছে .আইএসবিডিএইচটিএমএল = সত্য। : এখানে এই উত্তর দেখুন stackoverflow.com/questions/7873155/...
Gudlaugur Egilsson

6

আমি ঠিক এই কাজের জন্য ডটলিকুইড ব্যবহার করি

এটি একটি টেমপ্লেট নেয় এবং একটি বেনামি বস্তুর সামগ্রীতে বিশেষ শনাক্তকারীদের পূরণ করে।

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

এটি সংগ্রহগুলির সাথেও কাজ করে, কয়েকটি অনলাইন উদাহরণ দেখুন


টেমপ্লেটসোর্স একটি html ফাইল হতে পারে? বা আরও ভাল একটি .cshtml রেজার ফাইল?
ozzy432836

1
@ ওজি এটি আসলে যে কোনও (পাঠ্য) ফাইল হতে পারে। এমনকি ডটলিকুইড আপনার টেম্পলেট ফাইলটিতে হস্তক্ষেপের ক্ষেত্রে টেমপ্লেট সিনট্যাক্স পরিবর্তন করার অনুমতি দেয়।
মার্সেল

5

আমি কোনও ধরণের টেমপ্লেট ব্যবহার করে পুনরুদ্ধার করব। এটির কাছে বিভিন্ন উপায় আছে তবে মূলত ইমেলের একটি টেমপ্লেটটি কিছু অংশে রাখা (যেখানে ডিস্কে, একটি ডাটাবেস ইত্যাদিতে) থাকে এবং কেবলমাত্র কী ডেটা (IE: প্রাপকদের নাম ইত্যাদি) টেমপ্লেটে সন্নিবেশ করান।

এটি অনেক বেশি নমনীয় কারণ এর অর্থ আপনি নিজের কোডটি পরিবর্তন না করেই প্রয়োজনীয় টেম্পলেটটি পরিবর্তন করতে পারেন। আমার অভিজ্ঞতায় আপনার শেষ ব্যবহারকারীদের কাছ থেকে টেমপ্লেটগুলির পরিবর্তনের জন্য অনুরোধ পাবেন। আপনি যদি পুরো হোগ করতে চান তবে আপনি কোনও টেম্পলেট সম্পাদক অন্তর্ভুক্ত করতে পারেন।


সম্মত, সমস্ত উত্তর বিভিন্ন পদ্ধতি ব্যবহার করে একই কাজ করে। স্ট্রিং.ফর্ম্যাট আপনার যা প্রয়োজন তা হ'ল আপনি এগুলির যে কোনও একটিতে নিজের টেম্পলেট তৈরি করতে পারবেন।
ব্যবহারকারী 1040975

4

মেল ডেফিনিশনের বিকল্প হিসাবে, রেজারইঙ্গিন https://github.com/Antaris/RazorEngine এ দেখুন ।

এটি আরও ভাল সমাধানের মতো দেখায়।

এতে যুক্ত ...

কিভাবে ইমেইল wth ইমেল টেমপ্লেট সি পাঠাতে

যেমন

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>

এখানে শিরোনাম

প্রিয় ফ্রেড,

ইমেল শরীরের প্রথম অংশটি এখানে যায়


লুপ এবং আইএফএসের প্রয়োজন হলে এটি সর্বাধিক বিকল্পটি দেবে
সিএমএস

3

মার্কআপ খুব জটিল না হওয়ায় হ্যান্ড বিল্ট এইচটিএমএলকে এর থেকে নির্গত করা সম্ভবত সবচেয়ে ভাল উপায়। স্ট্রিংবিল্ডার আপনাকে প্রায় তিনটি কনটেমেটেশনের পরে দক্ষতার দিক দিয়ে কেবল আপনাকে অর্থ প্রদান করতে শুরু করে, সুতরাং সত্যিকারের সরল স্টাফের জন্য স্ট্রিং + স্ট্রিং তা করবে।

এর বাইরে আপনি এইচটিএমএল নিয়ন্ত্রণগুলি (System.Web.UI.HtmlControls) ব্যবহার করতে এবং তাদের রেন্ডার করতে পারেন, এইভাবে আপনি কখনও কখনও তাদের উত্তরাধিকারী হয়ে উঠতে পারেন এবং জটিল শর্তযুক্ত বিন্যাসের জন্য আপনার নিজস্ব অনুচ্ছেদ তৈরি করতে পারেন।


1

এই মুহুর্তে উপলভ্য কয়েকটি টেম্পলেট ফ্রেমওয়ার্কগুলির জন্য আপনি একবার দেখতে চান। তাদের মধ্যে কিছু এমভিসির ফলাফল হিসাবে স্পিন অফ রয়েছে তবে এটির প্রয়োজন নেই। স্পার্ক একটি ভাল।


কেবলমাত্র একটি এফওয়াইআই - আপনার উত্তরটিতে url উল্লেখ এখন প্রাসঙ্গিক নয়; একটি নিউজ ওয়েবসাইটের দিকে নিয়ে যায়।
জিওভানি মার্টিনেজ

1

আপনি যদি পুরো নেট নেট ফ্রেমওয়ার্কের উপর নির্ভরতা না চান, এমন একটি লাইব্রেরি রয়েছে যা আপনার কোডটিকে দেখতে এমন করে তোলে:

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/ থেকে ডাউনলোড করতে পারেন

দাবি অস্বীকার: আমি এই গ্রন্থাগারের লেখক, ঠিক একই সমস্যাটি সমাধান করার জন্য এটি লেখা হয়েছিল - কোনও অ্যাপ্লিকেশন থেকে এইচটিএমএল ইমেল প্রেরণ করুন।


1

একটি বাণিজ্যিক সংস্করণ যা আমি উত্পাদনে ব্যবহার করি এবং সহজে রক্ষণাবেক্ষণের অনুমতি দিই তা হ'ল লিমিলেবস টেম্পলেট ইঞ্জিন , এটি 3+ বছর ধরে ব্যবহার করে আসছে এবং কোড (অস্বীকৃতি, লিঙ্কগুলি ইত্যাদি) আপডেট না করেই আমাকে টেক্সট টেমপ্লেটে পরিবর্তন করার অনুমতি দেয় - এটি হিসাবে সহজ হতে পারে

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

আমি যেমন দেখেছি তেমন এক নজরে মূল্যবান; এখানে উল্লেখ করা বিভিন্ন উত্তর চেষ্টা করার পরে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.