Как сделать рассылку отчета на 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 и отправке письма на каждый адрес из базы.

.NET FastReport .NET FastReport
10 июля 2026

Как настроить Content Security Policy для отчетов FastReport .NET WEB

Узнайте, как настроить Content Security Policy для отчётов FastReport .NET WEB: обзор директив и значений CSP, изменения в архитектуре FastReport, типичные сценарии обхода и способы защиты.
22 июня 2026

Как настроить отчет с Business Objects из кода и дизайнера в FastReport .NET

В этой статье рассматривается реальный пример создания и использования шаблона отчета .frx для подключения к иерархическим бизнес-объектам в FastReport .NET.
21 апреля 2026

Использование водяных знаков в FastReport VCL

В статье подробно рассмотрели функционал добавления водяных знаков в FastReport VCL — как через визуальный интерфейс, так и программно, с помощью кода на Delphi и в скриптах отчётов.

Не является публичной офертой
© 1998-2026 ООО «Быстрые отчеты»