Saya sedang mengerjakan situs yang akan mengirimkan sejumlah besar email. Saya ingin menyiapkan teks header dan footer, atau mungkin bahkan template untuk memungkinkan pengguna mengedit email ini dengan mudah jika mereka perlu.
Jika saya menyematkan HTML di dalam literal string C #, itu jelek dan mereka harus khawatir tentang pelolosan. Menyertakan file datar untuk header dan footer mungkin berhasil, tetapi ada sesuatu yang terasa tidak benar.
Apa yang ideal untuk menggunakan .ASPX
halaman sebagai template, lalu beri tahu kode saya untuk menyajikan halaman itu, dan gunakan HTML yang dikembalikan untuk email.
Adakah cara yang bagus dan mudah untuk melakukan ini? Apakah ada cara yang lebih baik untuk menyelesaikan masalah ini?
Diperbarui:
Saya menambahkan jawaban yang memungkinkan Anda menggunakan halaman .aspx standar sebagai template email. Cukup ganti semua variabel seperti biasa, gunakan penyatuan data, dll. Kemudian tangkap saja output halaman, dan voila! Anda memiliki email HTML Anda!
DIPERBARUI DENGAN CAVEAT !!!:
Saya menggunakan kelas MailDefinition pada beberapa halaman aspx dengan baik, tetapi ketika mencoba menggunakan kelas ini selama proses server yang sedang berjalan, gagal. Saya percaya itu karena metode MailDefinition.CreateMailMessage () memerlukan kontrol yang valid untuk referensi, meskipun tidak selalu melakukan sesuatu. Karena itu, saya akan merekomendasikan pendekatan saya menggunakan halaman aspx, atau pendekatan Mun menggunakan halaman ascx, yang tampaknya sedikit lebih baik.
new System.Web.UI.Control()
seperti di:mailDefinition.CreateMailMessage("[email protected]", iDictionaryReplacements, new System.Web.UI.Control())
.Jawaban:
Ada banyak sekali jawaban di sini, tetapi saya menemukan artikel bagus tentang cara menggunakan Razor dengan template email. Razor didorong dengan ASP.NET MVC 3, tetapi MVC tidak diperlukan untuk menggunakan Razor. Ini adalah pemrosesan yang cukup apik dalam melakukan templat email
Seperti yang diidentifikasi dalam artikel, "Hal terbaik dari Razor adalah tidak seperti pendahulunya (formulir web), ia tidak terikat dengan lingkungan web, kami dapat dengan mudah menghostingnya di luar web dan menggunakannya sebagai mesin template untuk berbagai tujuan."
Menghasilkan email HTML dengan RazorEngine - Bagian 01 - Pendahuluan
Memanfaatkan Template Razor Di Luar ASP.NET: Ini Bukan Hanya untuk HTML Lagi!
Template email yang lebih cerdas di ASP.NET dengan RazorEngine
QA Stackoverflow serupa
Membuat template menggunakan RazorEngine API baru
Menggunakan Razor tanpa MVC
Apakah mungkin menggunakan Razor View Engine di luar asp.net
sumber
Anda mungkin juga ingin mencoba memuat kontrol, lalu merendernya ke string dan menyetelnya sebagai Badan HTML:
Anda kemudian dapat membuat email Anda seperti biasa:
Kontrol pengguna Anda bisa berisi kontrol lain, seperti header dan footer, dan juga memanfaatkan fungsionalitas seperti data binding.
sumber
Anda dapat mencoba kelas MailDefinition
sumber
Jika Anda ingin meneruskan parameter seperti nama pengguna, nama produk, ... dll. Anda dapat menggunakan mesin template open source NVelocity untuk menghasilkan email / HTML akhir Anda.
Contoh template NVelocity ( MailTemplate.vm ):
Menghasilkan badan email dengan MailTemplate.vm di aplikasi Anda:
Badan email yang dihasilkan adalah:
Untuk mengedit template, mungkin Anda bisa menggunakan FCKEditor dan menyimpan template Anda ke file.
sumber
Komponen email Mail.dll termasuk mesin template email:
Berikut ringkasan sintaks:
Dan kode yang memuat template, mengisi data dari objek c # dan mengirim email:
Anda bisa mendapatkan info lebih lanjut di entri blog mesin template email .
Atau cukup unduh komponen email Mail.dll dan cobalah.
Harap dicatat bahwa ini adalah produk komersial yang saya buat.
sumber
Jika fleksibilitas adalah salah satu prasyarat Anda, XSLT mungkin merupakan pilihan yang baik, yang sepenuhnya didukung oleh .NET framework dan Anda bahkan dapat membiarkan pengguna mengedit file tersebut. Artikel ini ( http://www.aspfree.com/c/a/XML/XSL-Transformations-using-ASP-NET/ ) mungkin berguna sebagai permulaan (msdn memiliki info lebih lanjut tentang itu). Seperti yang dikatakan oleh ScarletGarden, NVelocity adalah pilihan bagus lainnya tetapi saya lebih suka XSLT karena dukungan kerangka kerja .NET "bawaan" dan platform agnostik.
sumber
IXmlSerializable
antarmuka ke kelas saya. Hanya dalam beberapa baris saya dapat meminta kelas saya menyerahkan email.Saya pikir Anda juga bisa melakukan sesuatu seperti ini:
Buat dan .aspx halaman, dan letakkan ini di akhir metode OnLoad, atau panggil secara manual.
Saya tidak yakin apakah ada masalah potensial dengan ini, tetapi sepertinya itu akan berhasil. Dengan cara ini, Anda dapat menggunakan halaman .aspx berfitur lengkap, daripada kelas MailDefinition yang hanya mendukung penggantian Teks.
sumber
Page
, setidaknya saat menggunakan metode ekstensi generik untuk rendering. Jadi saya beralih keUserControl
; lihat jawaban saya di bawah ini. Sejauh ini tampaknya berjalan dengan baik ... Saya tertarik untuk mempelajari bagaimana Anda mengerjakannya saat itu.Tentu Anda dapat membuat template html dan saya akan merekomendasikan juga template teks. Dalam template Anda cukup meletakkan [BODY] di tempat tubuh akan ditempatkan dan kemudian Anda bisa membaca di template dan mengganti tubuh dengan konten baru. Anda dapat mengirim email menggunakan .Nets Mail Class. Anda hanya perlu mengulang pengiriman email ke semua penerima setelah Anda membuat email pada awalnya. Bekerja seperti pesona bagi saya.
sumber
Berikut ini satu lagi alternatif yang menggunakan transformasi XSL untuk templat email yang lebih kompleks: Mengirim email berbasis HTML dari aplikasi .NET .
sumber
Hati-hati saat melakukan ini, filter SPAM tampaknya memblokir html yang dihasilkan ASP.net, tampaknya karena Kondisi Tampilan, jadi jika Anda akan melakukan ini pastikan Html yang dihasilkan bersih.
Saya pribadi akan mempertimbangkan penggunaan Asp.net MVC untuk mencapai hasil yang Anda inginkan. atau NVelocity cukup bagus dalam hal ini
sumber
Anda dapat dengan mudah membuat WebRequest untuk membuka halaman ASPX dan mendapatkan HTML yang dihasilkan. Dengan sedikit lebih banyak pekerjaan, Anda mungkin bisa menyelesaikannya tanpa WebRequest. Sebuah PageParser dan Response.Filter akan memungkinkan Anda untuk menjalankan halaman dan menangkap hasilnya ... meskipun mungkin ada beberapa cara yang lebih elegan.
sumber
Saya memiliki persyaratan serupa pada salah satu proyek di mana Anda harus mengirim sejumlah besar email setiap hari, dan klien menginginkan kontrol penuh atas template html untuk berbagai jenis email.
karena banyaknya email yang akan dikirim, kinerja menjadi perhatian utama.
yang kami temukan adalah konten statis di server sql tempat Anda menyimpan seluruh markup template html (bersama dengan placeholder, seperti [UserFirstName], [UserLastName] yang diganti dengan data nyata pada waktu proses) untuk berbagai jenis email
lalu kami memuat data ini di cache asp.net - jadi kami tidak membaca template html berulang kali - tetapi hanya jika template tersebut benar-benar berubah
kami memberi klien editor WYSIWYG untuk memodifikasi template ini melalui formulir web admin. setiap kali pembaruan dibuat, kami mengatur ulang cache asp.net.
dan kemudian kami memiliki tabel terpisah untuk log email - di mana setiap email yang akan dikirim telah dicatat. tabel ini memiliki bidang yang disebut emailType, emailSent dan numberOfTries.
kami hanya menjalankan pekerjaan setiap 5 menit untuk jenis email penting (seperti pendaftaran anggota baru, lupa kata sandi) yang perlu dikirim secepatnya
kami menjalankan pekerjaan lain setiap 15 menit untuk jenis email yang kurang penting (seperti email promosi, email berita, dll)
dengan cara ini Anda tidak memblokir server Anda yang mengirim email tanpa henti dan Anda memproses email secara berkelompok. setelah email terkirim, setel field emailSent ke 1.
sumber
Perhatikan bahwa solusi aspx dan ascx memerlukan HttpContext saat ini, jadi tidak dapat digunakan secara asinkron (misalnya dalam utas) tanpa banyak pekerjaan.
sumber
Saya pikir jawaban yang mudah adalah MvcMailer. Ini adalah paket NuGet yang memungkinkan Anda menggunakan mesin tampilan favorit Anda untuk menghasilkan email. Lihat paket NuGet di sini dan dokumentasi proyek
Semoga membantu!
sumber
DotLiquid adalah pilihan lain. Anda menentukan nilai dari model kelas sebagai
{{ user.name }}
dan kemudian pada waktu proses Anda memberikan data di kelas itu, dan template dengan markup, dan itu akan menggabungkan nilai untuk Anda. Ini mirip dengan menggunakan mesin template Razor dalam banyak hal. Ini mendukung hal-hal yang lebih kompleks seperti loop dan berbagai fungsi seperti ToUpper. Yang menyenangkan adalah ini "aman" sehingga pengguna yang membuat templat tidak dapat merusak sistem Anda atau menulis kode yang tidak aman seperti yang Anda lakukan di pisau cukur: http://dotliquidmarkup.org/try-onlinesumber
Jika Anda mampu untuk memungkinkan ASPNET dan pengguna terkait izin untuk membaca & menulis file, Anda dapat dengan mudah menggunakan file HTML dengan standar
String.Format()
placeholder ({0}
,{1:C}
, dll) untuk mencapai hal ini.Cukup baca di file, sebagai string, menggunakan kelas dari
System.IO
namespace. Setelah Anda memiliki string itu, teruskan sebagai argumen pertama keString.Format()
, dan berikan parameternya.Simpan string itu, dan gunakan sebagai badan email, dan pada dasarnya Anda sudah selesai. Kami melakukan ini di lusinan situs (yang memang kecil) hari ini, dan tidak memiliki masalah.
Saya harus mencatat bahwa ini bekerja paling baik jika (a) Anda tidak mengirim jutaan email sekaligus, (b) Anda tidak mempersonalisasi setiap email (jika tidak, Anda memakan banyak string) dan (c ) file HTML itu sendiri relatif kecil.
sumber
Setel pesan Email IsBodyHtml = true
Ambil objek Anda yang berisi konten email Anda Serialisasi objek dan gunakan xml / xslt untuk menghasilkan konten html.
Jika Anda ingin melakukan AlternateView, lakukan hal yang sama dengan jmein hanya menggunakan template xslt yang berbeda untuk membuat konten teks biasa.
salah satu keuntungan utama dari ini adalah jika Anda ingin mengubah tata letak Anda, Anda harus memperbarui template xslt.
sumber
Lihat SubSonic (www.subsonicproject.com). Mereka melakukan ini untuk menghasilkan kode - templatnya adalah ASPX standar, dan menghasilkan c #. Metode yang sama dapat digunakan kembali untuk skenario Anda.
sumber
Saya akan menggunakan pustaka template seperti TemplateMachine . ini memungkinkan Anda sebagian besar meletakkan template email Anda bersama dengan teks normal dan kemudian menggunakan aturan untuk memasukkan / mengganti nilai yang diperlukan. Sangat mirip dengan ERB di Ruby. Hal ini memungkinkan Anda untuk memisahkan pembuatan konten email tanpa terlalu mengikat Anda ke sesuatu seperti ASPX dll. Setelah konten dibuat dengan ini, Anda dapat mengirim email.
sumber
Saya suka jawaban Raj. Program seperti ListManager & kerangka kerja seperti DNN melakukan hal serupa, dan jika pengeditan mudah oleh pengguna non-teknis diperlukan, editor WYSIWYG untuk memodifikasi HTML yang disimpan dalam SQL adalah cara yang paling mudah dan lugas untuk dilakukan dan dapat dengan mudah mengakomodasi pengeditan header secara independen dari footer, dll, serta menggunakan token untuk memasukkan nilai secara dinamis.
Satu hal yang perlu diingat jika menggunakan metode di atas (atau yang lainnya, sungguh) adalah menjadi ketat dan berhati-hati tentang jenis gaya dan tag yang Anda izinkan untuk disisipkan oleh editor. Jika menurut Anda browser itu rumit, tunggu saja sampai Anda melihat betapa berbedanya klien email membuat hal yang sama ...
sumber
Mirip dengan jawaban Canavar, tetapi bukannya NVelocity, saya selalu menggunakan " StringTemplate " yang memuat template dari file konfigurasi, atau memuat file eksternal menggunakan File.ReadAllText () dan menetapkan nilainya.
Ini adalah proyek Java tetapi port C # solid dan saya telah menggunakannya di beberapa proyek (hanya menggunakannya untuk template email menggunakan template di file eksternal).
Alternatif selalu bagus.
sumber
Berikut adalah cara sederhana menggunakan kelas WebClient :
Kemudian sebut saja seperti ini:
Tentu saja, CSS Anda perlu diratakan untuk menampilkan gaya halaman web di sebagian besar klien email (seperti Outlook). Jika email Anda menampilkan konten dinamis (mis. Nama Pelanggan), maka saya akan merekomendasikan menggunakan QueryStrings di situs web Anda untuk mengisi data. (mis. http://www.yourwebsite.com?CustomerName=Bob )
sumber
@bardev memberikan solusi yang baik, tetapi sayangnya ini tidak ideal di semua kasus. Punyaku adalah salah satunya.
Saya menggunakan WebForms di Website (saya bersumpah saya tidak akan pernah menggunakan Website lagi - what a PITA) di VS 2013.
Saya mencoba saran Razor, tetapi milik saya adalah Situs Web saya tidak mendapatkan IntelliSense yang sangat penting yang diberikan oleh IDE dalam proyek MVC. Saya juga suka menggunakan desainer untuk template saya - tempat yang sempurna untuk UserControl.
Nix on Razor lagi.
Jadi saya datang dengan kerangka kecil ini sebagai gantinya (tip topi ke @mun untuk UserControl dan @imatoria untuk Pengetikan Kuat). Satu-satunya tempat masalah potensial yang dapat saya lihat adalah Anda harus berhati-hati untuk menjaga nama file .ASCX Anda tetap sinkron dengan nama kelasnya. Jika Anda menyimpang, Anda akan mendapatkan error runtime.
FWIW: Dalam pengujian saya setidaknya panggilan RenderControl () tidak menyukai kontrol Halaman, jadi saya menggunakan UserControl.
Saya cukup yakin saya telah memasukkan semuanya di sini; beri tahu saya jika saya melewatkan sesuatu.
HTH
Pemakaian:
Kelas Dasar:
Kelas "Pabrik":
Kelas Template:
Header ASCX:
ASCX Footer:
Template ASCX:
File Kode Template ASCX:
Pembantu:
sumber
Hanya membuang perpustakaan yang saya gunakan ke dalam campuran: https://github.com/lukencode/FluentEmail
Ini merender email menggunakan RazorLight , menggunakan gaya fasih untuk membuat email, dan mendukung banyak pengirim di luar kotak. Itu datang dengan metode ekstensi untuk ASP.NET DI juga. Mudah digunakan, sedikit pengaturan, dengan teks biasa dan dukungan HTML.
sumber