Как сделать рассылку отчета на Email из базы данных в WinForms приложении

07.03.2019

Отчеты являются неотъемлемой частью документооборота, а электронные отчеты – электронного документооборота. Один из основных механизмов распространения электронных отчетов является электронная почта. Пожалуй, все современные генераторы отчетов имеют встроенный почтовый клиент для возможности отправить отчет непосредственно из программы. 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 и отправке письма на каждый адрес из базы.

20 ноября 2024

Локализация и смена языков в FastReport VCL

FastReport VCL поддерживает 40 языков для локализации интерфейса и позволяет изменять язык на лету через меню или код, без перекомпиляции.
1 ноября 2024

Новые возможности редактора отчетов FastReport VCL

Рассматриваем новые возможности редактора отчетов: выносные линии, подсветка пересекающихся объектов, обновлённые деревья отчетов и данных.
30 октября 2024

Использование стилей при создании отчетов в FastReport VCL

В статье подробно рассматривается одна из новых возможностей FastReport VCL – применение стилей и страниц стилей.