Pracuję nad witryną, która będzie wysyłać znaczną liczbę e-maili. Chcę ustawić zarówno tekst nagłówka, jak i stopki, a może nawet szablony, aby umożliwić użytkownikom łatwą edycję tych wiadomości e-mail, jeśli zajdzie taka potrzeba.
Jeśli osadzę kod HTML wewnątrz literałów ciągów C #, będzie to brzydkie i będą musieli się martwić o ucieczkę. Dołączanie płaskich plików do nagłówka i stopki może działać, ale coś w tym jest po prostu nie tak.
Co byłoby idealne, gdyby .ASPX
w jakiś sposób użyć strony jako szablonu, a następnie po prostu powiedz mojemu kodowi, aby wyświetlał tę stronę, i użyj kodu HTML zwróconego w wiadomości e-mail.
Czy jest na to łatwy i przyjemny sposób? Czy istnieje lepszy sposób rozwiązania tego problemu?
Zaktualizowano:
dodałem odpowiedź, która umożliwia użycie standardowej strony .aspx jako szablonu wiadomości e-mail. Po prostu zamień wszystkie zmienne, tak jak zwykle, użyj wiązania danych itp. Następnie po prostu przechwyć wyjście strony i voila! Masz swój e-mail w formacie HTML!
ZAKTUALIZOWANO Z CAVEAT !!!:
Używałem klasy MailDefinition na niektórych stronach aspx, ale podczas próby użycia tej klasy podczas uruchomionego procesu serwera nie powiodło się. Wydaje mi się, że było tak, ponieważ metoda MailDefinition.CreateMailMessage () wymaga ważnej kontrolki do odniesienia, mimo że nie zawsze coś robi. Z tego powodu poleciłbym moje podejście przy użyciu strony aspx lub podejście Mun przy użyciu strony ascx, które wydaje się nieco lepsze.
new System.Web.UI.Control()
na przykład:mailDefinition.CreateMailMessage("[email protected]", iDictionaryReplacements, new System.Web.UI.Control())
.Odpowiedzi:
Jest tu już mnóstwo odpowiedzi, ale natknąłem się na świetny artykuł o tym, jak używać Razor z szablonami wiadomości e-mail. Razor został wypchnięty za pomocą ASP.NET MVC 3, ale MVC nie jest wymagany do korzystania z Razor. To całkiem sprytne przetwarzanie szablonów wiadomości e-mail
Jak stwierdzono w artykule: „Najlepszą rzeczą w Razor jest to, że w przeciwieństwie do swojego poprzednika (formularzy internetowych) nie jest on powiązany ze środowiskiem internetowym, możemy z łatwością hostować go poza siecią i używać go jako silnika szablonów do różnych celów”.
Generowanie wiadomości e-mail w formacie HTML za pomocą RazorEngine - Część 01 - Wprowadzenie
Wykorzystywanie szablonów Razor poza ASP.NET: nie są one już tylko dla HTML!
Inteligentniejsze szablony wiadomości e-mail w ASP.NET z RazorEngine
Podobna kontrola jakości Stackoverflow
Tworzenie szablonów przy użyciu nowego interfejsu API RazorEngine
Korzystanie z Razor bez MVC
Czy można używać Razor View Engine poza asp.net
źródło
Możesz także spróbować załadować kontrolkę, a następnie wyrenderować ją na ciąg i ustawić jako treść HTML:
Następnie możesz utworzyć swój e-mail w zwykły sposób:
Kontrolka użytkownika może zawierać inne kontrolki, takie jak nagłówek i stopka, a także korzystać z funkcji, takich jak powiązanie danych.
źródło
Możesz wypróbować klasę MailDefinition
źródło
Jeśli chcesz przekazać parametry, takie jak nazwy użytkowników, nazwy produktów itp., Możesz użyć silnika szablonów Open Source NVelocity do tworzenia ostatecznych wiadomości e-mail / HTML.
Przykład szablonu NVelocity ( MailTemplate.vm ):
Generowanie treści wiadomości przez MailTemplate.vm w Twojej aplikacji:
Wynikowa treść wiadomości to:
Do edycji szablonów możesz użyć FCKEditor i zapisać szablony w plikach.
źródło
Składnik poczty e-mail Mail.dll zawiera silnik szablonów wiadomości e-mail:
Oto przegląd składni:
A kod, który ładuje szablon, wypełnia dane z obiektu C # i wysyła e-mail:
Możesz uzyskać więcej informacji na temat wpisu na blogu silnika szablonów wiadomości e-mail .
Lub po prostu pobierz komponent poczty e-mail Mail.dll i spróbuj.
Zwróć uwagę, że jest to produkt komercyjny, który stworzyłem.
źródło
Jeśli elastyczność jest jednym z Twoich wymagań wstępnych, XSLT może być dobrym wyborem, który jest w pełni obsługiwany przez platformę .NET i możesz nawet pozwolić użytkownikowi edytować te pliki. Ten artykuł ( http://www.aspfree.com/c/a/XML/XSL-Transformations-using-ASP-NET/ ) może być przydatny na początek (msdn ma więcej informacji na ten temat). Jak powiedział ScarletGarden, NVelocity to kolejny dobry wybór, ale wolę XSLT ze względu na jego "wbudowaną" obsługę frameworka .NET i niezależność od platformy.
źródło
IXmlSerializable
interfejsu do moich zajęć. Wystarczy kilka linijek, aby moja klasa wysłała wiadomość e-mail.Myślę, że możesz też zrobić coś takiego:
Utwórz stronę i .aspx i umieść to na końcu metody OnLoad lub wywołaj ją ręcznie.
Nie jestem pewien, czy są z tym jakieś potencjalne problemy, ale wygląda na to, że zadziała. W ten sposób możesz użyć w pełni funkcjonalnej strony .aspx zamiast klasy MailDefinition, która obsługuje tylko zamiany tekstu.
źródło
Page
, przynajmniej przy użyciu ogólnej metody rozszerzenia do renderowania. Tak więc przeszedłem naUserControl
; zobacz moją odpowiedź poniżej. Jak na razie wygląda na to, że działa dobrze ... Chciałbym się dowiedzieć, jak wtedy to wypracowałeś.Jasne, że możesz stworzyć szablon html i polecam również szablon tekstowy. W szablonie możesz po prostu umieścić [BODY] w miejscu, w którym miałaby zostać umieszczona treść, a następnie możesz po prostu przeczytać szablon i zastąpić treść nową treścią. Możesz wysłać wiadomość e-mail za pomocą .Nets Mail Class. Musisz tylko zapętlić wysyłanie wiadomości e-mail do wszystkich odbiorców po początkowym utworzeniu wiadomości e-mail. U mnie zadziałało jak urok.
źródło
Oto jeszcze jedna alternatywa, która wykorzystuje przekształcenia XSL do bardziej złożonych szablonów wiadomości e-mail: Wysyłanie wiadomości e-mail w formacie HTML z aplikacji .NET .
źródło
Zachowaj ostrożność, filtry SPAM wydają się blokować wygenerowany przez ASP.net html, najwyraźniej z powodu ViewState, więc jeśli zamierzasz to zrobić, upewnij się, że utworzony kod HTML jest czysty.
Osobiście rozważałbym użycie Asp.net MVC, aby osiągnąć pożądane rezultaty. lub NVelocity jest w tym całkiem niezłe
źródło
Możesz po prostu skonstruować żądanie WebRequest, aby trafić na stronę ASPX i uzyskać wynikowy kod HTML. Przy odrobinie pracy prawdopodobnie można to zrobić bez WebRequest. PageParser i Response.Filter pozwolą ci uruchomić stronę i przechwycić wynik ... chociaż mogą istnieć bardziej eleganckie sposoby.
źródło
Miałem podobne wymaganie w przypadku 1 z projektów, w których każdego dnia trzeba było wysyłać ogromną liczbę e-maili, a klient chciał mieć pełną kontrolę nad szablonami HTML dla różnych typów wiadomości e-mail.
ze względu na dużą liczbę e-maili do wysłania głównym problemem była wydajność.
to, co wymyśliliśmy, to statyczna zawartość na serwerze sql, gdzie zapisujesz całe znaczniki szablonu html (wraz z miejscami, takimi jak [UserFirstName], [UserLastName], które są zastępowane prawdziwymi danymi w czasie wykonywania) dla różnych typów wiadomości e-mail
następnie załadowaliśmy te dane do pamięci podręcznej asp.net - więc nie czytamy w kółko szablonów html - ale tylko wtedy, gdy zostaną faktycznie zmienione
daliśmy klientowi edytor WYSIWYG do modyfikowania tych szablonów za pośrednictwem formularza internetowego administratora. po dokonaniu aktualizacji resetujemy pamięć podręczną asp.net.
a potem mieliśmy oddzielną tabelę dla dzienników poczty e-mail - gdzie każdy wysłany e-mail był rejestrowany. ta tabela zawiera pola o nazwach emailType, emailSent i numberOfTries.
po prostu uruchamialiśmy zadanie co 5 minut dla ważnych typów wiadomości e-mail (takich jak rejestracja nowego członka, zapomniałem hasła), które należy wysłać jak najszybciej
co 15 minut wykonywaliśmy kolejne zadanie dla mniej ważnych typów wiadomości e-mail (takich jak e-maile promocyjne, e-maile z wiadomościami itp.)
w ten sposób nie blokujesz wysyłania nieprzerwanych e-maili przez serwer i przetwarzasz je wsadowo. po wysłaniu wiadomości e-mail ustaw w polu emailSent wartość 1.
źródło
Należy pamiętać, że rozwiązania aspx i ascx wymagają bieżącego HttpContext, więc nie można ich używać asynchronicznie (np. W wątkach) bez dużego nakładu pracy.
źródło
Myślę, że łatwą odpowiedzią jest MvcMailer. Jest to pakiet NuGet, który umożliwia używanie ulubionego silnika widoku do generowania wiadomości e-mail. Zobacz pakiet NuGet tutaj i dokumentację projektu
Mam nadzieję, że to pomoże!
źródło
DotLiquid to kolejna opcja. Określasz wartości z modelu klasy,
{{ user.name }}
a następnie w czasie wykonywania podajesz dane w tej klasie i szablon ze znacznikami, a wartości zostaną scalone za Ciebie. Jest to podobne do używania silnika szablonów Razor na wiele sposobów. Obsługuje bardziej złożone rzeczy, takie jak pętle i różne funkcje, takie jak ToUpper. Fajne jest to, że są one „bezpieczne”, więc użytkownik, który tworzy szablony, nie może zawiesić systemu ani napisać niebezpiecznego kodu, tak jak w przypadku Razor: http://dotliquidmarkup.org/try-onlineźródło
Jeśli jesteś w stanie pozwolić pozwolenie ASPNET i związane z nimi użytkownikom na odczyt i zapis pliku, można łatwo korzystać z pliku HTML przy użyciu standardowych
String.Format()
elementów zastępczych ({0}
,{1:C}
etc.) do osiągnięcia tego celu.Tylko wczytywane w pliku jako ciąg znaków, przy użyciu klas z
System.IO
przestrzeni nazw. Gdy już masz ten ciąg, przekaż go jako pierwszy argument doString.Format()
i podaj parametry.Zachowaj ten ciąg i używaj go jako treści wiadomości e-mail. W zasadzie gotowe. Robimy to obecnie na dziesiątkach (co prawda małych) witrynach i nie mieliśmy żadnych problemów.
Powinienem zauważyć, że działa to najlepiej, jeśli (a) nie wysyłasz milionów e-maili na raz, (b) nie personalizujesz każdego e-maila (w przeciwnym razie zjadasz tonę ciągów) i (c ) sam plik HTML jest stosunkowo mały.
źródło
Ustaw zestaw Wiadomość e-mail IsBodyHtml = true
Weź swój obiekt, który zawiera treść wiadomości e-mail Serializuj obiekt i użyj xml / xslt do wygenerowania treści html.
Jeśli chcesz zrobić AlternateViews, zrób to samo, co jmein używa tylko innego szablonu xslt do tworzenia zwykłej zawartości tekstowej.
Jedną z głównych zalet jest to, że jeśli chcesz zmienić układ, wystarczy zaktualizować szablon xslt.
źródło
Spójrz na SubSonic (www.subsonicproject.com). Robią dokładnie to, aby wygenerować kod - szablon jest standardowym ASPX i wyprowadza C #. Ta sama metoda byłaby wielokrotnego użytku w Twoim scenariuszu.
źródło
Używałbym biblioteki szablonów, takiej jak TemplateMachine . pozwala to przeważnie umieścić szablon wiadomości e-mail razem ze zwykłym tekstem, a następnie użyć reguł do wstrzykiwania / zastępowania wartości w razie potrzeby. Bardzo podobny do ERB w Rubim. Pozwala to oddzielić generowanie treści wiadomości e-mail bez zbytniego wiązania się z czymś takim jak ASPX itp., A po wygenerowaniu treści za pomocą tego można wysłać e-mail.
źródło
Podoba mi się odpowiedź Raja. Programy takie jak ListManager i frameworki, takie jak DNN, robią podobne rzeczy, a jeśli wymagana jest łatwa edycja przez nietechnicznych użytkowników, edytory WYSIWYG do modyfikowania HTML przechowywanego w SQL są przeważnie łatwym, prostym sposobem i mogą łatwo edytować nagłówki niezależnie od stopek, itp., a także za pomocą tokenów do dynamicznego wstawiania wartości.
Jedną rzeczą, o której należy pamiętać, jeśli używasz powyższej metody (lub innej, naprawdę), jest ścisłe i ostrożne wybieranie typów stylów i tagów, które możesz wstawiać redaktorom. Jeśli uważasz, że przeglądarki są wybredne, poczekaj, aż zobaczysz, jak inaczej klienci poczty e-mail renderują to samo ...
źródło
Podobnie jak odpowiedź Canavara, ale zamiast NVelocity zawsze używam „ StringTemplate ”, do którego szablon z pliku konfiguracyjnego lub ładuję plik zewnętrzny za pomocą File.ReadAllText () i ustawiam wartości.
To projekt Java, ale port C # jest solidny i użyłem go w kilku projektach (właśnie użyłem go do tworzenia szablonów wiadomości e-mail przy użyciu szablonu w zewnętrznym pliku).
Alternatywy są zawsze dobre.
źródło
Oto prosty sposób wykorzystania klasy WebClient :
Następnie nazwij to tak:
Oczywiście CSS będzie musiał być wbudowany, aby pokazać style strony internetowej w większości klientów poczty e-mail (takich jak Outlook). Jeśli Twój e-mail wyświetla dynamiczną zawartość (np. Nazwę klienta), to polecam użycie QueryStrings w Twojej witrynie do wypełnienia danych. (np. http://www.yourwebsite.com?CustomerName=Bob )
źródło
@bardev zapewnia dobre rozwiązanie, ale niestety nie jest ono idealne we wszystkich przypadkach. Mój był jednym z nich.
Używam formularzy internetowych na stronie internetowej (przysięgam, że nigdy więcej nie użyję strony internetowej - co za PITA) w VS 2013.
Wypróbowałem sugestię Razor, ale będąc stroną internetową, nie dostałem najważniejszego IntelliSense, który IDE zapewnia w projekcie MVC. Lubię też używać projektanta do moich szablonów - idealne miejsce na UserControl.
Znowu Nix na Razor.
Więc zamiast tego wymyśliłem ten mały framework (porady dotyczące kapeluszy dla @mun dla UserControl i @imatoria dla silnego pisania). Jedynym potencjalnym problemem, jaki widzę, jest to, że musisz uważać, aby nazwa pliku .ASCX była zsynchronizowana z nazwą klasy. Jeśli zbłądzisz, pojawi się błąd wykonania.
FWIW: W moich testach przynajmniej wywołanie RenderControl () nie lubi kontrolki Page, więc wybrałem UserControl.
Jestem prawie pewien, że zawarłem tutaj wszystko; daj mi znać, jeśli coś pominąłem.
HTH
Stosowanie:
Klasa podstawowa:
Klasa „fabryki”:
Klasa szablonu:
Nagłówek ASCX:
Stopka ASCX:
Szablon ASCX:
Plik kodu szablonu ASCX:
Pomocnicy:
źródło
Po prostu wrzucam bibliotekę, której używam do miksu: https://github.com/lukencode/FluentEmail
Renderuje wiadomości e-mail za pomocą RazorLight , używa stylu płynnego do tworzenia wiadomości e-mail i obsługuje wielu nadawców po wyjęciu z pudełka. Zawiera również metody rozszerzające dla ASP.NET DI. Prosty w użyciu, niewielka konfiguracja, z obsługą zwykłego tekstu i HTML.
źródło