开发者

Standard emailer class?

I'm going through my app, trying to clean up some code that sends e-mails. I started creating my own emailer wrapper class, but then I figured that there must be a standard emailer class out there somewhere. I've done some searching, but couldn't find anything.

Also, is there a code base for stuff like this anywhere?

EDIT: Sorry, let me clarify.

I don't want to have this in my code any time I need to send an e-mai开发者_如何学Pythonl:

System.Web.Mail.MailMessage message=new System.Web.Mail.MailMessage();
message.From="from e-mail";
message.To="to e-mail";
message.Subject="Message Subject";
message.Body="Message Body";
System.Web.Mail.SmtpMail.SmtpServer="SMTP Server Address";
System.Web.Mail.SmtpMail.Send(message);

I created a class named Emailer, that contains functions like:

SendEmail(string to, string from, string body)
SendEmail(string to, string from, string body, bool isHtml)

And so I can just put this a single line in my code to send an e-mail:

Emailer.SendEmail("name@site.com", "name2@site.com", "My e-mail", false);

I mean, it's not too complex, but I figured there was a standard, accepted solution out there.


Something like this?

using System;
using System.Net;
using System.Net.Mail;
using System.Net.Mime;
using MailMessage=System.Net.Mail.MailMessage;

class CTEmailSender
{
    string MailSmtpHost { get; set; }
    int MailSmtpPort { get; set; }
    string MailSmtpUsername { get; set; }
    string MailSmtpPassword { get; set; }
    string MailFrom { get; set; }

    public bool SendEmail(string to, string subject, string body)
    {
        MailMessage mail = new MailMessage(MailFrom, to, subject, body);
        var alternameView = AlternateView.CreateAlternateViewFromString(body, new ContentType("text/html"));
        mail.AlternateViews.Add(alternameView);

        var smtpClient = new SmtpClient(MailSmtpHost, MailSmtpPort);
        smtpClient.Credentials = new NetworkCredential(MailSmtpUsername, MailSmtpPassword);
        try
        {
            smtpClient.Send(mail);
        }
        catch (Exception e)
        {
            //Log error here
            return false;
        }

        return true;
    }
}


Maybe you're looking for SmtpClient?


I use a generic class made out of this old Stack Overflow Answer.
Try this.


public bool SendEmail(MailAddress toAddress, string subject, string body)
{
    MailAddress fromAddress = new MailAddress("pull from db or web.config", "pull from db or web.config");
    string fromPassword = "pull from db or config and decrypt";
    string smtpHost = "pull from db or web.config";
    int smtpPort = 587;//gmail port

    try
    {
        var smtp = new SmtpClient
        {
            Host = smtpHost,
            Port = smtpPort,
            EnableSsl = true,
            DeliveryMethod = SmtpDeliveryMethod.Network,
            UseDefaultCredentials = false,
            Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
        };
        using (var message = new MailMessage(fromAddress, toAddress)
        {
            Subject = subject,
            Body = body,
            IsBodyHtml = true
        })
        {
            smtp.Send(message);
        }
        return true;
    }
    catch (Exception err)
    {
        Elmah.ErrorSignal.FromCurrentContext().Raise(err);
        return false;
    }

}


This is a snippet from one of my projects. It's a little more feature-packed than some of the other implementations.

Using this function allows you to create an email with:

  • Tokens that can be replaced with actual values at runtime
  • Emails that contain both a text and HTML view

    public MailMessage createMailMessage(string toAddress, string fromAddress, string subject, string template)
    {
    // Validate arguments here...
    
    // If your template contains any of the following {tokens}
    // they will be replaced with the values you set here.
    var replacementDictionary = new ListDictionary
           {
               // Replace with your own list of values
               { "{first}", "Pull from db or config" },
               { "{last}", "Pull from db or config" }
           };
    
    // Create a text view and HTML view (both will be in the same email)
    // This snippet assumes you are using ASP.NET (works w/MVC)
    //    if not, replace HostingEnvironment.MapPath with your own path.
    var mailDefinition = new MailDefinition { BodyFileName = HostingEnvironment.MapPath(template + ".txt"), IsBodyHtml = false };
    var htmlMailDefinition = new MailDefinition { BodyFileName = HostingEnvironment.MapPath(template + ".htm"), IsBodyHtml = true };
    
    MailMessage htmlMessage = htmlMailDefinition.CreateMailMessage(email, replacementDictionary, new Control());
    MailMessage textMessage = mailDefinition.CreateMailMessage(email, replacementDictionary, new Control());
    
    AlternateView plainView = AlternateView.CreateAlternateViewFromString(textMessage.Body, null, "text/plain");
    AlternateView htmlView = AlternateView.CreateAlternateViewFromString(htmlMessage.Body, null, "text/html");
    
    var message = new MailMessage { From = new MailAddress(from) };
    
    message.To.Add(new MailAddress(toAddress));
    message.Subject = subject;
    
    message.AlternateViews.Add(plainView);
    message.AlternateViews.Add(htmlView);
    
    return message;
    }
    

Assuming you have your Web.config set up for NetMail, you can call this method from a helper method like so:

public bool SendEmail(MailMessage email)
{
    var client = new SmtpClient();

    try
    {
       client.Send(message);
    }
    catch (Exception e)
    {
        return false;
    }

    return true;
}

SendMail(createMailMessage("to@email.com", "from@email.com", "Subject", "~/Path/Template"));
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜