सामग्री प्रदाताओं के साथ सार ईमेल प्रेषक
मैंने ईमेल सामग्री के लिए प्रदाताओं के साथ एक ईमेल प्रेषक बनाया है, जिसे ईमेल प्रकार के आधार पर बदल दिया जाएगा। इसे बढ़ाने के लिए मुझे कुछ मदद चाहिए।
ये दो मॉडल भेजने के लिए उपयोग किए जाते हैं
public class EmailAddress
{
public string Name { get; set; }
public string Address { get; set; }
}
public class EmailMessage
{
public EmailMessage()
{
ToAddresses = new List<EmailAddress>();
CcAddresses = new List<EmailAddress>();
}
public List<EmailAddress> ToAddresses { get; set; }
public List<EmailAddress> CcAddresses { get; set; }
public string Subject { get; set; }
public string Content { get; set; }
}
सामग्री प्रदाता सभी ईमेल जानकारी (विषय, निकाय, To और Cc) प्रदान करता है
public interface IEmailContentProvider
{
EmailMessage Message { get; }
}
तब हमारे पास सारगर्भित ईमेल भेजने वाला होता है IEmailSender
जिसके पास एक ही तरीका होता है Send
जो IEmailContentProvider
ईमेल की जानकारी प्राप्त करने के लिए पैरामीटर का उपयोग करता है
interface IEmailSender
{
Task Send(IEmailContentProvider provider);
}
मेरे पास सामग्री प्रदाता के लिए एक उदाहरण है WelcomEmailProvider
public class WelcomEmailProvider : IEmailProvider
{
public EmailMessage Message { get; }
public WelcomEmailProvider(string address, string name)
{
Message = new EmailMessage
{
Subject = $"Welcome {name}", Content = $"This is welcome email provider!",
ToAddresses = new List<EmailAddress> { new EmailAddress { Address = address, Name = name} }
};
}
}
IEmailSender
कार्यान्वयन:
public class EmailSender : IEmailSender
{
private readonly SmtpOptions _options;
public EmailSender(IOptions<SmtpOptions> options)
{
_options = options.Value;
}
public async Task Send(IEmailContentProvider provider)
{
var emailMessage = provider.Message;
var message = new MimeMessage();
message.From.Add(new MailboxAddress(_options.Sender.Name, _options.Sender.Address));
message.To.AddRange(emailMessage.ToAddresses.Select(x => new MailboxAddress(x.Name, x.Address)));
message.Cc.AddRange(emailMessage.CcAddresses.Select(x => new MailboxAddress(x.Name, x.Address)));
message.Subject = emailMessage.Subject;
message.Body = new TextPart(TextFormat.Html) { Text = emailMessage.Content };
using var emailClient = new SmtpClient();
await emailClient.ConnectAsync(_options.Server, _options.Port, _options.EnableSsl);
await AuthenticatedData(emailClient);
await emailClient.SendAsync(message);
await emailClient.DisconnectAsync(true);
}
private async Task AuthenticatedData(SmtpClient smtpClient)
{
if (string.IsNullOrWhiteSpace(_options.Username) || string.IsNullOrWhiteSpace(_options.Password))
return;
emailClient.AuthenticationMechanisms.Remove("XOAUTH2");
await emailClient.AuthenticateAsync(_options.Username, _options.Password);
}
}
और यहाँ है, इसका उपयोग कैसे करें और एक ईमेल भेजें:
class Sample
{
private readonly IEmailSender _emailSender;
public Samole(IEmailSender emailSender)
{
_emailSender = emailSender;
}
public async Task DoSomethingThenSendEmail()
{
await _emailSender.Send(new WelcomEmailProvider("[email protected]", "Someone"));
}
}
जवाब
public EmailMessage()
{
ToAddresses = new List<EmailAddress>();
CcAddresses = new List<EmailAddress>();
}
आवश्यक नहीं है, मैं समझ सकता हूं कि क्या आप अभी शुरुआत करते हैं ToAddress
, हालांकि, इस तरह की सूचियों को शुरू करने से बहुत अधिक मेमोरी की खपत हो सकती है (कल्पना करें कि आपके पास बड़ी मात्रा में EmailMessage
उदाहरण हैं! इसलिए, मैं उन्हें अशक्त रखने के लिए सुझाव दूंगा, और null
बल के लिए सत्यापन का उपयोग करूंगा। जरूरत पड़ने पर उन्हें आरंभ करना (जैसे प्रेषक में)।
आपका समग्र डिजाइन काफी अच्छा है, हालांकि, आप इसे सीधे कर सकते हैं:
public class EmailMessage
{
public EmailAddress From { get; set; }
public IEnumerable<EmailAddress> To { get; set; }
public IEnumerable<EmailAddress> Cc { get; set; }
public IEnumerable<EmailAddress> Bcc { get; set; }
public string Subject { get; set; }
public string Body { get; set; }
}
public interface IEmailProvider
{
IEmailServerSetting ServerSettings { get; set; }
}
EmailMessage
संदेश के पूर्ण मॉडल के रूप में (आवश्यक), To (आवश्यक), CC (वैकल्पिक), BCC (वैकल्पिक), विषय और निकाय समाहित होने चाहिए। इसके पीछे कारण यह है कि इसे हमेशा किसी भी संदेश के लिए आवश्यकता के रूप में एक साथ रखा जाएगा, बाद में, डेटाबेस पक्ष पर इसे लागू करना भी आसान होगा। उपयोग IEnumerable<EmailAddress>
करने से किसी भी संग्रह को लागू करने के लिए खुल जाएगा IEnumerable
। इसलिए, यह प्रतिबंधित नहीं है List
।
के लिए IEmailProvider
किसी ईमेल प्रदाता भी आवश्यकता के रूप में अपने स्वयं के सेटिंग्स को शामिल करना चाहिए के रूप में। इससे आपके लिए प्रत्येक ईमेल संदेश के साथ स्वयं की सेटिंग रखना आसान हो जाएगा। इस तरह, आप बिना किसी अतिरिक्त कोडिंग के विभिन्न प्रदाताओं से कई ईमेल भेज सकते हैं। IOptions
स्वतंत्र रूप से व्यवहार किया जाता है, लेकिन वास्तव में, IOptions
यह अपने आप से उपयोगी नहीं होगा, और इसका केवल उपयोग किया जाएगा EmailProvider
, इसलिए यदि हम इसे अनुबंध में जोड़ते हैं, तो इसे हमेशा इंटरफ़ेस के साथ लागू किया जाएगा, इस तरह आपने प्रदाता को हमेशा मजबूर किया है IOptions
। इसके अलावा, IOptions
इसका नाम बदलकर EmailServerSetting
या EmailProviderSetting
मुख्य कार्यान्वयन से संबंधित होना चाहिए । जैसा कि ये सेटिंग्स हैं और विकल्प नहीं हैं। IOptions
ईमेल वैकल्पिक सेटिंग्स और सुविधाओं को संभालने के लिए उपयोग करें जिन्हें टेक्स्ट या html, अक्षम / संलग्नक, चित्र ..etc के रूप में भेजने जैसे प्रबंधन किया जा सकता है।
इसके अलावा, आपको चीजों को लपेटने और उपयोग करने के लिए एक मध्य-बर्तन वर्ग की आवश्यकता है SmtpClient
। इससे आपको अपने वर्तमान कार्य के लचीलेपन को बढ़ाने और उन्हें एक छत के नीचे लपेटने के साथ-साथ प्रत्येक नए प्रेषक पर इसे पुन: लागू करने के बजाय कोड (जैसे MimeMessage
, TextPart
..etc) का उपयोग करने में आसानी होगी । यदि आप अभी तक जा रहे हैं तो यह आपको कई प्रदाताओं को संग्रहीत करने के लिए एक संग्रह बनाने की क्षमता देगा। इसके अलावा, आप नए प्रदाताओं को जोड़ने, उन्हें संभालने, संदेशों को संभालने और अपने काम को बनाए रखने में सक्षम होंगे।
यहाँ मैं अंतिम उपयोग की कल्पना करता हूँ:
एक नया प्रदाता बनाना:
// creating a new email provider
public class SomeEmailProvider : IEmailProvider
{
// only set the settings internally but it's exposed to be readonly
public EmailServerSetting ServerSettings { get; private set; }
public SomeEmailProvider()
{
//set up the server settings
ServerSettings = new EmailServerSetting
{
ServerType = EmailServerType.POP,
Server = "pop.mail.com",
Port = 995,
Encryption = EmailServerEncryption.SSLOrTLS,
EnableSsl = true
};
}
// some other related code
}
अब, एक नया मेल संदेश बना रहा है और उसे भेज रहा है:
// can be single object or collection
var messages = new EmailMessage
{
From = new EmailAddress("Test", "[email protected]"),
To = new EmailAddress [] {
new EmailAddress("Test1", "[email protected]"),
new EmailAddress("Test2", "[email protected]")
},
Subject = "Testing Subject",
Body = "Normal Text Body"
};
using(var client = new EmailClient(new SomeEmailProvider()))
{
client.Options = new EmailClientOptions
{
// would send it as plain text
EnableHtml = false
};
client.Messages.Add(messages);
client.Send();
}