Отправка E-Mail
Отправить почту можно на прямую работая с SMTP сервером, отправляя ему команды, а можно воспользоваться готовыми библиотеками, которые делают то же самое. Ну есть ещё пару способов, но они не такие уж и интересные.
Помню раньше, на C++ я реализовывал отправку почты через сокеты, отправляя команды на SMTP сервер, если найду то выложу.
Существует одна проблема, дело в том, что все SMTP сервера требуют авторизации, для отправки почты, а некоторые ещё и требуют некоторую спецификацию, заключающую в том, что бы сначала получить почту, а потом только отправить. И порой бывает, что везде по разному. Работая напрямую с SMTP сервером будет достаточно сложно это учесть, поэтому, лучше воспользваться специальными библиотеками.
В Microsoft .NET Framework есть специальная библиотека, через которую и можно отправить электронную почту E-mail.
Итак начнём, для начало нужно подключить пространства имён
//E-mail using using System.Web; using System.Net; using System.Net.Mail; using System.Net.Mime;
А вот уже и сама отправка, привёл пример, для отправки письма с вложением.
//Авторизация на SMTP сервере SmtpClient Smtp = new SmtpClient("smtp.mail.ru", 25); Smtp.Credentials = new NetworkCredential("login", "pass"); //Smtp.EnableSsl = false; //Формирование письма MailMessage Message = new MailMessage(); Message.From = new MailAddress("from@mail.ru"); Message.To.Add(new MailAddress("to@mail.ru")); Message.Subject = "Заголовок"; Message.Body = "Сообщение"; //Прикрепляем файл string file = "C:\\file.zip"; Attachment attach = new Attachment(file, MediaTypeNames.Application.Octet); // Добавляем информацию для файла ContentDisposition disposition = attach.ContentDisposition; disposition.CreationDate = System.IO.File.GetCreationTime(file); disposition.ModificationDate = System.IO.File.GetLastWriteTime(file); disposition.ReadDate = System.IO.File.GetLastAccessTime(file); Message.Attachments.Add(attach); Smtp.Send(Message);//отправка
Как видно, тут идёт отправка через почтовый SMTP сервер Mail.ru. Но у Mail.ru есть несколько серверов mail.ru, bk.ru, list.ru, поэтому если почтовый ящик для авторизации на bk.ru, то и в SmtpClient нужно писать smtp.bk.ru
Что можно ещё почитать:

Алексей(admin)
Жесть, сейчас сидел проверял этот код, а он никак не отсылает. Я так и сяк, никак! А потом вспомнил, что у меня провайдер блокирует доступ к SMTP серверам, но предоставляет свой.
Михаил
Всё отлично рабртает. Спасибо.
BupycHuk
люди у меня вот такая ошибка
System.Net.Mail.SmtpException: Сбой при отправке сообщения электронной почты. —> System.Net.WebException: Невозможно разрешить удаленное имя: ’smtp.mail.ru’
в System.Net.ServicePoint.GetConnection(PooledStream PooledStream, Object owner, Boolean async, IPAddress& address, Socket& abortSocket, Socket& abortSocket6, Int32 timeout)
в System.Net.PooledStream.Activate(Object owningObject, Boolean async, Int32 timeout, GeneralAsyncDelegate asyncCallback)
в System.Net.PooledStream.Activate(Object owningObject, GeneralAsyncDelegate asyncCallback)
в System.Net.ConnectionPool.GetConnection(Object owningObject, GeneralAsyncDelegate asyncCallback, Int32 creationTimeout)
в System.Net.Mail.SmtpConnection.GetConnection(String host, Int32 port)
в System.Net.Mail.SmtpTransport.GetConnection(String host, Int32 port)
в System.Net.Mail.SmtpClient.GetConnection()
в System.Net.Mail.SmtpClient.Send(MailMessage message)
— Конец трассировки внутреннего стека исключений —
в System.Net.Mail.SmtpClient.Send(MailMessage message)
в Email.Form1.button1_Click(Object sender, EventArgs e) в C:\Documents and Settings\Admin\Мои документы\Visual Studio 2008\Projects\Email\Email\Form1.cs:строка 60
а вот и код
SmtpClient Smtp = new SmtpClient(”smtp.mail.ru”, 2525);
try
{
Smtp.Credentials = new NetworkCredential(NameTXT.Text, PassTXT.Text);
}
catch
{
MessageBox.Show(”Неправильный логин или пароль”);
return;
}
MailMessage Message = new MailMessage();
try
{
Message.From = new MailAddress(NameTXT.Text + “@” + listBox1.SelectedItem.ToString());
}
catch
{
MessageBox.Show(”Что то с сообщением”);
}
try
{
for (int i = 0; i < listBox2.Items.Count; i++)
Message.To.Add(new MailAddress(listBox2.Items[i].ToString()));
}
catch
{
MessageBox.Show(”Что то с сообщением2″);
}
Message.Subject = SubjectTXT.Text;
Message.Body = MessageTXT.Text;
try
{
Smtp.Send(Message);
}
catch (Exception s)
{
MessageTXT.Text = s.ToString();
MessageBox.Show(s.ToString());
}
И
это для прямого соединения с инетом, а если через прокси сервер скажем с портом 8080?
yizhack
спасибо
Сергей
Автору респект! Пол дня ломал голову с сокетами, пока не наткнулся на эту статью!
Eugene
Люди, помогите, очень нужна такая прога, но попробовал скомпилировать и выбило:
Компилятор Microsoft (R) Visual C# 2008 версии 3.5.30729.1
для Microsoft (R) .NET Framework версии 3.5
(C) Корпорация Майкрософт (Microsoft Corp.). Все права защищены.
SMTP1.cs(5,1): error CS0116: Пространство имен напрямую не включает в себя таких
членов, как поля или методы
SMTP1.cs(5,27): error CS1518: Ожидался класс, делегат, перечисление, интерфейс
или структура
SMTP1.cs(6,35): error CS1518: Ожидался класс, делегат, перечисление, интерфейс
или структура
SMTP1.cs(7,57): error CS1518: Ожидался класс, делегат, перечисление, интерфейс
или структура
SMTP1.cs(8,32): error CS1518: Ожидался класс, делегат, перечисление, интерфейс
или структура
SMTP1.cs(9,32): error CS1518: Ожидался класс, делегат, перечисление, интерфейс
или структура
AntiDimka
Спасибо за пример - мне лично очень помогло.
Все наиболее упрощено и работает!
Автору респект!
Reliable aka ReliableS
Хороший пример. Жаль не наткнулся на него, когда только начинал отсваивать пространство имен
using System.Net;
Автору плюсик, людям, у которых возникают “ошибки” минус - попробуйте сами решить проблему, а не бегите сразу на форум. Лучше потратьте на неё пару дней - но это будет ваша Победа.
Игорь
Спасибо, Ваш пример очень помог
Алексей
Вообще у меня была проблема, никак не отсылалась почта таким способом, а оказалось проблема из-за того, что имя компьютера на русском, поменял имя компьютера всё заработало, но это не решение проблемы. Не все же будут имя менять на наглийское