Отчеты являются неотъемлемой частью документооборота, а электронные отчеты – электронного документооборота. Один из основных механизмов распространения электронных отчетов является электронная почта. Пожалуй, все современные генераторы отчетов имеют встроенный почтовый клиент для возможности отправить отчет непосредственно из программы. FastReport.Net – не исключение. Вы можете отправлять отчет в режиме предварительного просмотра, или непосредственно из кода пользовательского приложения. Это удобно, если вы отправляете отчет одному получателю. Хоть и есть возможность добавить множество адресатов, все же это не всегда подходит. Например, когда вы хотите сделать рассылку с указанием имени пользователя: «Дорогой, Иван Иванович…». Поэтому мы рассмотрим пример, как сделать рассылку отчета нескольким адресатам, адреса и имена которых брать из базы данных. Для начала создадим базу данных и таблицу в ней. Например, база данных acces в формате mdb:
Создаем приложение WinForms. На форму добавим две кнопки и текстовые поля для настройки email:
Первая кнопка будет делать рассылку отчета поименно, а вторая – рассылка отчета на список адресов. Вы поймете, как это работает позже, из кода.
Каждое поле имеет значение по умолчанию, при желании можно ввести другое значение.
Создаем источник данных приложения с помощью мастера:
Следуя далее, настраиваем строку подключения к БД и выбираем таблицу:
Добавим в проект ссылку на библиотеку FastReport. Также нам потребуется файл с шаблоном отчета, который мы будем рассылать. Добавим его в проект. Для примера, мы будем использовать отчет text.frx из папки Demo.
Теперь создадим обработчик события нажатия кнопки Direct email:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
using System; using System.Data; using System.Windows.Forms; using FastReport; using FastReport.Utils; using FastReport.Export.Pdf; using FastReport.Export.Email; private void SendReport_Click(object sender, EventArgs e) { Config.ReportSettings.ShowProgress = false; //Disable progress window 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 EmailsDataSet ds = new EmailsDataSet(); EmailsDataSetTableAdapters.CustomerTableAdapter adapter = new EmailsDataSetTableAdapters.CustomerTableAdapter(); adapter.Fill(ds.Customer); DataTable table = ds.Customer; foreach (DataRow row in table.Rows) { SendMessage(report1, pdf, email, row["Email"].ToString(), row["Name"].ToString()); } } |
Здесь мы сначала создаем объект отчета, загружаем в него шаблон, создаем экспорт в PDF и Email. Отчет будет прикреплен к письму в PDF формате.
Далее, мы создаем источник данных, заполняем таблицу данными. Перебираем записи таблицы и для каждой из них отправляем письмо. Конечно, если у вас большой список рассылки, этот способ будет работать медленно. Зато вы можете вставить в текст письма имя клиента.
Как вы заметили, мы вынесли отправку письма в отдельный метод – SendMessage:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public void SendMessage(Report report, PDFExport pdf, EmailExport email, string recipient, string custName) { email.Account.Address = AddressFromTxt.Text; email.Account.Name = SenderNameTxt.Text; email.Account.Host = HostTxt.Text; email.Account.Port = Convert.ToInt16(PortTxt.Text); email.Account.UserName = UserNameTxt.Text; email.Account.Password = PasswordTxt.Text; email.Account.MessageTemplate = "Test"; email.Account.EnableSSL = true; email.Address = recipient; email.Subject = MailSubjectTxt.Text; email.MessageBody = custName is null? MessageTxt.Text : string.Format("Dear, {0}! {1}", custName, MessageTxt.Text); email.Export = pdf; //Set export type email.SendEmail(report); //Send email } |
И для кнопки Send to all создадим обработчик события OnClick:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
private void Send_to_all_Click(object sender, EventArgs e) { Config.ReportSettings.ShowProgress = false; //Disable progress window 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 string emails = ""; EmailsDataSet ds = new EmailsDataSet(); EmailsDataSetTableAdapters.CustomerTableAdapter adapter = new EmailsDataSetTableAdapters.CustomerTableAdapter(); adapter.Fill(ds.Customer); DataTable table = ds.Customer; foreach (DataRow row in table.Rows) { if (emails == "") emails = row["Email"].ToString(); else emails = emails + ", " + row["Email"].ToString(); } SendMessage(report1, pdf, email, emails, null); MessageBox.Show(emails); } |
В отличие от предыдущего кода, здесь мы в цикле добавляем адреса для отправки в переменную, затем передаем ее в метод отправки сообщения. Этот метод работает гораздо быстрее предыдущего, особенно, если список рассылки большой. Судите сами, тут вы отправляете одно письмо, вместо множества.
Таким образом задача рассылки отчета сводится к экспорту в email и отправке письма на каждый адрес из базы.