2014-04-04 6 views
1

MvcMailer을 사용하면 CSS가없는 인라인 스타일 속성으로 이메일이 전송되는 것이 문제입니다.HTML 메일을 보내기 위해 MvcMailer를 사용하는 동안 PreMailer.Net을 사용하여 CSS를 인라인으로 이동하는 방법

PreMailer.Net은 HTML 소스 문자열을 읽을 수있는 CSS 라이브러리이며, CSS를 사용하여 결과 HTML 문자열을 반환합니다.

어떻게 함께 사용할 수 있습니까?

public virtual MvcMailMessage Welcome() 
{ 
    var message = Populate(x => { 
     x.ViewName = "Welcome"; 
     x.To.Add("[email protected]"); 
     x.Subject = "Welcome"; 
    }); 
    message.Body = PreMailer.Net.PreMailer.MoveCssInline(message.Body).Html; 
    return message; 
} 

완료 :

public virtual MvcMailMessage Welcome() 
{ 
    return Populate(x => { 
     x.ViewName = "Welcome"; 
     x.To.Add("[email protected]"); 
     x.Subject = "Welcome"; 
    }); 
} 

답변

5

단순히

업데이트 메일러 클래스 덩어리를 통해 PreMailer.Net 설치 : MvcMailer step-by-step guide에 발판 예제를 사용하여, 우리는 우리의 UserMailer 메일러 클래스에서이 예 방식으로 시작 !

+0

경로와 어려울 수 있습니다. 내 CSS가 (스타일 태그의 내용이있는 부분을 통해) 인 페이지로로드되었습니다. 하지만 그렇게하고 싶지 않으면'MoveCssInline'에 css 매개 변수를 사용하여 스타일 시트를 지정할 수 있어야합니다 - 시도해 보셨습니까? – Zac

+0

CSS를 문자열로 전달한다는 의미입니까? –

3

당신이 다음을 수행해야합니다 (I 권장) 다른보기로 HTML과 텍스트 본문이있는 경우 :

var message = Populate(m => 
    { 
     m.Subject = subject; 
     m.ViewName = viewName; 
     m.To.Add(model.CustomerEmail); 

     m.From = new System.Net.Mail.MailAddress(model.FromEmail); 
    }); 

    // get the BODY so we can process it 
    var body = EmailBody(message.ViewName); 
    var processedBody = PreMailer.Net.PreMailer.MoveCssInline(body, true).Html; 

    // start again with alternate view 
    message.AlternateViews.Clear(); 

    // add BODY as alternate view 
    var htmlView = AlternateView.CreateAlternateViewFromString(processedBody, new ContentType("text/html")); 
    message.AlternateViews.Add(htmlView); 

    // add linked resources to the HTML view 
    PopulateLinkedResources(htmlView, message.LinkedResources); 

주 : 당신은 당신이 텍스트에 대한 상관 없어 생각하더라도 그것은 스팸 필터를 도울 수 있습니다.

이러한 모든 Populate 방법이 혼란 스러울 때 어떤 일이 벌어지고 있는지 더 좋은 아이디어를 얻으려면 source for MailerBase을 읽는 것이 좋습니다.

참고 :이 기능은 실행되지 않을 수도 있지만 아이디어를 얻을 수 있습니다. 모든 img 태그를 구문 분석하고 자동 첨부 파일로 추가하는 코드 (표시되지 않음)가 있습니다.

중요한 부분은 HTML 대체보기를 지우는 것입니다. 텍스트보기에는 .text.cshtml 파일이 있어야합니다.

+0

하지만 대체보기로 텍스트와 HTML을 모두 가지고 있다면 어떻게 될까요? –

0

당신이 ActionMailer.Net (.Next)를 사용하는 경우, 당신은이 작업을 수행 할 수 있습니다 : 당신이 AngleSharp.Network.MimeTypeNames를 사용하여 마음에 들지 않으면, 당신은 단지 "text/html"을 사용할 수 있습니다

protected override void OnMailSending(MailSendingContext context) 
{ 
    if (context.Mail.IsBodyHtml) 
    { 
     var inlineResult = PreMailer.Net.PreMailer.MoveCssInline(context.Mail.Body); 
     context.Mail.Body = inlineResult.Html; 
    } 

    for (var i = 0; i < context.Mail.AlternateViews.Count; i++) 
    { 
     var alternateView = context.Mail.AlternateViews[i]; 
     if (alternateView.ContentType.MediaType != AngleSharp.Network.MimeTypeNames.Html) continue; 

     using (alternateView) // make sure it is disposed 
     { 
      string content; 
      using (var reader = new StreamReader(alternateView.ContentStream)) 
      { 
       content = reader.ReadToEnd(); 
      } 

      var inlineResult = PreMailer.Net.PreMailer.MoveCssInline(content); 
      context.Mail.AlternateViews[i] = AlternateView.CreateAlternateViewFromString(inlineResult.Html, alternateView.ContentType); 
     } 
    } 

    base.OnMailSending(context); 
} 

. AngleSharp는 ActionMailer.Net의 종속물입니다.