আমি কি এএসপি.এনইটি দিয়ে এইচটিএমএল / ইমেল টেম্পলেট সেট আপ করতে পারি?


97

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

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

কোনও .ASPXপৃষ্ঠা কোনওভাবে টেমপ্লেট হিসাবে ব্যবহার করার জন্য কী আদর্শ হবে , তবে কেবল সেই পৃষ্ঠাটি পরিবেশন করতে আমার কোডটি বলুন এবং ইমেলের জন্য ফিরে আসা HTML ব্যবহার করুন।

এটি করার একটি দুর্দান্ত এবং সহজ উপায় আছে? এই সমস্যা সমাধানের জন্য আরও ভাল উপায় আছে?

আপডেট হয়েছে:
আমি একটি উত্তর যুক্ত করেছি যা আপনাকে ইমেল টেমপ্লেট হিসাবে একটি স্ট্যান্ডার্ড .aspx পৃষ্ঠা ব্যবহার করতে সক্ষম করে। আপনার মত সমস্ত ভেরিয়েবলগুলি সাধারণত প্রতিস্থাপন করুন, ডাটাবেইন্ডিং ইত্যাদি ব্যবহার করুন, তারপরে কেবল পৃষ্ঠাটির আউটপুট ক্যাপচার করুন, এবং ভয়েলা! আপনি আপনার এইচটিএমএল ইমেল আছে!

ক্যাভেটের সাথে আপডেট হয়েছে !!!:
আমি কিছু এসপেক্স পৃষ্ঠায় মেলডিফিনিশন ক্লাসটি ব্যবহার করছিলাম ঠিক আছে, তবে সার্ভার প্রক্রিয়া চলাকালীন এই শ্রেণিটি ব্যবহার করার চেষ্টা করার সময় এটি ব্যর্থ হয়েছিল। আমি বিশ্বাস করি এটি ছিল কারণ মেল ডেফিনিশন.ক্রেইটমেলমেসেজ () পদ্ধতিতে রেফারেন্সের জন্য একটি বৈধ নিয়ন্ত্রণের প্রয়োজন, যদিও এটি সর্বদা কিছু না করে। এর কারণে, আমি একটি এসপেক্স পৃষ্ঠা ব্যবহার করে বা মুনের অ্যাএসসিএক্স পৃষ্ঠাটি ব্যবহার করার জন্য আমার পদ্ধতির সুপারিশ করব যা কিছুটা ভাল বলে মনে হচ্ছে।


আর একটি সমাধান হ'ল C # এবং কমলাং টেম্পলেট ভাষা ব্যবহার করে আপনার ইমেলগুলি তৈরি এবং প্রেরণের জন্য আলফামেইল ব্যবহার করা।
টিমোথি ই। জোহানসন

4
@JohnBubriski: নিয়ন্ত্রণ সমস্যা কাছাকাছি আমি কাজ আপনার উল্লেখ ব্যবহার "সতর্কীকরণ সঙ্গে আপডেট" new System.Web.UI.Control()হিসেবে: mailDefinition.CreateMailMessage("somebody@fake.com", iDictionaryReplacements, new System.Web.UI.Control())
থিওফিলাস

হ্যাঁ, আমি এটিও করেছি, তবে রেজার আবির্ভাবের কারণে এটি একটি ভাল ধারণা হয়ে উঠছে।
জন Bubriski

উত্তর:


73

ইতিমধ্যে এখানে এক টন উত্তর রয়েছে, তবে ইমেল টেম্প্লেটিং সহ রেজার কীভাবে ব্যবহার করতে হয় সে সম্পর্কে আমি দুর্দান্ত একটি নিবন্ধে হোঁচট খেয়েছি। রেজারকে এএসপি.নেট এমভিসি 3 দিয়ে ঠেলা দেওয়া হয়েছিল, তবে এমভিসি রেজার ব্যবহার করার প্রয়োজন নেই। এটি ইমেল টেমপ্লেটগুলি করার জন্য বেশ চতুর প্রসেসিং

যেমন নিবন্ধটি শনাক্ত করেছে, "রেজার সেরা জিনিসটি এটির পূর্বসূরীর (ওয়েবফর্মগুলি) এর বিপরীতে এটি ওয়েব পরিবেশের সাথে আবদ্ধ নয়, আমরা সহজেই এটি ওয়েবের বাইরে হোস্ট করতে পারি এবং এটি বিভিন্ন উদ্দেশ্যে টেমপ্লেট ইঞ্জিন হিসাবে ব্যবহার করতে পারি" "

রেজারইঙ্গাইন - এইচটিএমএল ইমেল তৈরির অংশ 01 - পরিচিতি

ASP.NET এর বাইরে রেজার টেম্পলেটগুলি উত্সাহিত করুন: এগুলি কেবলমাত্র এইচটিএমএল-এর জন্য নয়!

রেজারইঙ্গাইন সহ এএসপি.নেটে স্মার্ট ইমেল টেম্পলেটগুলি

অনুরূপ স্ট্যাকওভারফ্লো কিউএ

নতুন রেজারইঙ্গাইন এপিআই ব্যবহার করে টেম্প্লেটিং

এমভিসি ছাড়াই রেজার ব্যবহার করা

এএসপনেটের বাইরে রেজার ভিউ ইঞ্জিন ব্যবহার করা কি সম্ভব?


4
+1 তবে সাবধান হন যদি ব্যবহারকারীরা টেমপ্লেটগুলি সরবরাহ করে থাকে, কারণ তারা টেমপ্লেট থেকে সি # কোড চালাতে পারে, আপনার সিস্টেমে আপনাকে সম্ভবত যা চান তার চেয়ে বেশি শক্তি দেয়।
অ্যারোনএলএস

সুরক্ষা সম্পর্কে আপনি কী ভাবেন। এই টেম্প্লেটিং ইঞ্জিনটি ব্যবহার করে সম্ভবত পুরো ফাইল সিস্টেমটি ফর্ম্যাট করা সম্ভব হয়। আমি ইঞ্জিনটি পছন্দ করি তবে এটি অন্য ইঞ্জিনগুলির দিকে নজর দিতে বাধ্য করে।
der_chirurg

55

আপনি একটি নিয়ন্ত্রণ লোড করার চেষ্টা করতে পারেন, এবং তারপরে এটি একটি স্ট্রিংয়ে রেন্ডার করে এবং এইচটিএমএল বডি হিসাবে সেট করতে পারেন:

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

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


আমি কোনওভাবেই এই উত্তরটি প্রথমবারের মতো মিস করেছি ... সুন্দর একটি। আমার সমাধানের মতো, তবে একটি এসপেক্সের পরিবর্তে একটি এসেক্সের সাথে। আমি এখনও মনে করি এসপেক্স আরও ভাল হবে, যেহেতু এটি একটি নিয়ন্ত্রণের পরিবর্তে একটি সম্পূর্ণ পৃষ্ঠা সরবরাহ করবে, তবে আমি যা মনে করি তা ঠিক তাই।
জন বুব্রিসকি

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

গৌণ পয়েন্ট তবে আপনি প্রথম কোড ব্লকে একটি স্ট্রিংবিল্ডার ঘোষণার জন্য একটি লাইন মিস করছেন।
কির্চস্টেইন

9
কোডটি কোডটি কোথায় থাকে সেটির উদাহরণটি ব্যাখ্যা করে না, এটি একটি পৃষ্ঠা ?, কারণ লোডকন্ট্রোল একটি পৃষ্ঠা / নিয়ন্ত্রণ পদ্ধতি।
শেজ স্মিলোইটিজ

@ মুন, আপনি ইউজারকন্ট্রোলটিকে ctrl নামক একটি ভেরিয়েবলের মধ্যে লোড করেন এবং আপনি আপনার কোডটিতে এটি আর কখনও উল্লেখ করেন না। এটি কীভাবে কাজ করার কথা?
মাফিন ম্যান

35

আপনি মেইলডিফিনিশন ক্লাস চেষ্টা করতে পারেন


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

4
মেল ডেফিনিশন ক্লাসে টেম্পলেটেড কন্টেন্ট রেন্ডার করতে অবশ্যই একটি নিয়ন্ত্রণ পাওয়া উচিত .. এতটা ভাল নয়।
ইউকী

17

যদি আপনি ব্যবহারকারীর নাম, পণ্যের নাম, ইত্যাদি ইত্যাদি পরামিতিগুলি পাস করতে চান তবে আপনি ওপেন সোর্স টেম্পলেট ইঞ্জিন এনভেলোসিটি ব্যবহার করতে পারেন নিজের চূড়ান্ত ইমেল / এইচটিএমএল উত্পাদন ।

এনভেলোসিটি টেমপ্লেটের একটি উদাহরণ ( মেইলটেম্পলেট.ভিএম ):

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

আপনার অ্যাপ্লিকেশনটিতে মেইলটেম্পলেট.ভিএম দ্বারা মেল বডি তৈরি করা:

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

ফলাফল মেইল ​​বডি:

স্কারলেটগার্ডেনের একটি নমুনা ইমেল টেম্পলেট

পূর্বাচনের উদাহরণ:

[তারিখ: 12.02.2009] নাম: আইটেম 1, মান: 09

[তারিখ: 21.02.2009] নাম: আইটেম 4, মান: 52

[তারিখ: 01.03.2009] নাম: আইটেম 2, মান: 21

[তারিখ: 23.03.2009] নাম: আইটেম 6, মান: 24

টেম্পলেটগুলি সম্পাদনা করার জন্য, আপনি এফসিকেইডিটর ব্যবহার করতে পারেন এবং ফাইলগুলিতে আপনার টেম্পলেটগুলি সংরক্ষণ করতে পারেন ।


7

Mail.dll ইমেল উপাদান ইমেল টেম্পলেট ইঞ্জিন অন্তর্ভুক্ত:

এখানে সিনট্যাক্স ওভারভিউ:

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

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

</body>
</html>

এবং কোডটি টেমপ্লেট লোড করে, সি # অবজেক্ট থেকে ডেটা পূরণ করে এবং একটি ইমেল প্রেরণ করে:

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

আপনি ইমেল টেম্পলেট ইঞ্জিনে আরও তথ্য পেতে পারেন ব্লগ পোস্টে ।

অথবা কেবল মেল.ডিল ইমেইল উপাদানটি ডাউনলোড করুন এবং এটি ব্যবহার করে দেখুন।

দয়া করে মনে রাখবেন এটি আমার তৈরি একটি বাণিজ্যিক পণ্য।


6

নমনীয়তা যদি আপনার পূর্বশর্তগুলির মধ্যে একটি হয় তবে এক্সএসএলটি একটি ভাল পছন্দ হতে পারে, যা পুরোপুরি .NET ফ্রেমওয়ার্ক দ্বারা সমর্থিত এবং আপনি এমনকি ব্যবহারকারীদের সেই ফাইলগুলি সম্পাদনা করতে সক্ষম হবেন। এই নিবন্ধটি ( http://www.aspfree.com/c/a/XML/XSL-Transformations- using-ASP-NET / ) কার্যকর হতে পারে (এমএসডিএন এটি সম্পর্কে আরও তথ্য থাকতে পারে)। যেমন স্কারলেটগার্ডন বলেছে এনভেলোসিটি অন্য একটি ভাল পছন্দ তবে আমি এর "বিল্ট-ইন" এর জন্য এক্সএসএলটি পছন্দ করি না ET নেট ফ্রেমওয়ার্ক সমর্থন এবং প্ল্যাটফর্ম অজিনস্টিক।


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

উরগ, আমি এক্সএসএলটি সম্পর্কে স্বপ্ন দেখেছি। সম্ভবত আমি সবচেয়ে বেশি স্বজ্ঞাত প্রোগ্রামিং / মার্কআপ ল্যাঙ্গুয়েজ নিয়ে কাজ করেছি। আপনি নিজের এক্সএসএলটি কোড করার পরে 1 মাস পরে অন্যের জন্য এমনকি নিজের জন্য বজায় রাখা অসম্ভব।
পুসইনবুটস

5

আমি মনে করি আপনিও এরকম কিছু করতে পারেন:

ওএসপিএক্স পৃষ্ঠা তৈরি করুন এবং এটি অন্লোড পদ্ধতির শেষে রেখে দিন বা ম্যানুয়ালি কল করুন।

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

এটি নিয়ে কোনও সম্ভাব্য সমস্যা আছে কিনা তা সম্পর্কে আমি নিশ্চিত নই, তবে দেখে মনে হচ্ছে এটি কার্যকর হবে। এইভাবে, আপনি কেবলমাত্র পাঠ্য প্রতিস্থাপনকে সমর্থন করে এমন মেইল ​​ডেফিনিশন শ্রেণীর পরিবর্তে একটি সম্পূর্ণ বৈশিষ্ট্যযুক্ত .aspx পৃষ্ঠা ব্যবহার করতে পারেন।


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

দুর্দান্ত! এটি নিয়ে আপনার কোনও সমস্যা আছে?
জন বুবরিস্কি

সুতরাং আপনি যখন আপনার ব্যবহারকারীদের মেল টেমপ্লেটে পরিবর্তন করার প্রয়োজন হয় তখন .aspx ফাইলগুলি সম্পাদনা করতে চলেছেন? আমি এটিকে একটি সম্ভাব্য সমস্যা বলব।
ব্রায়ান

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

আমি জানি, এটি একটি সময় হয়েছে, কিন্তু আপনি কি আপনার চূড়ান্ত সমাধান মনে করেন? Pageকমপক্ষে রেন্ডারিংয়ের জন্য জেনেরিক এক্সটেনশন পদ্ধতি ব্যবহার করার সময় আমি এটির সাথে কাজ করার জন্য এই বিশেষ পদ্ধতিটি অর্জন করতে সক্ষম হইনি । এইভাবে আমি স্যুইচ করেছি UserControl; নীচে আমার উত্তর দেখুন। এখনও অবধি এটি ভালভাবে কাজ করছে বলে মনে হচ্ছে ... সেই সময়ে আপনি কীভাবে এটি কার্যকর করেছিলেন তা শিখতে আগ্রহী।
ইনটেক্সএক্স

4

অবশ্যই আপনি এইচটিএমএল টেমপ্লেট তৈরি করতে পারেন এবং আমি একটি পাঠ্য টেম্পলেটও সুপারিশ করব। টেমপ্লেটে আপনি যেখানে [দেহ] দেহটি স্থাপন করবেন ঠিক সেই স্থানে রাখতে পারেন এবং তারপরে আপনি কেবল টেমপ্লেটে পড়তে পারেন এবং নতুন সামগ্রী দিয়ে দেহটি প্রতিস্থাপন করতে পারেন। আপনি। নেট মেল ক্লাস ব্যবহার করে ইমেলটি প্রেরণ করতে পারেন। আপনি প্রাথমিকভাবে ইমেলটি তৈরি করার পরে আপনাকে সমস্ত প্রাপকদের ইমেল প্রেরণের মধ্য দিয়ে লুপ করতে হবে। আমার জন্য একটি কবজ মত কাজ।

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

আপনি স্ট্রিমরেডার স্টাফগুলি কেটে ফাইলের সাথে প্রতিস্থাপন করতে পারেন e রিডএলটেক্সট (পাথ)
জন শিহান

এটি একটি ভাল শুরু, তবে কেবল শিরোনাম এবং পাদচরণের জন্য কার্যকারিতা সরবরাহ করে। এটি সত্যই শরীরের সাথে নিজেকে সহায়তা করে না।
জন বুবরিস্কি

আপনাকে যা করতে হবে সেই দেহটি হ'ল এইচটিএমএলবিডি এবং টেক্সটবডি ক্ষেত্রগুলিতে পছন্দসই শরীরের সামগ্রী প্রবেশ করা বা আপনি অবশ্যই সেগুলি ফাইলে সংরক্ষণ করতে পারেন
জোশ মেইন

4

এখানে আরও একটি বিকল্প যা আরও জটিল ইমেল টেম্পলেটগুলির জন্য এক্সএসএল রূপান্তর ব্যবহার করে: নেট অ্যাপ্লিকেশনগুলি থেকে এইচটিএমএল-ভিত্তিক ইমেল প্রেরণ করা হচ্ছে


4
লিঙ্কটি লাইক করুন। ধন্যবাদ! আমার মস্তিষ্ক ঘুরিয়ে দেওয়া শুরু করেছে এবং বুঝতে পেরেছি যে আমি এটিকে আরও 1 ধাপ এগিয়ে নিয়ে যেতে পারি এবং একটি এক্সএসএলটি টেম্পলেট রয়েছে যা একটি এক্সএমএল সিরিয়ালাইজেবল অবজেক্ট, বা ডাব্লুসিএফ ডেটা চুক্তিটি এইচটিএমএল-ইমেল ফর্ম্যাটে ডান করে নেয়। হঠাৎ সত্যিকারের সিরিয়ালাইজযোগ্য ক্লাসগুলির মাধ্যমে আমার 'শক্ত-টাইপ' ইমেল টেম্পলেটগুলি ছিল!
কোডিংউইথস্পাইক

2

এটি করার সময় সতর্কতা অবলম্বন করুন, স্প্যাম ফিল্টারগুলি এএসপিএনটি জেনারেট এইচটিএমএলকে দৃশ্যতঃ ভিউস্টেটের কারণে আটকাচ্ছে বলে মনে হয়, তাই আপনি যদি এটি করতে যাচ্ছেন তবে নিশ্চিত হন যে উত্পাদিত এইচটিএমএল পরিষ্কার আছে।

আমি ব্যক্তিগতভাবে আপনার পছন্দসই ফলাফলগুলি অর্জন করতে Asp.net এমভিসি ব্যবহার করে দেখব। বা এনভেলোসিটি এটিতে বেশ ভাল


1

কোনওভাবে .ASPX পৃষ্ঠাটি কোনও টেমপ্লেট হিসাবে ব্যবহার করার জন্য কী আদর্শ হবে, তবে কেবল সেই পৃষ্ঠাটি পরিবেশন করতে আমার কোডটি বলুন এবং ইমেলের জন্য ফিরে আসা HTML ব্যবহার করুন।

আপনি সহজেই একটি এএসপিএক্স পৃষ্ঠাতে হিট করতে এবং ফলস্বরূপ এইচটিএমএল পাওয়ার জন্য কেবল একটি ওয়েবরিকিউস্ট তৈরি করতে পারেন। আরও কিছু কাজ করে, আপনি সম্ভবত ওয়েবরিকাস্ট ছাড়াই এটি সম্পন্ন করতে পারবেন। একটি পেজ পার্সার এবং একটি প্রতিক্রিয়া il ফিল্টার আপনাকে পৃষ্ঠাটি চালাতে এবং আউটপুট ক্যাপচার করতে দেয় ... যদিও আরও কিছু মার্জিত উপায় থাকতে পারে।


1

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

বিপুল সংখ্যক ইমেল প্রেরণের কারণে, পারফরম্যান্স প্রাথমিক উদ্বেগ ছিল।

আমরা কী নিয়ে এসেছি এসকিএল সার্ভারে স্থির সামগ্রী ছিল যেখানে আপনি সম্পূর্ণ এইচটিএমএল টেম্পলেট মার্ক আপ সংরক্ষণ করেন (স্থানধারীদের পাশাপাশি [ইউজারফার্সনেম], [ইউজারলাস্টনেম] যা রান সময়ে রিয়েল ডেটা দ্বারা প্রতিস্থাপন করা হয়) বিভিন্ন ধরণের ইমেলের জন্য

তারপরে আমরা এসপিএন ক্যাশে এই ডেটাটি লোড করেছি - সুতরাং আমরা এইচটিএমএল টেমপ্লেটগুলি বারবার পড়তে পারি না - তবে কেবল যখন সেগুলি আসলে পরিবর্তিত হয়

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

এবং তারপরে আমাদের ইমেল লগগুলির জন্য একটি পৃথক টেবিল ছিল - যেখানে পাঠানো প্রতিটি ইমেল লগড ছিল। এই টেবিলটির ইমেল টাইপ, ইমেল পাঠানো এবং নাম্বার অফফ্রিজ নামে ক্ষেত্র ছিল।

গুরুত্বপূর্ণ ইমেল প্রকারের জন্য আমরা প্রতি 5 মিনিটে কেবল একটি চাকরি চালিয়েছি (যেমন নতুন সদস্য সাইন আপ করা, পাসওয়ার্ড ভুলে যাওয়া) যা তাত্ক্ষণিকভাবে প্রেরণ করা দরকার

কম গুরুত্বপূর্ণ ইমেল প্রকারের জন্য আমরা প্রতি 15 মিনিটে আরেকটি কাজ চালিয়েছি (যেমন প্রচারের ইমেল, নিউজ ইমেল ইত্যাদি)

এইভাবে আপনি আপনার সার্ভারকে নন স্টপ ইমেলগুলি প্রেরণ করতে বাধা দেবেন না এবং আপনি ব্যাচে মেলগুলি প্রসেস করবেন। একবার কোনও ইমেল প্রেরণের পরে আপনি ইমেল পাঠানো ক্ষেত্রটি 1 এ সেট করে।


কিন্তু আপনি কীভাবে সংগ্রহগুলি পরিচালনা করেছিলেন?
রিরি

4
আমি এটিও করেছি এবং এটি ভাল কাজ করেছে। এছাড়াও আপনি historতিহাসিকভাবে ফিরে যেতে পারেন এবং প্রেরিত ইমেলের রেকর্ডগুলি দেখতে পারেন, যদি প্রতিবেদনগুলি আপনার জিনিস হয়।
মার্ক গ্লোরি

1

নোট করুন যে এসপেক্স এবং এসসিএক্স সলিউশনগুলির জন্য একটি বর্তমান এইচটিপিপেক্সটেক্সট প্রয়োজন, সুতরাং প্রচুর কাজ ছাড়াই অ্যাসিঙ্ক্রোনসি ব্যবহার করা যাবে না (যেমন থ্রেডগুলিতে)।


1

আমি মনে করি সহজ উত্তরটি হ'ল এমভিসিমেলার। এটি নুগেট প্যাকেজ যা আপনাকে ইমেল তৈরি করতে আপনার পছন্দসই ভিউ ইঞ্জিনটি ব্যবহার করতে দেয়। নিউগেট প্যাকেজটি দেখুনএখানে এবং প্রকল্পের ডকুমেন্টেশন দেখুন

আশা করি এটা সাহায্য করবে!


হুম, আশ্চর্য এই উত্তরটি এতটা মনোযোগ পেল না ?!
পুসইনবুটস

1

ডটলিকুইড আরেকটি বিকল্প। আপনি ক্লাসের মডেল হিসাবে মানগুলি নির্দিষ্ট করেন {{ user.name }}এবং তারপরে রানটাইমের সময় আপনি সেই শ্রেণীর ডেটা এবং মার্কআপ সহ টেমপ্লেট সরবরাহ করেন এবং এটি আপনার জন্য মানগুলি মার্জ করে দেবে। এটি বিভিন্ন উপায়ে রেজার টেম্প্লেটিং ইঞ্জিন ব্যবহার করার মতো। এটি আরও জটিল জিনিসগুলির মতো লুপগুলি এবং টুআবারের মতো বিভিন্ন কার্যকে সমর্থন করে supports সুন্দর জিনিসটি হ'ল "নিরাপদ" যাতে টেমপ্লেট তৈরি করা ব্যবহারকারীরা আপনার সিস্টেমে ক্র্যাশ করতে পারে না বা আপনার মতো রেজারে যেমন অনিরাপদ কোড লিখতে পারে না: http://dotliquidmarkup.org/try-online


0

আপনি যদি এএসপিএনইটি এবং সম্পর্কিত ব্যবহারকারীদের কোনও ফাইল পড়তে এবং লেখার অনুমতি দিতে সক্ষম হন তবে আপনি সহজেই স্ট্যান্ডার্ড String.Format()স্থানধারক সহ একটি এইচটিএমএল ফাইল ব্যবহার করতে পারেন ( {0},{1:C} এই কাজ করা সম্ভব, ইত্যাদি)।

System.IOনেমস্পেস থেকে ক্লাস ব্যবহার করে স্ট্রিং হিসাবে কেবল ফাইলটিতে পড়ুন । আপনার কাছে সেই স্ট্রিং হয়ে গেলে এটি প্রথম যুক্তি হিসাবে পাস করুনString.Format() এবং প্যারামিটারগুলি সরবরাহ করুন।

সেই স্ট্রিংটি চারদিকে রাখুন, এবং এটি ইমেলের মূল অংশ হিসাবে ব্যবহার করুন এবং আপনি মূলত শেষ করেছেন। আমরা আজ কয়েক ডজন (স্বীকৃতভাবে ছোট) সাইটে এটি করি, এবং কোনও সমস্যা হয়নি।

আমার লক্ষ করা উচিত যে এটি কার্যকরভাবে কাজ করে যদি (ক) আপনি একবারে কয়েক মিলিয়ন ই-মেইল প্রেরণ করছেন না, (খ) আপনি প্রতিটি ই-মেইল ব্যক্তিগতকৃত করছেন না (অন্যথায় আপনি এক টন স্ট্রিং খাচ্ছেন) এবং (সি) ) এইচটিএমএল ফাইলটি নিজে তুলনামূলকভাবে ছোট।


0

সেটটি ইমেল বার্তা ইসবডিএইচটিএমএল = সত্য সেট করুন

আপনার ইমেল বিষয়বস্তু রয়েছে এমন আপনার অবজেক্টটি নিন এবং এইচটিএমএল সামগ্রী তৈরি করতে xML / xslt ব্যবহার করুন object

আপনি যদি অলটারনেটভিউগুলি করতে চান তবে একই কাজ করুন যে জেমিন কেবল প্লেইন পাঠ্য সামগ্রী তৈরি করতে একটি ভিন্ন এক্সএসল্ট টেম্পলেট ব্যবহার করে।

এর বড় সুবিধাগুলির মধ্যে একটি হ'ল আপনি যদি নিজের লেআউটটি পরিবর্তন করতে চান তবে আপনাকে xslt টেম্পলেটটি আপডেট করতে হবে।


0

সাবসোনিক (www.subsonicproject.com) দেখুন। কোড তৈরি করতে তারা ঠিক এটি করছে - টেমপ্লেটটি স্ট্যান্ডার্ড এএসপিএক্স, এবং এটি সি # আউটপুট করে। আপনার দৃশ্যের জন্য একই পদ্ধতি পুনরায় ব্যবহারযোগ্য হবে।


0

আমি টেম্পলেটম্যাচিনের মতো একটি টেম্প্লেটিং লাইব্রেরি ব্যবহার করব । এটি আপনাকে সাধারণত আপনার ইমেল টেমপ্লেটটিকে সাধারণ পাঠ্যের সাথে একত্রে রাখার অনুমতি দেয় এবং তারপরে প্রয়োজনীয়তাগুলিকে ইনজেকশন / প্রতিস্থাপনের জন্য নিয়ম ব্যবহার করে। রুবির ইআরবির সাথে খুব মিল। এটি আপনাকে এএসপিএক্স ইত্যাদির মতো খুব বেশি বেঁধে না রেখে মেল সামগ্রীগুলির প্রজন্মকে পৃথক করার মঞ্জুরি দেয় এবং এরপরে সামগ্রীটি তৈরি হয়ে গেলে আপনি ইমেল করে দিতে পারেন।


0

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

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


0

কানাভারের উত্তরের মতো, তবে এনভেলোসিটির পরিবর্তে আমি সর্বদা " স্ট্রিংটেম্পলেট " ব্যবহার করি " করি যা আমি কোনও কনফিগারেশন ফাইল থেকে টেম্পলেট লোড করি, বা ফাইল.আরডএলটেক্সট () ব্যবহার করে একটি বাহ্যিক ফাইল লোড করি এবং মানগুলি সেট করি।

এটি একটি জাভা প্রকল্প তবে সি # পোর্টটি শক্ত এবং আমি এটি বেশ কয়েকটি প্রকল্পে ব্যবহার করেছি (কেবলমাত্র এটি কোনও বহিরাগত ফাইলে টেমপ্লেট ব্যবহার করে ইমেল টেম্প্লেটিংয়ের জন্য ব্যবহার করেছি)।

বিকল্প সবসময় ভাল।


0

ওয়েবক্লিনেন্ট শ্রেণিটি ব্যবহার করার জন্য এখানে একটি সহজ উপায় রয়েছে :

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

অবশ্যই, সর্বাধিক ইমেল ক্লায়েন্টগুলিতে (যেমন আউটলুক) ওয়েবপেজের শৈলীগুলি দেখানোর জন্য আপনার সিএসএসকে ইন-রেখাযুক্ত করা দরকার। যদি আপনার ই-মেইলে গতিশীল সামগ্রী প্রদর্শিত হয় (উদাঃ গ্রাহকের নাম), তবে আমি ডেটা পপুলেট করার জন্য আপনার ওয়েবসাইটে কোয়েরি স্ট্রিংস ব্যবহার করার পরামর্শ দেব। (উদাঃ http://www.yourwebsite.com?CustomerName= Bob )


ঝরঝরে, যদিও আমি মনে করি অন্যান্য উত্তরগুলি বেশিরভাগই এটির জন্য ওয়েব অনুরোধ না করেই করে ie অর্থাৎ আপনার সাইটে ইমেল বডিটি হোস্ট করে।
রুপ

@ রুপ বোধগম্য, তবে অনেক সময় মনে রাখবেন লোকেরা যেভাবেই ই-মেইলের একটি "ওয়েব সংস্করণ" দেখতে চায়। এই সমাধানটি সেই দৃশ্যের জন্য নির্ভুল কাজ করে।
ROFLwTIME

0

@ বারদেভ একটি ভাল সমাধান সরবরাহ করে তবে দুর্ভাগ্যক্রমে এটি সব ক্ষেত্রেই আদর্শ নয়। মাইন তাদের মধ্যে একটি ছিল।

আমি একটি ওয়েবসাইটে ওয়েবফোরাম ব্যবহার করছি (আমি শপথ করছি আমি আর কোনও ওয়েবসাইট ব্যবহার করব না - কি পিআইটিএ) 2013 সালে।

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

নিকর আবার রেজার।

সুতরাং আমি পরিবর্তে এই সামান্য কাঠামোটি নিয়ে এসেছি (ইউজারকন্ট্রোলের জন্য এমুনের টুপি টিপস এবং স্ট্রং টাইপিংয়ের জন্য @ আইম্যাটরিয়া)। কেবলমাত্র আমি দেখতে পাচ্ছি এমন একমাত্র সম্ভাব্য সমস্যা স্পটটি হ'ল আপনার .ASCX ফাইলের নামটি তার শ্রেণীর নামের সাথে সিঙ্ক করে রাখার বিষয়ে আপনাকে যত্নবান হতে হবে। যদি আপনি বিপথগামী হন তবে আপনি রানটাইম ত্রুটি পাবেন।

এফডাব্লুআইডাব্লু: আমার পরীক্ষায় কমপক্ষে রেন্ডারকন্ট্রোল () কলটি পৃষ্ঠা নিয়ন্ত্রণ পছন্দ করে না, তাই আমি ইউজারকন্ট্রোলের সাথে চলেছি।

আমি নিশ্চিত যে আমি এখানে সবকিছু অন্তর্ভুক্ত করেছি; আমি কিছু রেখে দিলে আমাকে জানান।

এইচটিএইচ

ব্যবহার:

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

এএসসিএক্স শিরোলেখ:

<%@ 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>

এএসসিএক্স পাদলেখ:

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

</body>
</html>

এএসসিএক্স টেমপ্লেট:

<%@ 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" />

এএসসিএক্স টেমপ্লেট কোড ফাইল:

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

এটি রেজারলাইট ব্যবহার করে ইমেলগুলি রেন্ডার করে, ইমেলগুলি তৈরি করতে সাবলীল শৈলী ব্যবহার করে এবং বাক্সের বাইরে একাধিক প্রেরককে সমর্থন করে। এটি এএসপি.নেট ডিআইয়ের জন্যও এক্সটেনশন পদ্ধতিগুলির সাথে আসে। সাধারণ টেক্সট এবং এইচটিএমএল সমর্থন সহ, সামান্য সেটআপ, ব্যবহার করা সহজ।

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