Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.08.2009, 16:28   #1
musomoh
Пользователь
 
Регистрация: 17.08.2009
Сообщений: 11
По умолчанию Отправка почты по SMTP на C#, FW ver.3.5

"Люди добрые, помогите! Сами мы не местные"... Не местные в том смысле, что я не программист, но иногда приходится этим заниматься. Проблема такая: при анализе текстовых файлов, при обнаружении определённой комбинации символов надо автоматически послать письмо. Программа отправки сообщения выглядит так:
Код:
using System.Net;
using System.Net.Mail;

private void SendMyPost()
{
MailMessage = post_mess = new MailMessage();
post_mess.From = new MailAddress("адрес_отправителя");
post_mess.To.Add(new MailAddress("адрес_получателя");
post_mess.Subject = "тема_сообщения";
post_mess.Body = "текст_сообщения";

SmtpClient client = new SmtpClient("почтовый сервер");
client.Credentials = CredentialCach.DefaultNetworkCredentials;
try { client.Send(post_mess); }
catch (Exception e) { MessageBox.Show(e.ToString(), .......); }

// Для краткости:
private void button1_Click(object sender, EventArgs e)
{
SendMyPost();
}
}
Проблема: сообщения отправляются, хоть десять, но только после закрытия формы. Все остальные функции (запись в базу и т.д.) выполняются, как положено. Как сделать так, чтобы сообщения отправлялись без закрытия формы?
musomoh вне форума Ответить с цитированием
Старый 18.08.2009, 17:34   #2
musomoh
Пользователь
 
Регистрация: 17.08.2009
Сообщений: 11
По умолчанию Извините за ошибки в примере кода

Код:
using System.Net;
using System.Net.Mail;

private void SendMyPost()
{
MailMessage post_mess = new MailMessage();
post_mess.From = new MailAddress("адрес_отправителя");
post_mess.To.Add(new MailAddress("адрес_получателя");
post_mess.Subject = "тема_сообщения";
post_mess.Body = "текст_сообщения";

SmtpClient client = new SmtpClient("почтовый сервер");
client.Credentials = CredentialCach.DefaultNetworkCredentials;
try { client.Send(post_mess); }
catch (Exception e) { MessageBox.Show(e.ToString()); }
}

// Для краткости:
private void button1_Click(object sender, EventArgs e)
{
SendMyPost();
}

Последний раз редактировалось MaTBeu; 23.08.2009 в 05:35.
musomoh вне форума Ответить с цитированием
Старый 18.08.2009, 19:25   #3
OrdJONY
.NET-чик
Форумчанин
 
Аватар для OrdJONY
 
Регистрация: 24.03.2007
Сообщений: 569
По умолчанию

Может быть попробовать отправлять методом SendAsync?
"Разработка под веб - как работа с пылесосом: нихрена не прикольно, но засасывает"
Мо маленький городок
OrdJONY вне форума Ответить с цитированием
Старый 18.08.2009, 19:50   #4
musomoh
Пользователь
 
Регистрация: 17.08.2009
Сообщений: 11
По умолчанию

Пробовал. Результат тот же.
musomoh вне форума Ответить с цитированием
Старый 22.08.2009, 00:39   #5
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

На Vb.net с программы отправляю так
Добавить в Референсы Мicrosoft CDO for Windows 2000
Работает нормально
Код:
Imports ADODB

Imports CDO

 Private Sub Отправка
Dim oMsg As CDO.Message = New CDO.Message
        Dim iConfg As CDO.Configuration
        Dim oFields As ADODB.Fields
        Dim oField As ADODB.Field
       
   
     
        Try
            iConfg = oMsg.Configuration
            oFields = iConfg.Fields

            oField = oFields("http://schemas.microsoft.com/cdo/configuration/sendusing")
            oField.Value = 2   ' CDO.CdoConfiguration.cdoSMTPServer 



            oMsg.Configuration = iConfg

            oMsg.TextBody = "текст тела письма" 

            oMsg.Subject = "Текст темы"
            oField = oFields("http://schemas.microsoft.com/cdo/configuration/smtpserver")
            oField.Value = "mail.rambler.ru"  ' имя почтового сервера 

            oField = oFields("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate")
            oField.Value = "1" ' без аутентификации  0

            oField = oFields("http://schemas.microsoft.com/cdo/configuration/sendusername")
            oField.Value = "Логин"

            oField = oFields("http://schemas.microsoft.com/cdo/configuration/sendpassword")
            oField.Value = "Пароль"



            oMsg.From = "Логин@rambler.ru"

            oMsg.To = "Получатель@rambler.ru,Получатель1@rambler.ru"   '  Сколько угодно,только не себе



            oFields.Update()
            'Добавляем вложенный  файл 

             oMsg.AddAttachment("С:\Файл.dat")



            oMsg.Send()

        Catch ex As Exception
            If Err.Number = -2147220973 Then
                MsgBox("Отсутствует связь с интернетом", MsgBoxStyle.Critical)
            End If
            If Err.Number = -2147220975 Then
                MsgBox("SMTP сервер ответил отказом", MsgBoxStyle.Critical)
            End If
            MsgBox("Письмо не отправлено адресату", MsgBoxSt 

    Exit Sub


        End Try
 End Sub
Анализ,обработка данных Недорого

Последний раз редактировалось doober; 22.08.2009 в 11:49.
doober вне форума Ответить с цитированием
Старый 23.08.2009, 11:54   #6
musomoh
Пользователь
 
Регистрация: 17.08.2009
Сообщений: 11
По умолчанию

Спасибо всем, кто откликнулся. Код, оказывается, работает, но отправка сообщения происходит примерно через минуту. Почему - не понятно. О чём прога с сервером так долго договаривается? При закрытии окна, думаю, вызывается деструктор и все "отложенные" задачи выполняютя форсированно. Чтобы изменять текст сообщения, надо модифицировать код следующим образом:
Код:
using System.Net;
using System.Net.Mail;

        public static void DoSendMail(string smtpServer, string from, string to, string subject, string body)
        {
            
/*MessageBox.Show("Сервер: " + smtpServer + "\r\n" + 
                            "От: " + from + "\r\n" +
                            "Для: " + to + "\r\n" +
                            "Тема: " + subject + "\r\n" +
                            "Сообщение:" + body); */

            MailMessage post_mess = new MailMessage();
            post_mess.From = new MailAddress(from);
            post_mess.To.Add(new MailAddress(to));
            post_mess.Subject = subject;
            post_mess.Body = body;

            SmtpClient client = new SmtpClient(smtpServer);
            // Работает одинаково и без нижеследующего и с ним
            //client.DeliveryMethod = SmtpDeliveryMethod.Network;
            //client.Credentials = CredentialCache.DefaultNetworkCredentials;
            try
            {
                client.Send(post_mess);
            }
            catch (Exception e)
            {
                MessageBox.Show("Ошибка! " + e.ToString());
            }

        }

private void button1_Click(object sender, EventArgs e)
        {
            smtpServer = "имя_сервера";
            from = "адрес_отправителя";
            to = "адрес_получателя";
            subject = textBox1.Text;
            body = textBox2.Text;
            
            Post myPost = new Post();
            Post.DoSendMail(smtpServer, from, to, subject, body);
            
        }
Как любил говорить Волк Зайцу: "Давай не будем торопиться."
musomoh вне форума Ответить с цитированием
Старый 23.08.2009, 12:00   #7
musomoh
Пользователь
 
Регистрация: 17.08.2009
Сообщений: 11
По умолчанию

Опять, блин, поторопился...
DoSendMail, естественно, является методом класса Post
Код:
public class Post
{

}
musomoh вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отправка почты Fo][ Работа с сетью в Delphi 1 20.01.2009 23:15
отправка почты? gusluk Работа с сетью в Delphi 2 17.11.2008 07:45
Отправка почты (smtp) через proxy dimonbest Работа с сетью в Delphi 9 20.06.2008 14:07
Отправка через SMTP Hottabych Работа с сетью в Delphi 3 09.02.2008 15:18
Отправка почты Mikola PHP 4 12.08.2007 04:17