FastReport教程:如何從.Net Core應(yīng)用程序中的數(shù)據(jù)庫向Email發(fā)送報表
我們已經(jīng)討論過如何將報表發(fā)送到數(shù)據(jù)庫中的一組電子郵件。在本文中,我們將做同樣的事情,但對于.Net Core MVC平臺上的Web應(yīng)用程序。我們的任務(wù)是從某個數(shù)據(jù)庫中獲取電子郵件地址和用戶名列表,并將帶有附加報表的電子郵件發(fā)送到這些郵箱。我們使用MS SQL Server數(shù)據(jù)庫。
創(chuàng)建一個ASP應(yīng)用程序.Net Core MVC應(yīng)用程序。首先,使用NuGet Packages Manager將必要的庫添加到項目中。在一般的nuget存儲庫中,我們找到并安裝包:
- Microsoft.EntityFrameworkCore;
- Microsoft.EntityFrameworkCore.Relational;
- Microsoft.jQuery.Unobtrusive.Ajax;
- jQuery.
從本地存儲庫 - FastReport.Net安裝目錄中的Nuget文件夾,安裝軟件包:
- FastReport.Core;
- FastReport.Web.
現(xiàn)在我們將使用數(shù)據(jù)庫和表的類本質(zhì)創(chuàng)建工作上下文。為此,請打開包控制臺Nuget。打開Tools - > Nuget Package Manager - >Package Manager Console menu(包管理器控制臺菜單)。在控制臺中,鍵入以下命令:
Server=localhost;Database=testdb;Trusted_Connection=True;
Microsoft.EntityFrameworkCore.SqlServer -OutputDir模型 當(dāng)然,在這里您必須指定數(shù)據(jù)庫服務(wù)器的連接字符串和數(shù)據(jù)模型的文件夾(默認(rèn)情況下為Models)。
PM> scaffold-dbcontext“Server = localhost; Database = testdb; Trusted_Connection = True;”
Microsoft.EntityFrameworkCore.SqlServer -OutputDir模型 之后,理論上,應(yīng)該將兩個文件添加到Models文件夾:context和table實體。在我的例子中,這是testdbContext.cs和Emails.cs。 但是,在文件生成期間可能會發(fā)生錯誤:
錯誤MSB4064:“Csc”任務(wù)不支持“SharedCompilationId”參數(shù)。
有一個可設(shè)置的公共實例屬性。 如果發(fā)生這種情況,請在NuGet包管理器中再添加一個包:
Microsoft.Net.Compillers
讓我們馬上將FastReport連接到我們的項目。在Startup.cs文件中,添加以下行:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { … app.UseFastReport(); … }
現(xiàn)在回到數(shù)據(jù)模型。要從數(shù)據(jù)庫中獲取記錄,我們需要創(chuàng)建GetEmails方法。創(chuàng)建用于處理數(shù)據(jù)的類Facade:
namespace WebMailing.Models { public static class Facade { public static ListGetEmails() { using (Models.testdbContext context = new Models.testdbContext()) { var emails = (from adresses in context.Emails select adresses).ToList(); return emails; } } } }
我們來看看'HomeController'控制器吧。在Index方法中,加載報表以在站點的主頁上顯示它:
using System; using System.Collections.Generic; using System.Diagnostics; using Microsoft.AspNetCore.Mvc; using WebMailing.Models; using FastReport; using FastReport.Export.Pdf; using FastReport.Export.Email; using FastReport.Web; … public IActionResult Index() { WebReport webReport = new WebReport(); webReport.Report.Load(Environment.CurrentDirectory + "/text.frx"); ViewBag.WebReport = webReport; return View(); }
我們將添加兩種發(fā)送電子郵件的方法。第一個將在問候語中發(fā)送帶有客戶名稱的私人信件,第二個將向一組地址發(fā)送一個字母。 所以,第一種方法是:
[HttpPost] public ActionResult SendMail() { Report report1 = new Report(); //Create new report object report1.Load(Environment.CurrentDirectory + "/text.frx"); //Load report report1.Prepare(); //Prepare report PDFExport pdf = new PDFExport(); //Cteate PDF export EmailExport email = new EmailExport(); //Create Email export Listemails = Models.Facade.GetEmails(); foreach (Emails item in emails) { SendMessage(report1, pdf, email, item.Email, item.Name); } return View(); }
使用它,我們創(chuàng)建了一個報表,導(dǎo)出為PDF,導(dǎo)出到電子郵件。然后,在循環(huán)中,我們從表中獲取記錄并調(diào)用發(fā)送字母的方法。作為參數(shù),我們傳遞報表對象,導(dǎo)出PDF,導(dǎo)出到電子郵件,電子郵件地址和客戶端名稱。以下是發(fā)送信件的方法:
public void SendMessage(Report report, PDFExport pdf, EmailExport email, string recipient, string custName) { string message = "This is test message."; email.Account.Address = "gromozekaster@yandex.ru"; email.Account.Name = "Test User"; email.Account.Host = "smtp.yandex.ru"; email.Account.Port = 25; email.Account.UserName = "Gromozekaster"; email.Account.Password = "*****"; //Your password email.Account.MessageTemplate = "Test"; email.Account.EnableSSL = true; //email addressee settings email.Address = recipient; email.Subject = "TestMessage"; email.MessageBody = custName is null ? message : string.Format("Dear, {0}! {1}", custName, message); email.Export = pdf; //Set export type email.SendEmail(report); //Send email }
在其中,我們設(shè)置了一個電子郵件客戶端來發(fā)送信件。并立即添加第二種方法,將一個字母發(fā)送到一組地址:
[HttpPost] public ActionResult SendAll() { Report report1 = new Report(); //Create new report object report1.Load(Environment.CurrentDirectory + "/text.frx"); //Load report report1.Prepare(); //Prepare report PDFExport pdf = new PDFExport(); //Cteate PDF export EmailExport email = new EmailExport(); //Create Email export Listemails = Models.Facade.GetEmails(); string addresses = ""; foreach (Emails item in emails) { if (addresses == "") addresses = item.Email; else addresses = addresses + ", " + item.Email; } SendMessage(report1, pdf, email, addresses, null); return View(); }
正如您所看到的,它與之前的方法非常相似,唯一的區(qū)別是在循環(huán)中我們收到所有電子郵件地址,并發(fā)送一次這封信。作為電子郵件參數(shù),我們傳遞一個包含所有電子郵件地址的字符串變量,但我們不傳遞客戶端名稱。
對于SendMail()和SendAll()方法,我們需要創(chuàng)建相同名稱的視圖 - 視圖。 他們的內(nèi)容非常簡單:
@{ ViewBag.Message = "Report was sent"; } @ViewBag.Message
我們只是告知發(fā)送。讓我們轉(zhuǎn)到Index.cshtml視圖。在其中,我們需要添加兩個按鈕來使用不同的方法發(fā)送字母,以及顯示報表:
@{ ViewData["Title"] = "Home Page"; }@await ViewBag.WebReport.Render()
要使用ajax jquery,我們添加了一個指向jquery.min.js腳本的鏈接。接下來,為每個表單添加一個帶有兩個按鈕和兩個腳本的表單。腳本非常簡單 - 從控制器調(diào)用方法并返回結(jié)果視圖。
最后 - 我們從Index方法推導(dǎo)出報表。讓我們運(yùn)行應(yīng)用程序,看看我們的網(wǎng)頁是什么樣的:
我們通過不同的方式發(fā)信:
和:
在第一種情況下,在信函的文本中,我們通過名稱引用客戶端,在第二種情況下,沒有,就這樣。
購買FastReport.Net正版授權(quán),請點擊“咨詢在線客服”喲!