标准的电子邮件类?

4
我正在整理我的应用程序,试图清理一些发送电子邮件的代码。我开始创建自己的电子邮件包装类,但我想肯定有一个标准的电子邮件类存在。我进行了一些搜索,但没有找到任何相关的内容。
此外,是否有任何类似这样的代码库?
编辑:抱歉,让我澄清一下。
我不想在每次需要发送电子邮件时都在我的代码中添加以下内容:
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);

我创建了一个名为Emailer的类,其中包含诸如以下函数:

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

因此,我只需在我的代码中放置这一行来发送电子邮件:

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

我的意思是,这并不太复杂,但我认为有一个标准的、被广泛接受的解决方案存在。


1
请澄清一下。你所说的“标准邮件类”是什么意思?是把表单字段转换成电子邮件的东西吗? - anon
@anon,同意。我认为OP不仅仅是在询问http://msdn.microsoft.com/en-us/library/system.net.mail.aspx吧? - Kirk Woll
@Kirk Woll,实际上我有这样的印象。 - GWLlosa
1
我认为他想要一个发送电子邮件的服务层。 - Shawn Mclean
@Shawn - 是的,那就是我的意思。 :) 对于造成的混淆我感到抱歉,我很难用语言表达自己的需求。 - Steven
4个回答

7

像这样的内容吗?

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

是的,谢谢。您是否知道有哪些代码库可以提供此类服务,或者您从哪里获取了这个代码库? - Steven
@Steven:我刚从我的项目代码中删除了一个类:) 70-536培训书有一章关于发送电子邮件的好内容。 - LukLed
这可能听起来像是一个新手问题。语句“using MailMessage=System.Net.Mail.MailMessage;”是什么意思?由于您已经导入了System.Net.Mail,所以您的代码应该可以正常工作,即使没有它。 - Jonas T
1
@Jonas Everest:我必须承认,这已经不再需要了。当您有两个或更多不同命名空间中称为“MailMessage”的类,并且您想指出此文件中的“MailMessage”指向System.Net.Mail.MailMessage时,使用此构造。我相信.NET在不同的命名空间中有MailMessage类,但已被弃用。 - LukLed

1

0
这是我项目中的一段代码片段。它比其他实现更加功能丰富。
使用此函数可以创建带有以下内容的电子邮件:
  • 可以在运行时替换为实际值的令牌
  • 包含文本和HTML视图的电子邮件

    public MailMessage createMailMessage(string toAddress, string fromAddress, string subject, string template)
    {
    // 在此验证参数...
    
    // 如果您的模板包含以下任何{tokens}
    // 它们将被替换为您在此设置的值。
    var replacementDictionary = new ListDictionary
           {
               // 用自己的值列表替换
               { "{first}", "从数据库或配置中获取" },
               { "{last}", "从数据库或配置中获取" }
           };
    
    // 创建文本视图和HTML视图(两者都将在同一封电子邮件中)
    // 此片段假定您正在使用ASP.NET(适用于MVC)
    //    如果不是,请使用HostingEnvironment.MapPath替换自己的路径。
    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;
    }
    
假设您已经设置了NetMail的Web.config,您可以像这样从辅助方法中调用此方法:
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

我使用一个通用类,由这个旧的Stack Overflow答案制成。
试试这个。


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

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接