Программирование в Windows | Форма. Отправить электронное письмо

Этот раздел сайта предназначен для программирования программ под Windows. Дается описание различных видов интерфейса, а также можно найти коды на C#, VB.NET, T-SQL. Формы можно скомпилировать в виде Exe или DLL файлов. Это позволит запускать их из разных программ, например, Microsoft Access, Excel и bat файлов

Форма. Отправить электронное письмо

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

Добавить комментарий

Loading