Отправка 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;
Автору плюсик, людям, у которых возникают “ошибки” минус – попробуйте сами решить проблему, а не бегите сразу на форум. Лучше потратьте на неё пару дней – но это будет ваша Победа.
Игорь
Спасибо, Ваш пример очень помог
Алексей
Вообще у меня была проблема, никак не отсылалась почта таким способом, а оказалось проблема из-за того, что имя компьютера на русском, поменял имя компьютера всё заработало, но это не решение проблемы. Не все же будут имя менять на наглийское
Sergej
А для чего помещать инфу о файле в сообщение? Признак хорошего тона или от скуки?
Koreshulya
Ребят кто знает почему при отправке письма на yandex или gmail вылитает ошибка “Проверка поддлинности не пройдена”, хотя с mail.ru проблем нету
starostin13
[b]Koreshulya[/b]Smtp.EnableSsl = true; // включение SSL для gmail нужно, для mail.ru не нада.
Народ, через что ещё можно если не через smtp, вот нельзя использовать smtp и всё, у нас в городе включаю фирму для которой делаю, везде блокируеться smtp, не знаю что блин с этим делать, плиз подскажите.
Алексей(admin)
starostin13, можно на сервере создать PHP скрипт для отправки email. И из программы запускать этот скрипт. Конечно это не красиво, но работает!
А можешь через HTTP (HttpWebRequest и HttpWebResponse) авторизоваться на сервере почтового ящика и отправлять. У многих почтовых ящиков есть даже свои API интерфейсы, так что можно попробовать.
А через SMTP и правда не очень удобно. У кого не работает, у кого порт закрыт, у кого вообще весь smtp не работает.
Я думаю – лучше смотри API почтовых серверов(mail.ru, gmail.com).
First_P
Не заработало , но вдохновило . Правда без отправки файла.
SmtpClient Smtp = new SmtpClient(“smtp.mail.ru”, 25);
MailMessage Message = new MailMessage(TextBox1.text.Trim(),TextBox2.text.Trim(),TextBox3.text.Trim(),TextBox4.text.Trim());
Smtp.Send(Message);
А вот вопрос: как определить что сообщение отправлено?
Сейчас вот такой топорный вариант:
…Button1_Click…
TextBox1.Enabled = false;
TextBox2.Enabled = false;
TextBox3.Enabled = false;
TextBox4.Enabled = false;
Button1.Enabled = false;
Label1.Text = “Сообщение отправлено.”;
Manyak_47
Скиньте пожалуйста эту прогу полностью с пространством имен с обозначением класса и т.д.
А ещё если можно напишите как пройти через прокси?
Заранее благодарен!
Алексей
А что никто не освобождает письмо и клиент? Написал себе для тестирования одной старой беды, когда нельзя было отправлять сообщение, если у тебя имя ПК написано кириллицей. В фрэймворке 4 походу эту проблему исправили.
private void btnSendEmail_Click(object sender, RoutedEventArgs e)
{
using (SmtpClient smtpClient = new SmtpClient(“smtp.yandex.ru”, 25))
{
smtpClient.UseDefaultCredentials = true;
smtpClient.PickupDirectoryLocation = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
smtpClient.EnableSsl = true;
smtpClient.Credentials = new NetworkCredential(Login, Password);
MailAddress mailToAddress = new MailAddress(this.txtBoxTo.Text, this.txtBoxShowName.Text, Encoding.UTF8);
using (MailMessage mailMsg = new MailMessage())
{
mailMsg.From = new MailAddress(this.txtBoxFrom.Text);
mailMsg.To.Add(mailToAddress);
mailMsg.Body = txtBoxBody.Text;
mailMsg.Subject = txtBoxSubject.Text;
if (File.Exists(this.txtBoxAttach.Text))
mailMsg.Attachments.Add(new Attachment(this.txtBoxAttach.Text));
mailMsg.BodyEncoding = Encoding.UTF8;
mailMsg.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
smtpClient.Send(mailMsg);
}
}
}
DiLight
2 марта 2011 в 3:16
все работает.
Алексей
спасибо большое!!
Но вопрос по прокси, через прямое соединение все отлично. Но вот через прокси сервер….. опишите если кто справился, заранее благодарен за помощь