Очень часто при разработке программного обеспечения требуется отправить Email. Например, клиенту при обработке заказа или сотруднику компании с напоминанием об определенных действиях. Для этого и существует эта форма. Она позволяет отправить письмо асинхронно, чтобы не блокировать действия пользователя на экране. Пример такой формы указан ниже.
Основные поля и команды у этой формы такие же как и других аналогичных программ. Например, Email Кому, от Кого, Тема письма, Содержание, Подпись и т.п. Это письмо можно отправить на C# примерно так. Таким образом, Форму не надо заполнять вручную, достаточно из другого интерфейса, Счет, накладная, Сообщение менеджеру и т.п. взять нужные реквизиты и подставить в команду кнопки отправить письмо. Выглядит тестовое письмо так
private static void TestLetterUser()
{
// Отправить письмо
string emailfrom = "from@test.ru";
string[] args = new string[] { "-sendemail",
"-fromemail", emailfrom,
"-toemail", "to@test.ru",
"-subject", "Тема письма",
"-message", "Сообщение в письме".Replace("\r\n",""),
"-setting", "Список"+ ".ivanov" };
string file = "c:\\test.txt";
if (file != "")
{
args = args.Concat(new string[] { "-attachment", file }).ToArray();
}
Application.Run(new FormSendEmail(args));
}
Особенности поля pin
Оно нужно для ввода пароля. Когда введете в это поле правильный код, у Вас отобразится еще 2 вкладки. Одна позволяет настроить почтовый сервер для отправки письма, другая показывает лог всех отправленных писем.
Особенности отправки писем
В результате различных экспериментов выяснилось, что письма лучше отправлять асинхронно, т.к. не всегда получается быстро отправить письмо. Если этого не сделать, то иного возникает эффект подтормаживания интерфейса. Вы пытаетесь что-то сделать на экране, а программа не реагирует на ваши действия. Пример программы на C# указан ниже.
// Отправка почты
public static void Send(TextBox TextBoxLog, int MailID, string strMailFrom, string strMailTo, string subject, string body, string files, bool IsAsync=true, bool IsMyCopy = false, string copyemail="")
{
staticTextBoxLog = TextBoxLog;
SmtpClient client = new SmtpClient();
bool IsBodyHtml = false;
try
{
Info.Email.DS.UtilsReportsDataSetTableAdapters.Utils_MailServersTableAdapter adp = new Info.Email.DS.UtilsReportsDataSetTableAdapters.Utils_MailServersTableAdapter();
Info.Email.DS.UtilsReportsDataSet.Utils_MailServersDataTable tbl = new Info.Email.DS.UtilsReportsDataSet.Utils_MailServersDataTable();
adp.Fill(tbl);
foreach (Info.Email.DS.UtilsReportsDataSet.Utils_MailServersRow row in tbl.Rows)
{
if (row.MailId == MailID)
{
client.Host = row.MailHost; // "168.**.**.**";
MailAddress ma = new MailAddress(strMailFrom, null, System.Text.Encoding.UTF8);
//client.Credentials = new System.Net.NetworkCredential(row.MailLogin, row.MailPassword); // new System.Net.NetworkCredential("test@mail.ru", "***");
client.Credentials = new System.Net.NetworkCredential(ma.Address, row.MailPassword);
client.EnableSsl = row.EnableSsl; // false;
client.Port = row.MailPort; // 25;
client.Timeout = row.TimeOut; // 60;
IsBodyHtml = row.IsHtml;
//Log.Write(TextBoxLog, "OK", "Читаем настройки сервера. MailID=" + MailID);
break;
}
}
}
catch (Exception ex)
{
//throw;
Log.Write(TextBoxLog, "Error", "Send. " + ex.Message);
return;
}
try
{
//Log.Write(TextBoxLog, "OK", "Данные прочитаны успешно. MailID=" + MailID);
// Создаем почтовый адрес
MailAddress MailFrom = null;
foreach (var MailFromOne in strMailFrom.Split(','))
{
string[] m1 = strMailFrom.Split('|');
if (m1.Length == 2)
MailFrom = new MailAddress(m1[0], m1[1], System.Text.Encoding.UTF8);
else
MailFrom = new MailAddress(strMailFrom, null, System.Text.Encoding.UTF8);
break;
}
if (MailFrom == null) return;
// Назначаем сообщение
MailAddress MailTo = null;
string MailAddList = "";
foreach (var MailToOne in strMailTo.Split(','))
{
if (MailTo != null)
{
// Добавляем список рассылки
if (MailAddList != "") MailAddList += ",";
MailAddList += MailToOne;
}
else
{
// Создаем рассылку
string[] m2 = MailToOne.Split('|');
if (m2.Length == 2)
MailTo = new MailAddress(m2[0], m2[1], System.Text.Encoding.UTF8);
else
MailTo = new MailAddress(MailToOne, null, System.Text.Encoding.UTF8);
}
}
if (MailTo == null) return;
// Описываем тело письма
MailMessage message = new MailMessage(MailFrom, MailTo);
if (MailAddList != "") message.To.Add(MailAddList);
message.Body = body;
message.BodyEncoding = System.Text.Encoding.UTF8;
//message.SubjectEncoding = Encoding.GetEncoding(1251);
message.Subject = subject;
message.SubjectEncoding = System.Text.Encoding.UTF8;
message.IsBodyHtml = IsBodyHtml;
if (IsMyCopy == true )
{
if (copyemail == "")
message.Bcc.Add(MailFrom);
else
message.Bcc.Add(copyemail);
}
// Прикрепляем файлы
if (files != null)
{
char[] charSeparators = new char[] { ',', ';' };
foreach (string f in files.Split(charSeparators))
{
if (f != "") message.Attachments.Add(new Attachment(f));
}
}
if (IsAsync==true)
{
// Отправка асинхронной почтой
mailSent = false;
client.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);
string userState = "Асинхронная отправка. Токен = " + MailID;
client.SendAsync(message, userState);
while (mailSent == false)
{
Application.DoEvents();
}
}
else
{
// Отправка обычной почтой
client.Send(message);
Log.Write(TextBoxLog, "OK", "Письмо отправлено успешно");
}
}
catch (Exception ex)
{
Log.Write(TextBoxLog, "Error", string.Format("Send. Ошибка при создании и отправке письма: {0}", ex.Message));
return;
}
}
Вообще можно просто купить эту форму. Ориентировочная Цена 500 рублей. Эту форму можно доработать и вставить в свою программу. Это намного быстрее и дешевле, чем самому придумывать интерфейс.