[c#] ASP.NET에서 HTML / 이메일 템플릿을 설정할 수 있습니까?

나는 상당한 수의 이메일을 보낼 사이트를 만들고 있습니다. 머리글과 바닥 글 텍스트 또는 템플릿을 설정하여 사용자가 필요한 경우 이러한 이메일을 쉽게 편집 할 수 있도록하고 싶습니다.

C # 문자열 리터럴에 HTML을 포함하면보기 흉하고 이스케이프에 대해 걱정해야합니다. 머리글과 바닥 글에 플랫 파일을 포함하는 것은 작동 할 수 있지만 그에 대한 무언가는 옳지 않은 것 같습니다.

어떤 .ASPX식 으로든 페이지를 템플릿으로 사용하고 내 코드에 해당 페이지를 제공하도록 지시하고 이메일에 반환 된 HTML 을 사용하는 것이 이상적인 방법입니다 .

이 작업을 수행하는 좋고 쉬운 방법이 있습니까? 이 문제를 해결하는 더 좋은 방법이 있습니까?

업데이트 됨 :
표준 .aspx 페이지를 전자 메일 템플릿으로 사용할 수있는 답변을 추가했습니다. 평상시처럼 모든 변수를 교체하고 데이터 바인딩 등을 사용하십시오. 그런 다음 페이지의 출력을 캡처하고 짜잔! HTML 이메일이 있습니다!

CAVEAT 업데이트 !!! :
일부 aspx 페이지에서 MailDefinition 클래스를 사용하고 있었지만 실행중인 서버 프로세스 중에이 클래스를 사용하려고하면 실패했습니다. MailDefinition.CreateMailMessage () 메서드가 항상 무언가를하는 것은 아니지만 참조 할 유효한 컨트롤이 필요하기 때문이라고 생각합니다. 이 때문에 aspx 페이지를 사용하는 내 접근 방식이나 ascx 페이지를 사용하는 Mun의 접근 방식을 권장합니다.



답변

이미 여기에 많은 답변이 있지만 이메일 템플릿과 함께 Razor를 사용하는 방법에 대한 훌륭한 기사를 우연히 발견했습니다. Razor는 ASP.NET MVC 3으로 푸시되었지만 MVC는 Razor를 사용하는 데 필요하지 않습니다. 이것은 이메일 템플릿을 수행하는 매우 매끄러운 처리입니다.

기사에서 알 수 있듯이 “Razor의 가장 좋은 점은 이전 버전 (webforms)과 달리 웹 환경과 연결되어 있지 않기 때문에 웹 외부에서 쉽게 호스팅 할 수 있으며 다양한 목적의 템플릿 엔진으로 사용할 수 있다는 것입니다.”

RazorEngine으로 HTML 이메일 생성-Part 01-소개

ASP.NET 외부에서 Razor 템플릿 활용 : 더 이상 HTML 용이 아닙니다!

RazorEngine을 사용하는 ASP.NET의 더 스마트 한 이메일 템플릿

유사한 Stackoverflow QA

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

MVC없이 Razor 사용

asp.net 외부에서 Razor View Engine을 사용할 수 있습니까?


답변

컨트롤을로드 한 다음이를 문자열로 렌더링하고이를 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 의 샘플 이메일 템플릿
.

Foreach 예 :

[날짜 : 12.02.2009] 이름 : 항목 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가 좋은 선택 일 수 있습니다. 이는 .NET 프레임 워크에서 완전히 지원되며 사용자가 해당 파일을 편집하도록 할 수도 있습니다. 이 문서 ( http://www.aspfree.com/c/a/XML/XSL-Transformations-using-ASP-NET/ )는 시작에 유용 할 수 있습니다 (msdn에 대한 자세한 정보가 있음). ScarletGarden에서 말했듯이 NVelocity는 또 다른 좋은 선택이지만 “내장”.NET 프레임 워크 지원 및 플랫폼에 구애받지 않기 때문에 XSLT를 선호합니다.


답변

다음과 같이 할 수도 있습니다.

.aspx 페이지를 만들고 OnLoad 메서드 끝에 넣거나 수동으로 호출합니다.

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

이것에 잠재적 인 문제가 있는지 확실하지 않지만 작동 할 것 같습니다. 이렇게하면 텍스트 대체 만 지원하는 MailDefinition 클래스 대신 모든 기능을 갖춘 .aspx 페이지를 사용할 수 있습니다.