如何将aspx页面作为电子邮件模板发送

时间:2009-10-03 17:43:46

标签: c# asp.net email

我可以在ASP.NET上用C#设置HTML /电子邮件模板吗?

这个问题是由SkippyFire和其他人提出并回答的......我有一个跟进问题。作为一名新手开发人员,我喜欢让事情变得非常简单。

如果我不正确,Skippyfire说您可以使用以下代码发送完整的aspx页面:

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

然后使用net.mail发送Page.Load事件。这对我来说非常困惑。我可以使用它来控制一个email.Body和发送,但我无法使用它来加载我发现的整个页面。

使用Net.mail ...

我如何发送上面的页面?我试图在页面上没有任何内容,但是有些文本并使用它自己的页面加载事件发送它...我无法找出从其他页面或按钮发送它的任何其他方式......(你会怎么做?不会你不得不以某种方式将URL加载到一个对象中吗?)...无论如何,我试图通过Page Load在旧帖子中描述并从Visual Studio IDE中获取此错误:

一个页面只能有一个服务器端的Form标签。

任何帮助都将不胜感激。

CS

2 个答案:

答案 0 :(得分:1)

这将是这样的:

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

    using (var message = new MailMessage
                         {
                             From = new MailAddress("from@company.com"), 
                             Subject = "This is an HTML Email", 
                             Body = sw.ToString(), 
                             IsBodyHtml = true
                         })
    {
        message.To.Add("toaddress1@company.com,toaddress2@company.com");
        SmtpClient client = new SmtpClient();
        client.Send(message);
    }
}

答案 1 :(得分:0)

还有另一种方法可以执行此操作...您可以在应用程序中托管ASP.Net运行时。它也不是主要的,这是“你需要做的事情”......

  1. 第一步是创建一个可用于与域通信的远程对象。它只需要一个返回页面输出的方法:

    internal class RemoteAspDomain : MarshalByRefObject
    {
        public string ProcessRequest(string page, string query)
        {
            using (StringWriter sw = new StringWriter())
            {
                SimpleWorkerRequest work = new SimpleWorkerRequest(page, query, sw);
                HttpRuntime.ProcessRequest(work);
                return sw.ToString();
            }
        }
    }
    
  2. 然后,当您准备创建/使用ASP.Net时,您可以设置以下环境:

    public static string RunAspPage(string rootDirectory, string page, string query)
    {
        RemoteAspDomain host;
        try
        {
            host = (RemoteAspDomain)ApplicationHost.CreateApplicationHost(typeof(RemoteAspDomain), "/", rootDirectory);
            return host.ProcessRequest(page, query);
        }
        finally
        {
            ApplicationManager.GetApplicationManager().ShutdownAll();
            System.Web.Hosting.HostingEnvironment.InitiateShutdown();
            host = null;
        }
    }
    
  3. 现在应该能够使用以下内容:

    string response = RunAspPage("C:\\MyWebAppRoot\\", "/default.aspx", "asdf=123&xyz=123");
    
  4. 显然,您不希望为每个请求执行此操作,因为执行启动关闭操作需要时间。简单地将RunAspPage重构为一个IDisposable类,它会在dispose上破坏环境,而不是使用finally块。

    更新,顺便说一句,如果您已经在ASP.Net会话中运行,那么有更简单的方法可以做到这一点。见HttpServerUtility.Execute Method (String, TextWriter)

    请注意:上面的代码是从工作副本中复制/粘贴并简化的,我认为我得到了你需要的一切,但我的实际实现要复杂得多。如果您遇到任何问题,可以在互联网上找到这些API的几个真实示例。