Как отправить aspx страницу в качестве шаблона электронной почты - PullRequest
0 голосов
/ 03 октября 2009

Можно ли настроить шаблоны HTML / электронной почты в C # на ASP.NET?

Этот вопрос был задан и получен ответом SkippyFire и другими ... У меня есть дополнительный вопрос. Как начинающий разработчик, я бы хотел, чтобы все было очень просто.

Если я не прав, Skippyfire сказал, что вы можете отправить полную страницу aspx, используя этот код:

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

Тогда просто используйте net.mail для отправки на событие Page.Load. Это очень смущает меня. Я могу использовать это для рендеринга элементов управления по электронной почте. Отправлять и отправлять, но я не могу использовать это для загрузки всей страницы в любом случае, как я обнаружил.

Использование Net.mail ...

Как бы я отправил страницу выше? Я пытался поместить на страницу ничего, кроме текста, и отправить его, используя свое собственное событие загрузки страницы ... Я не могу найти какой-либо другой способ отправить его с другой страницы или кнопки ... (как бы вы это сделали? вам нужно каким-то образом загрузить URL-адрес в объект?) ... в любом случае, я пытался сделать это из самой загрузки страницы, как Skippyfire описывает в старом посте, и получить эту ошибку из Visual Studio IDE:

Страница может иметь только один тег формы на стороне сервера.

Любая помощь будет оценена.

CS

Ответы [ 2 ]

1 голос
/ 03 октября 2009

Это было бы примерно так:

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);
    }
}
0 голосов
/ 03 октября 2009

Есть еще один способ сделать это ... Вы можете разместить среду исполнения ASP.Net в своем приложении. Это не Major трудно, это "своего рода", что вам нужно сделать ...

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

Очевидно, что вы не хотите делать это для каждого запроса, поскольку для выполнения операций запуска и завершения работы требуется время. Просто реорганизуйте RunAspPage в класс IDisposable, который разрушает среду при утилизации вместо использования блока finally.

Обновление, кстати, если вы уже работаете в сеансе ASP.Net, есть гораздо более простые способы сделать это. См. Метод HttpServerUtility.Execute (String, TextWriter)

Обратите внимание: приведенный выше код был скопирован / вставлен и упрощен из рабочей копии, я думаю Я получил все, что вам нужно, но моя фактическая реализация намного сложнее. Если у вас есть какие-либо проблемы, в Интернете есть несколько реальных примеров использования этого API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...