source

ASP에서 HTML/이메일 템플릿을 설정할 수 있습니까?인터넷?

ittop 2023. 4. 22. 10:27
반응형

ASP에서 HTML/이메일 템플릿을 설정할 수 있습니까?인터넷?

저는 많은 수의 메일을 보낼 사이트를 만들고 있습니다.사용자가 필요에 따라 이러한 이메일을 쉽게 편집할 수 있도록 머리글과 바닥글 텍스트를 모두 설정하거나 템플릿을 설정하려고 합니다.

HTML을 C# 문자열 리터럴에 삽입하면 보기 흉하고 탈출을 걱정해야 합니다.머리글과 바닥글에 플랫 파일을 포함하면 작동하지만 뭔가 잘못된 것 같습니다.

요?.ASPX어떤 식으로든 페이지를 템플릿으로 사용하고, 내 코드에 해당 페이지를 제공하라고 말하고, 이메일에 반환된 HTML을 사용하십시오.

이걸 할 수 있는 쉽고 좋은 방법이 있을까요?이 문제를 해결하는 더 좋은 방법이 있을까요?

다음 중 하나:
표준 .aspx 페이지를 이메일 템플릿으로 사용할 수 있는 답변을 추가했습니다.평소처럼 모든 변수를 바꾸거나 데이터 바인딩 등을 사용합니다.했습니다!HTML ★★★★★★★★★★★★★★★★★★★★★!

★★★★★★★★★★★★★★★!!
일부 aspx 페이지에서 MailDefinition 클래스를 정상적으로 사용하고 있었는데 실행 중인 서버 프로세스 중에 이 클래스를 사용하려고 하면 실패했습니다.MailDefinition(메일 정의)메일 메시지()를 만듭니다.다만, 반드시 어떠한 조작을 실시하는 것은 아닙니다.그렇기 때문에 저는 애스펙스 페이지를 사용하는 저의 접근법이나 애스펙스 페이지를 사용하는 문씨의 접근법이 조금 더 나은 것 같습니다.

이미 수많은 답변이 있지만 이메일 템플릿에서 Razor를 사용하는 방법에 대한 훌륭한 기사를 우연히 발견했습니다.ASP로 면도기를 눌렀다.NET MVC 3 단, MVC가 레이저를 사용할 필요는 없습니다.이메일 템플릿의 처리가 매우 원활합니다.

기사에서는 "레이저의 가장 좋은 점은 이전 제품(웹폼)과 달리 웹 환경과 연계되지 않고 웹 외부에서 쉽게 호스팅하여 다양한 목적을 위한 템플릿 엔진으로 사용할 수 있다는 것입니다."

RazorEngine을 통한 HTML 이메일 생성 - Part 01 - 개요

ASP 외부에서 레이저 템플릿 활용NET: HTML 전용이 아닙니다!

ASP의 스마트한 이메일 템플릿.NET(레이저 엔진 포함)

유사한 Stackoverflow QA

새로운 RazorEngine API를 사용한 템플릿 제작

MVC가 없는 면도기 사용

asp.net 외부에서 레이저 뷰 엔진을 사용할 수 있습니까?

컨트롤을 로드한 후 문자열로 렌더링하고 HTML 본문으로 설정할 수도 있습니다.

// Declare stringbuilder to render control to
StringBuilder sb = new StringBuilder();

// Load the control
UserControl ctrl = (UserControl) LoadControl("~/Controls/UserControl.ascx");

// Do stuff with ctrl here

// Render the control into the stringbuilder
StringWriter sw = new StringWriter(sb);
Html32TextWriter htw = new Html32TextWriter(sw);
ctrl.RenderControl(htw);

// Get full body text
string body = sb.ToString();

그런 다음 평상시와 같이 이메일을 구성할 수 있습니다.

MailMessage message = new MailMessage();
message.From = new MailAddress("from@email.com", "from name");
message.Subject = "Email Subject";
message.Body = body;
message.BodyEncoding = Encoding.ASCII;
message.IsBodyHtml = true;

SmtpClient smtp = new SmtpClient("server");
smtp.Send(message);

사용자 컨트롤에는 머리글 및 바닥글과 같은 다른 컨트롤이 포함될 수 있으며 데이터 바인딩과 같은 기능도 활용할 수 있습니다.

MailDefinition 클래스를 사용할 수 있습니다.

사용자 이름, 제품 이름 등의 매개 변수를 전달하려면 오픈 소스 템플릿 엔진 NVelocity를 사용하여 최종 이메일/HTML을 생성할 수 있습니다.

NVelocity 템플릿(MailTemplate.vm)의 예:

A sample email template by <b>$name</b>.
<br />

Foreach example :
<br />    
#foreach ($item in $itemList)

[Date: $item.Date] Name: $item.Name, Value: $itemValue.Value
<br /><br />

#end

응용 프로그램에서 MailTemplate.vm을 사용하여 메일 본문을 생성하는 중:

VelocityContext context = new VelocityContext();
context.Put("name", "ScarletGarden");
context.Put("itemList", itemList);

StringWriter writer = new StringWriter();

Velocity.MergeTemplate("MailTemplate.vm", context, writer);

string mailBody = writer.GetStringBuilder().ToString();

결과 메일 본문은 다음과 같습니다.

ScarletGarden의 샘플 이메일 템플릿입니다.

포어치의 예:

[날짜 : 2009년 12월 2일] 이름 :항목 1, 값: 09

[날짜 : 2009년 2월 21일] 이름 :항목 4, 값: 52

[날짜 : 2009년 3월 1일]명칭 :항목 2, 값: 21

[날짜 : 2009년 3월 23일]명칭 :항목 6, 값: 24

템플릿을 편집하려면 FCKEditor를 사용하여 템플릿을 파일에 저장할 수 있습니다.

Mail.dll 이메일 구성 요소에는 이메일 템플릿 엔진이 포함되어 있습니다.

구문의 개요는 다음과 같습니다.

<html>
<body>
Hi {FirstName} {LastName},

Here are your orders: 
{foreach Orders}
    Order '{Name}' sent to <strong>{Street}</strong>. 
{end}

</body>
</html>

또한 템플릿을 로드하고 c# 객체의 데이터를 채우고 이메일을 보내는 코드:

Mail.Html(Template
              .FromFile("template.txt")
              .DataFrom(_contact)
              .Render())
    .Text("This is text version of the message.")
    .From(new MailBox("alice@mail.com", "Alice"))
    .To(new MailBox("bob@mail.com", "Bob"))
    .Subject("Your order")
    .UsingNewSmtp()
    .WithCredentials("alice@mail.com", "password")
    .Server("mail.com")
    .WithSSL()
    .Send();

이메일 템플릿 엔진 블로그 게시물에서 자세한 정보를 얻을 수 있습니다.

또는 Mail.dll 이메일 컴포넌트를 다운로드하여 사용해 보십시오.

이것은 제가 만든 상용제품이니 참고하시기 바랍니다.

유연성이 전제 조건의 하나라면 XSLT를 선택하는 것이 좋습니다.XSLT는 에서 완전히 지원됩니다.NET 프레임워크에서는 사용자가 이러한 파일을 편집할 수도 있습니다.이 문서(http://www.aspfree.com/c/a/XML/XSL-Transformations-using-ASP-NET/)는 처음에 도움이 될 수 있습니다(msdn에 대한 자세한 내용은 참조).ScarletGarden NVelocity도 좋은 선택이지만, 저는 XSLT를 빌트인으로 선호합니다.NET 프레임워크 지원 및 플랫폼에 구애받지 않습니다.

이런 것도 할 수 있을 것 같아요.

및 .aspx 페이지를 생성하여 OnLoad 메서드 끝에 놓거나 수동으로 호출합니다.

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

문제가 있을지는 모르겠지만 잘 될 것 같아요.이렇게 하면 텍스트 대체만 지원하는 MailDefinition 클래스 대신 전체 기능 .aspx 페이지를 사용할 수 있습니다.

HTML 템플릿을 만들 수 있습니다.텍스트 템플릿도 추천합니다.템플릿에서 본문을 배치할 위치에 [BODY]를 넣은 후 템플릿을 읽고 본문을 새 콘텐츠로 바꿀 수 있습니다.를 사용하여 전자 메일을 보낼 수 있습니다.Nets 메일 클래스.처음에 전자 메일을 작성한 후 모든 수신자에게 전자 메일을 보내는 과정을 반복하기만 하면 됩니다.나한테는 마법처럼 작용했어.

using System.Net.Mail;

// Email content
string HTMLTemplatePath = @"path";
string TextTemplatePath = @"path";
string HTMLBody = "";
string TextBody = "";

HTMLBody = File.ReadAllText(HTMLTemplatePath);
TextBody = File.ReadAllText(TextTemplatePath);

HTMLBody = HTMLBody.Replace(["[BODY]", content);
TextBody = HTMLBody.Replace(["[BODY]", content);

// Create email code
MailMessage m = new MailMessage();

m.From = new MailAddress("address@gmail.com", "display name");
m.To.Add("address@gmail.com");
m.Subject = "subject";

AlternateView plain = AlternateView.CreateAlternateViewFromString(_EmailBody + text, new System.Net.Mime.ContentType("text/plain"));
AlternateView html = AlternateView.CreateAlternateViewFromString(_EmailBody + body, new System.Net.Mime.ContentType("text/html"));
mail.AlternateViews.Add(plain);
mail.AlternateViews.Add(html);

SmtpClient smtp = new SmtpClient("server");
smtp.Send(m);

다음은 보다 복잡한 이메일 템플릿에 XSL 변환을 사용하는 다른 방법입니다.에서 HTML 기반 전자 메일을 보내는 중입니다.NET 어플리케이션

이 작업을 수행할 때는 ViewState를 위해 스팸 필터가 ASP.net에서 생성된 html을 차단하는 것처럼 보이므로 생성된 html이 깨끗한지 확인하십시오.

저는 개인적으로 Asp.net MVC를 사용하여 원하는 결과를 얻을 수 있는지 알아보겠습니다.아니면 NVelocity가 이걸 꽤 잘해요.

를 사용하는 것이 가장 좋은 것은 무엇입니까?ASPX 페이지를 템플릿으로 하여 그 페이지를 처리하도록 코드에게 전달하고, 메일용으로 반환된HTML 을 사용해 주세요.

ASPX 페이지에 접속하여 HTML을 얻을 수 있도록 WebRequest를 쉽게 구축할 수 있습니다.조금만 더 작업을 하면 WebRequest 없이도 할 수 있을 것입니다.PageParser와 Response.필터를 사용하면 페이지를 실행하고 출력을 캡처할 수 있습니다.좀 더 우아한 방법이 있을지도 모르지만요.

매일 대량의 이메일을 보내야 하는 프로젝트 중 하나에서도 비슷한 요건이 있었습니다.클라이언트는 다양한 종류의 이메일을 위한 HTML 템플릿을 완전히 제어하기를 원했습니다.

송신되는 이메일의 수가 많기 때문에, 퍼포먼스가 주된 관심사였습니다.

여기서 생각해낸 것은 SQL Server의 정적 콘텐츠입니다.이것에 의해, 실행시에 실제의 데이터로 대체되는 [UserFirstName], [UserLastName]등의 플레이스 홀더와 함께, HTML 템플릿의 마크업 전체를 보존할 수 있습니다.

그리고 이 데이터를 asp.net 캐시에 로드했습니다.따라서 HTML 템플릿을 반복해서 읽지 않고 실제로 변경되었을 때만 읽습니다.

클라이언트에 WYSIWYG 에디터를 제공하여 관리 웹 양식을 통해 이러한 템플릿을 수정했습니다.업데이트가 이루어질 때마다 asp.net 캐시를 리셋합니다.

그 후, 송신되는 모든 이메일이 로그에 기록되는 E-메일 로그용의 별도 테이블을 준비했습니다.이 테이블에는 emailType, emailSent 및 numberOfTries라는 필드가 있습니다.

우리는 단지 5분마다 중요한 이메일 유형(새 회원가입, 패스워드 잊어버림 등)에 대해 작업을 실행했을 뿐이며, 이는 가능한 한 빨리 전송되어야 합니다.

덜 중요한 이메일 유형(프로모션 이메일, 뉴스 이메일 등)에 대해 15분마다 다른 작업을 수행했습니다.

이렇게 하면 서버가 정지하지 않는 이메일을 보내는 것을 차단하지 않고 메일을 일괄적으로 처리할 수 있습니다.이메일이 발송되면 emailSent 필드를 1로 설정합니다.

aspx 및 ascx 솔루션에는 최신 HttpContext가 필요하므로 많은 작업이 필요하지 않으면 비동기(스레드 등)로 사용할 수 없습니다.

가장 쉬운 답은 MvcMailer라고 생각합니다.즐겨찾는 뷰 엔진을 사용하여 이메일을 생성할 수 있는 NuGet 패키지입니다.NuGet 패키지프로젝트 문서를 참조하십시오.

도움이 됐으면 좋겠다!

도트 리퀴드을 지정할 는 클래스 모델로 지정합니다.{{ user.name }}실행 시 해당 클래스의 데이터와 템플릿을 마크업과 함께 제공하면 값이 병합됩니다.이는 여러 가지 면에서 레이저 템플링 엔진을 사용하는 것과 유사합니다.루프 등 보다 복잡한 기능과 ToUpper 등 다양한 기능을 지원합니다.좋은 점은 템플릿을 작성하는 사용자가 면도기처럼 시스템을 크래시하거나 안전하지 않은 코드를 쓸 수 없도록 하기 위해 "안전"하다는 것입니다.http://dotliquidmarkup.org/try-online

사용하고 있는 라이브러리를 혼재시키기만 하면 됩니다.

RazorLight를 사용하여 이메일을 렌더링하고, 유창한 스타일을 사용하여 이메일을 작성하며, 개봉 즉시 여러 발신인을 지원합니다.ASP 확장 메서드가 포함되어 있습니다.Net DI도.플레인 텍스트 및 HTML 지원으로 사용하기 쉽고 셋업이 거의 없습니다.

ASPNET 및 관련 사용자에게 파일 읽기 및 쓰기를 허용할 수 있다면 표준 HTML 파일을 쉽게 사용할 수 있습니다.String.Format()플레이스 홀더({0},{1:C}등)를 사용해 주세요.

파일 내에서 스트링으로 읽기만 하면 됩니다.System.IO네임스페이스.이 문자열을 얻으면 첫 번째 인수로 전달하여String.Format()및 파라미터를 지정합니다.

그 끈을 가지고 있다가 이메일 본문으로 사용하면 당신은 사실상 끝입니다.현재 수십 개의 (인정상 소규모) 사이트에서 이 작업을 수행하고 있으며, 지금까지 아무런 문제가 없었습니다.

(a) 한 번에 수많은 이메일을 보내지 않거나 (b) 각 이메일을 개인화하지 않거나 (c) HTML 파일 자체가 상대적으로 작을 때 가장 효과적이라는 점에 유의해야 합니다.

Email Message IsBodyHtml = true를 설정합니다.

전자 메일 내용이 포함된 개체를 가져오십시오. 개체를 직렬화하고 xml/xslt를 사용하여 html 컨텐츠를 생성합니다.

AlternateViews를 실행하는 경우 jmein이 다른 xslt 템플릿만 사용하여 플레인텍스트 콘텐츠를 작성하는 것과 같은 작업을 수행합니다.

이 방법의 주요 장점 중 하나는 레이아웃을 변경하고 싶을 때 xslt 템플릿의 주요 장점 중 하나입니다.

SubSonic(www.subsonicproject.com)을 참조해 주세요.이들은 코드를 생성하기 위해 이 작업을 수행합니다.템플릿은 표준 ASPX이며 c#을 출력합니다.시나리오에서도 같은 방법을 재사용할 수 있습니다.

Template Machine과 같은 템플릿 라이브러리를 사용합니다.이를 통해 이메일 템플릿을 일반 텍스트와 함께 넣은 다음 규칙을 사용하여 필요에 따라 값을 주입/바꿀 수 있습니다.루비의 ERB와 매우 유사합니다.이것에 의해, ASPX등의 것에 너무 얽매이지 않고 메일 컨텐츠의 생성을 분리할 수 있습니다.이것으로 컨텐츠가 생성되면, e-메일을 송신할 수 있습니다.

라지의 대답이 마음에 들어.ListManager나 DNN 등의 프레임워크도 같은 작업을 합니다.또한 기술자 이외의 사용자가 쉽게 편집할 필요가 있는 경우 SQL에 저장되어 있는HTML을 수정하는 WYSIWYG 에디터는 매우 쉽고 간단한 방법입니다.또한 토큰을 사용하여 값을 동적으로 삽입할 수도 있습니다.

위의 방법(또는 실제로)을 사용할 경우 주의할 점은 편집자에게 어떤 유형의 스타일과 태그를 삽입할 수 있는지 엄격하고 신중하게 확인하는 것입니다.브라우저가 까다롭다고 생각되면 이메일 클라이언트가 동일한 작업을 얼마나 다르게 하는지 확인할 때까지 기다리십시오.

Canavar의 답변과 비슷하지만 NVelocity 대신 항상 Configuration 파일에서 템플릿을 로드하거나 File을 사용하여 외부 파일을 로드하는 "StringTemplate"를 사용합니다.AllText()를 읽고 값을 설정합니다.

Java 프로젝트이지만 C# 포트는 견고하고 여러 프로젝트에서 사용하였습니다(외부 파일의 템플릿을 사용하여 이메일 템플릿을 만드는 데 사용했을 뿐입니다).

대안은 언제나 좋다.

Web Client 클래스를 사용하는 간단한 방법은 다음과 같습니다.

public static string GetHTMLBody(string url)
{
    string htmlBody;

    using (WebClient client = new WebClient ())
    {
        htmlBody = client.DownloadString(url);
    }

    return htmlBody;
}

그럼 이렇게 불러주세요.

string url = "http://www.yourwebsite.com";
message.Body = GetHTMLBody(url);

물론 대부분의 전자 메일클라이언트(Outlook 등)에서 웹 페이지의 스타일을 표시하려면 CSS를 인라인으로 해야 합니다.전자 메일에 다이내믹한 내용이 표시되는 경우(예:<고객명> 님의 경우 웹 사이트에서 QueryStrings를 사용하여 데이터를 입력할 것을 권장합니다(예: http://www.yourwebsite.com?CustomerName=Bob)).

@bardev는 좋은 해결책을 제공하지만 유감스럽게도 모든 경우에 이상적인 것은 아닙니다.내 것도 그 중 하나였어

2013년 VS에서 웹 사이트에서 WebForms를 사용하고 있습니다(다시는 웹 사이트를 사용하지 않을 것을 맹세합니다).

Razor의 제안을 시험해 보았습니다만, Web 사이트이기 때문에 IDE가 제공하는 중요한 IntelliSense를 MVC 프로젝트에서 입수할 수 없었습니다.또한 사용자 컨트롤에 딱 맞는 템플릿에 이 디자이너를 사용하고 싶습니다.

또 레이저에 닉스.

그래서 이 작은 프레임워크(UserControl의 경우 @mun, Strong Typing의 경우 @imatoria의 힌트)를 생각해 냈습니다.내가 볼 수 있는 유일한 잠재적인 문제점은 당신이 그것을 유지하기 위해 조심해야 한다는 것입니다.클래스명과 동기하는 ASCX 파일명.잘못하면 런타임 오류가 발생합니다.

FWIW: 테스트에서는 적어도 RenderControl() 콜은 페이지 컨트롤을 좋아하지 않기 때문에 UserControl을 선택했습니다.

여기 있는 건 다 포함시켰을 거예요. 빠뜨린 게 있으면 알려주세요.

HTH

사용방법:

Partial Class Purchase
  Inherits UserControl

  Private Sub SendReceipt()
    Dim oTemplate As MailTemplates.PurchaseReceipt

    oTemplate = MailTemplates.Templates.PurchaseReceipt(Me)
    oTemplate.Name = "James Bond"
    oTemplate.OrderTotal = 3500000
    oTemplate.OrderDescription = "Q-Stuff"
    oTemplate.InjectCss("PurchaseReceipt")

    Utils.SendMail("{0} <james.bond@mi6.co.uk>".ToFormat(oTemplate.Name), "Purchase Receipt", oTemplate.ToHtml)
  End Sub
End Class

기본 클래스:

Namespace MailTemplates
  Public MustInherit Class BaseTemplate
    Inherits UserControl

    Public Shared Function GetTemplate(Caller As TemplateControl, Template As Type) As BaseTemplate
      Return Caller.LoadControl("~/MailTemplates/{0}.ascx".ToFormat(Template.Name))
    End Function



    Public Sub InjectCss(FileName As String)
      If Me.Styler IsNot Nothing Then
        Me.Styler.Controls.Add(New Controls.Styler(FileName))
      End If
    End Sub



    Private ReadOnly Property Styler As PlaceHolder
      Get
        If _Styler Is Nothing Then
          _Styler = Me.FindNestedControl(GetType(PlaceHolder))
        End If

        Return _Styler
      End Get
    End Property
    Private _Styler As PlaceHolder
  End Class
End Namespace

"공장" 클래스:

Namespace MailTemplates
  Public Class Templates
    Public Shared ReadOnly Property PurchaseReceipt(Caller As TemplateControl) As PurchaseReceipt
      Get
        Return BaseTemplate.GetTemplate(Caller, GetType(PurchaseReceipt))
      End Get
    End Property
  End Class
End Namespace

템플릿 클래스:

Namespace MailTemplates
  Public MustInherit Class PurchaseReceipt
    Inherits BaseTemplate

    Public MustOverride WriteOnly Property Name As String
    Public MustOverride WriteOnly Property OrderTotal As Decimal
    Public MustOverride WriteOnly Property OrderDescription As String
  End Class
End Namespace

ASCX 헤더:

<%@ Control Language="VB" ClassName="_Header" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional //EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<!--
  See https://www.campaignmonitor.com/blog/post/3317/ for discussion of DocType in HTML Email
-->

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title></title>
  <asp:PlaceHolder ID="plcStyler" runat="server"></asp:PlaceHolder>
</head>
<body>

ASCX 바닥글:

<%@ Control Language="VB" ClassName="_Footer" %>

</body>
</html>

ASCX 템플릿:

<%@ Control Language="VB" AutoEventWireup="false" CodeFile="PurchaseReceipt.ascx.vb" Inherits="PurchaseReceipt" %>

<%@ Register Src="_Header.ascx" TagName="Header" TagPrefix="uc" %>
<%@ Register Src="_Footer.ascx" TagName="Footer" TagPrefix="uc" %>

<uc:Header ID="ctlHeader" runat="server" />

  <p>Name: <asp:Label ID="lblName" runat="server"></asp:Label></p>
  <p>Order Total: <asp:Label ID="lblOrderTotal" runat="server"></asp:Label></p>
  <p>Order Description: <asp:Label ID="lblOrderDescription" runat="server"></asp:Label></p>

<uc:Footer ID="ctlFooter" runat="server" />

ASCX 템플릿코드 파일:

Partial Class PurchaseReceipt
  Inherits MailTemplates.PurchaseReceipt

  Public Overrides WriteOnly Property Name As String
    Set(Value As String)
      lblName.Text = Value
    End Set
  End Property



  Public Overrides WriteOnly Property OrderTotal As Decimal
    Set(Value As Boolean)
      lblOrderTotal.Text = Value
    End Set
  End Property



  Public Overrides WriteOnly Property OrderDescription As Decimal
    Set(Value As Boolean)
      lblOrderDescription.Text = Value
    End Set
  End Property
End Class

도우미:

'
' FindNestedControl helpers based on tip by @andleer
' at http://stackoverflow.com/questions/619449/
'

Public Module Helpers
  <Extension>
  Public Function AllControls(Control As Control) As List(Of Control)
    Return Control.Controls.Flatten
  End Function



  <Extension>
  Public Function FindNestedControl(Control As Control, Id As String) As Control
    Return Control.Controls.Flatten(Function(C) C.ID = Id).SingleOrDefault
  End Function



  <Extension>
  Public Function FindNestedControl(Control As Control, Type As Type) As Control
    Return Control.Controls.Flatten(Function(C) C.GetType = Type).SingleOrDefault
  End Function



  <Extension>
  Public Function Flatten(Controls As ControlCollection) As List(Of Control)
    Flatten = New List(Of Control)

    Controls.Traverse(Sub(Control) Flatten.Add(Control))
  End Function


  <Extension>
  Public Function Flatten(Controls As ControlCollection, Predicate As Func(Of Control, Boolean)) As List(Of Control)
    Flatten = New List(Of Control)

    Controls.Traverse(Sub(Control)
                        If Predicate(Control) Then
                          Flatten.Add(Control)
                        End If
                      End Sub)
  End Function



  <Extension>
  Public Sub Traverse(Controls As ControlCollection, Action As Action(Of Control))
    Controls.Cast(Of Control).ToList.ForEach(Sub(Control As Control)
                                               Action(Control)

                                               If Control.HasControls Then
                                                 Control.Controls.Traverse(Action)
                                               End If
                                             End Sub)
  End Sub



  <Extension()>
  Public Function ToFormat(Template As String, ParamArray Values As Object()) As String
    Return String.Format(Template, Values)
  End Function



  <Extension()>
  Public Function ToHtml(Control As Control) As String
    Dim oSb As StringBuilder

    oSb = New StringBuilder

    Using oSw As New StringWriter(oSb)
      Using oTw As New HtmlTextWriter(oSw)
        Control.RenderControl(oTw)
        Return oSb.ToString
      End Using
    End Using
  End Function
End Module



Namespace Controls
  Public Class Styler
    Inherits LiteralControl

    Public Sub New(FileName As String)
      Dim _
        sFileName,
        sFilePath As String

      sFileName = Path.GetFileNameWithoutExtension(FileName)
      sFilePath = HttpContext.Current.Server.MapPath("~/Styles/{0}.css".ToFormat(sFileName))

      If File.Exists(sFilePath) Then
        Me.Text = "{0}<style type=""text/css"">{0}{1}</style>{0}".ToFormat(vbCrLf, File.ReadAllText(sFilePath))
      Else
        Me.Text = String.Empty
      End If
    End Sub
  End Class
End Namespace



Public Class Utils
  Public Shared Sub SendMail(Recipient As MailAddress, Subject As String, HtmlBody As String)
    Using oMessage As New MailMessage
      oMessage.To.Add(Recipient)
      oMessage.IsBodyHtml = True
      oMessage.Subject = Subject.Trim
      oMessage.Body = HtmlBody.Trim

      Using oClient As New SmtpClient
        oClient.Send(oMessage)
      End Using
    End Using
  End Sub
End Class

언급URL : https://stackoverflow.com/questions/620265/can-i-set-up-html-email-templates-with-asp-net

반응형