powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / SmtpClient, проблема, вскипает мозк, помогите плиз
25 сообщений из 64, страница 1 из 3
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38131711
exec88
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый, плиз хелп по проблеме!

Есть класс для отправки почты

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
    public class MailSender : IDisposable
    {
        SmtpClient SC;
        MailMessage Mess;
        public MailSender(string subj, string body, string F_Att)
        {
            SC = new SmtpClient("192.168.55.55", 25);
            SC.Credentials = new NetworkCredential("username", "password");
            Mess = new MailMessage("mail@mail.ru", "mail@mail.ru");
            Mess.Body = body;
            Mess.Subject = subj;
            Mess.Attachments.Add(new Attachment(F_Att));
        }
        public void Send()
        {
            SC.Send(Mess);
        }
        public void Dispose()
        {            
            GC.SuppressFinalize(this);
        }
    }



В контексте другого класса происходит перебор в foreach элементов DataRow,
который содержит (ну пусть хотя бы ID темы письма - это не суть) и имя файла для отправки.
Вызывается метод Send()

Код: c#
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.
28.
29.
30.
31.
32.
33.
        private void Upl_USZN_NewInst()
        {
            DataTable DT = (DataTable)DM.Get_UplUsznFileList(100000, Convert.ToInt32(Program.SPID));
            string Dir = @"c:\DIR\";
            //DT.Rows:
            //100000 | file1.dbf
            //100001 | file2.dbf
            //100000 | file3.dbf
            //100001 | file4.dbf
            foreach (DataRow R in DT.Rows)
            {                
                    File.WriteAllBytes(Dir + R["FileUpload"].ToString(), Properties.Resources.empty);
                    //подготовка файла для отправки по почте
                    DM.SP_Upload_Uszn(100000, Convert.ToInt32(Program.SPID), Dir, R["FileUpload"].ToString());
                    if (R["SubDivisionID"].ToString() == "100000")
                    {
                        using (MailSender MS = new MailSender("subj0", "", Dir + R["FileUpload"].ToString()))
                        {
                            MS.Send();
                        }
                    }
                    if (R["SubDivisionID"].ToString() == "100001")
                    {
                        using (MailSender MS = new MailSender("subj1", "", Dir + R["FileUpload"].ToString()))
                        {
                            MS.Send();
                        }
                    }
            }
            F_Refresh();
            MessageBox.Show("Файлы выгружены");
            return;
        }



Весь глюк в том, что отправляются ВСЕ письма, кроме последнего письма, соответствующего последней строчке в DataRows.
Причем и это письмо всетаки отправится, если после вызова Upl_USZN_NewInst() сразу закрыть программу.
Если подождать с закрытием программы минуть 5, то письмо не отправится.
В чем проблема?
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38131729
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exec88,

нехорошо реализован класс MailSender

в Dispose нужно сделать SC.Dispose()
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38131740
exec88
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропилexec88,

нехорошо реализован класс MailSender

в Dispose нужно сделать SC.Dispose()

В .Net 3.5 у него нет метода Dispose().
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38131857
exec88
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
exec88,
Спасибо! Помогло. Перестроил под четверку, там есть Dispose();
А что еще некрасиво реализовано в классе?
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38131858
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилнехорошо реализован класс MailSender

+1.
я наследую свой класс от этого шаблона
Код: c#
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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
    public abstract class DisposableTemplate: IDisposable
    {
        #region Implementation of IDisposable (with finalizer)

        ~DisposableTemplate()
        {
            Dispose(false);
        }
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
        private void Dispose(bool disposing)
        {
            if (!IsDisposed)
            {
                if (disposing)
                    DisposeManagedResources();

                DisposeUnmanagedResources();

                IsDisposed = true;
            }
        }

        #endregion

        #region For overrides

        
        protected abstract void DisposeManagedResources();
        protected abstract void DisposeUnmanagedResources(); 

        #endregion

        #region Property

        public bool IsDisposed { get; private set; }

        #endregion
    }



А вообще для приведенной реализации MailSender вообще Dispose не нужно
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
    public class MailSender
    {
        private readonly SmtpClient _sc;
        
        public MailSender(string address, int port, string login, string password)
        {
            _sc = new SmtpClient(address, port);

            if (false == string.IsNullOrEmpty(login))
                _sc.Credentials = new NetworkCredential(login, password);
        }

        public void Send(string from, string to, string subj, string body, string attachement)
        {
            using (var mess = new MailMessage(from, to))
            {
                mess.Body = body;
                mess.Subject = subj;
                mess.Attachments.Add(new Attachment(attachement));

                _sc.Send(mess);
            }
        }
    }
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38131887
exec88
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79, спасибо
А вообще для приведенной реализации MailSender вообще Dispose не нужно
Я его сделал только, чтобы использовать MailSender в конструкции using
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38131909
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exec88,

В методе Dispose нужно сделать
Код: c#
1.
2.
SC.Dispose() и
Mess.Dispose()



(если уж сказали, что убираем за собой - так убираем до конца)
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38131914
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exec88Я его сделал только, чтобы использовать MailSender в конструкции using

Зачем? Если вы используете 3.5 (как изначально написали), то MailSender в конструкции using абсолютно бесполезен.

Если > 3.5, то

Код: c#
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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
    public class MailSender: DisposableTemplate
    {
        private readonly SmtpClient _sc;
        
        public MailSender(string address, int port, string login, string password)
        {
            _sc = new SmtpClient(address, port);

            if (false == string.IsNullOrEmpty(login))
                _sc.Credentials = new NetworkCredential(login, password);
        }

        public void Send(string from, string to, string subj, string body, string attachement)
        {
            using (var mess = new MailMessage(from, to))
            {
                mess.Body = body;
                mess.Subject = subj;
                mess.Attachments.Add(new Attachment(attachement));

                _sc.Send(mess);
            }
        }

        #region Overrides of DisposableTemplate

        protected override void DisposeManagedResources()
        {
            _sc.Dispose();
        }

        protected override void DisposeUnmanagedResources()
        {
            // неуправляемых ресурсов нет, метод пуст
        }

        #endregion
    }
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38131921
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
offtopic:

метод "private void Upl_USZN_NewInst()" демонстрирует все "прелести" работы с DataTable :-)
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38131936
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прикол живёт в потрохах старого фреймворка. TCP соединения c SMTP сервером после отправки почты не закрываются а помещаются в служебный пул.

Если приложение топикстартера закрывается быстро - соединение закрывает клиент,пул очищается штатным путём, сервер получает команду QUIT, всё в порядке

SMTP сервер обычно не любит долго ждать и закрывает соединение на своём конце.
При этом в случае топикстартера не получивши команды QUIT он зачем-то дропает последнее письмо.

Главное - никакой мистики(просто сложилось несколько багофич)

2 exec88: При отправке одиночного письма при авторЕсли подождать с закрытием программы минуть 5, то письмо не отправится.с фреймворком 3.5 - письмо отправляется?
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38131958
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так много раз делать не надо:
R["FileUpload"].ToString()
R["SubDivisionID"].ToString()
один раз присвоили переменной и используете.
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38132014
exec88
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропилexec88,

В методе Dispose нужно сделать
Код: c#
1.
2.
SC.Dispose() и
Mess.Dispose()



(если уж сказали, что убираем за собой - так убираем до конца)
Я это и сделал, только раньше проект был под 3.5, в этой версии метода Dispose Не было.
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38132018
exec88
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ИзопропилПрикол живёт в потрохах старого фреймворка. TCP соединения c SMTP сервером после отправки почты не закрываются а помещаются в служебный пул.

Если приложение топикстартера закрывается быстро - соединение закрывает клиент,пул очищается штатным путём, сервер получает команду QUIT, всё в порядке

SMTP сервер обычно не любит долго ждать и закрывает соединение на своём конце.
При этом в случае топикстартера не получивши команды QUIT он зачем-то дропает последнее письмо.

Главное - никакой мистики(просто сложилось несколько багофич)

2 exec88: При отправке одиночного письма при авторЕсли подождать с закрытием программы минуть 5, то письмо не отправится.с фреймворком 3.5 - письмо отправляется?
одиночного - да
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38132025
exec88
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79так много раз делать не надо:
R["FileUpload"].ToString()
R["SubDivisionID"].ToString()
один раз присвоили переменной и используете.
Согласен, а что там еще не так?
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38132046
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exec88,

На диск точно нужно файлы записывать?
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38132057
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exec88Согласен, а что там еще не так?

Там всё не так, но более точно можно будет сказать, когда увижу код DM.Get_UplUsznFileList, DM.SP_Upload_Uszn

сходу анализ на "100000" слишком громоздкий. может так проще, если всего два значения?
Код: c#
1.
2.
3.
4.
using (MailSender MS = new MailSender(R["SubDivisionID"].ToString() == "100000" ? "subj0" : "subj1", "", Dir + R["FileUpload"].ToString()))
{
    MS.Send();
}
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38132089
exec88
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропилexec88,

На диск точно нужно файлы записывать?
Как вариант. На диске создается пустышка - dbf.
Потом SQL ная хэпэшка записывает в нее данные.
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38132096
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exec88Как вариант. На диске создается пустышка - dbf.
Потом SQL ная хэпэшка записывает в нее данные.
ХП - на диск сама пишет? Жестоко.
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38132108
exec88
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79exec88Согласен, а что там еще не так?

Там всё не так, но более точно можно будет сказать, когда увижу код DM.Get_UplUsznFileList, DM.SP_Upload_Uszn

сходу анализ на "100000" слишком громоздкий. может так проще, если всего два значения?
Код: c#
1.
2.
3.
4.
using (MailSender MS = new MailSender(R["SubDivisionID"].ToString() == "100000" ? "subj0" : "subj1", "", Dir + R["FileUpload"].ToString()))
{
    MS.Send();
}



DM.Get_UplUsznFileList, DM.SP_Upload_Uszn
это методы, которые возвращают результат выполнения ХП.
По поводу анадиза на 100000 - вопрос вообще не принципиальный, т.к. там чуть позже будут не ID,
а конкретные e-mail адреса и все сразу будет подставляться
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38132115
exec88
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропилexec88Как вариант. На диске создается пустышка - dbf.
Потом SQL ная хэпэшка записывает в нее данные.
ХП - на диск сама пишет? Жестоко.
А что - нормуль :-)
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38132131
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exec88а конкретные e-mail адреса и все сразу будет подставляться
Может, когда будет нормальная реализация, тогда и поговорим?

exec88А что - нормуль :-)
Не, не нормуль. Совсем.

Берите прямо с базы данные, кидайте в стрим, и делайте сразу аттачмент

Конструктор Attachment(Stream, ContentType) инициализирует новый экземпляр класса Attachment с указанным потоком и типом содержимого.
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38132182
exec88
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79exec88а конкретные e-mail адреса и все сразу будет подставляться
Может, когда будет нормальная реализация, тогда и поговорим?

exec88А что - нормуль :-)
Не, не нормуль. Совсем.

Берите прямо с базы данные, кидайте в стрим, и делайте сразу аттачмент

Конструктор Attachment(Stream, ContentType) инициализирует новый экземпляр класса Attachment с указанным потоком и типом содержимого.
А как определить ContentType для dbf файла определенной структуры и кодировки dos 866 ?
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38132275
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exec88А как определить ContentType для dbf файла определенной структуры и кодировки dos 866 ?
Content-type: application/octet-stream (от структуры не зависит, просто двоичные данные)
кодировка задаётся собственно в самом dbf
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38132344
exec88
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропилexec88А как определить ContentType для dbf файла определенной структуры и кодировки dos 866 ?
Content-type: application/octet-stream (от структуры не зависит, просто двоичные данные)
кодировка задаётся собственно в самом dbf
так самого то dbf еще нет! А когда он уже будет с данными, то смысла со стримом уже нет, его можно приэттачить по имени файла. Или я неправильно понял?
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38132364
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exec88так самого то dbf еще нет! А когда он уже будет с данными, то смысла со стримом уже нет, его можно приэттачить по имени файла. Или я неправильно понял?

Вас вообще трудно понять :-)

Вы сказали, что дбф формируется хранимкой. Соттветственно, все данные, необходимые для генерации, в этой хранимке доступны. Так почему же вместо ненормальной записи в файл просто не выдать эти данные клиенту в рекодсете?
...
Рейтинг: 0 / 0
25 сообщений из 64, страница 1 из 3
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / SmtpClient, проблема, вскипает мозк, помогите плиз
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]