Почтовый клиент на .Net
Библиотеки для отправки/получения почты?
Библиотеки для отправки/получения почты?[/quote]
Почтовиков на .NET нету (если и есть, то только любительские).
Привожу простой программки для отправки почты, может пригодится кому:
using System.Net.Mail;
static class MailClient
{
static void Main(string[] args)
{
if (args.Length < 4)
{
Console.WriteLine("Синтаксис: mailc.exe [от кого] [кому] [тема] [сообщение]");
return;
}
string mailServerName = "smtphost"; //нужно указать сервер отправки почти. Так как для отправки
//используется Simple Mail Transfer Protocol (SMTP), то обычно выглядит это так: smtp.[имя хоста].ru
//Например: smtp.mail.ru, smtp.rambler.ru и т.д.
string from = args[0];
string to = args[1];
string subject = args[2];
string body = args[3];
try
{
//Ограничиваем срок жизни объекта message
using (MailMessage message = new MailMessage(from, to, subject, body))
{
// Создаём SMTP клиента для передачи сообщения
SmtpClient mailClient = new SmtpClient(mailServerName);
mailClient.UseDefaultCredentials = true; //Используем Windows-аутентификацию
// Отправляеи сообщение
mailClient.Send(message);
}
Console.WriteLine("Сообщение отправлено");
}
catch (FormatException ex)
{
Console.WriteLine(ex.Message);
}
catch (SmtpException ex)
{
Console.WriteLine(String.Format("Ошибка при работе с SMTP протоколом: {0}", ex.Message));
}
}
}
В MSDN написано, что System.Net.Mail только для отправки почти, т.к. SMTP - это Simple Mail Transfer Protocol и по нему нельзя принимать почту. Нам нужен интерфейс с POP3 или IMAP, для берёшь CDO (Collaboration Data Objects) и делаешь всё что надо через Interop. А ещё у нас имеется сокеты, которые вполне нормально представлены в System.Net.Sockets. Возьмём, к примеру, протокол POP3, висит он у нас обычно на 110 порту. Команды POP3 принимает такие:
DELE [message-number] - удалить сообщение под нужным номером
LIST - список сообщений
USER [user-name] - сообщить серваку имя пользователя
PASS [password] - сообщить серваку пароль
QUIT - конец сессии
Остались всякие NOOP, RETR и т.д., они нас не интересуют
TcpClient m_TcpClient = new TcpClient("pop3host", 110);
NetworkStream m_NetStream;
StreamReader m_Reader;
try
{
// инициализация
m_NetStream = m_TcpClient.GetStream(); // сетевой поток
m_Reader = new StreamReader(m_TcpClient.GetStream()); // ассоциируем с ним ридер потока
//Теперь POP3-сервер ожидает авторизацию
//m_Reader.ReadLine()
}
catch (InvalidOperationException err)
{
return (string.Format("Ошибка: {0}", err.ToString()));
}
//Выполняем авторизацию
string m_Data = string.Format("PASS {0}", "пароль") + System.Environment.NewLine;
byte[] szData = System.Text.Encoding.ASCII.GetBytes(m_Data.ToCharArray()); //Преобразуем в строку ASCII
m_NetStream.Write(szData, 0, szData.Length);//Выдаём серваку
m_Data = string.Format("USER {0}", "имя пользователя") + System.Environment.NewLine;
szData = System.Text.Encoding.ASCII.GetBytes(m_Data.ToCharArray()); //Преобразуем в строку ASCII
m_NetStream.Write(szData, 0, szData.Length);
Дальше, разобраться не сложно. Можно взять сокеты Indy.Sockets под .NET от Indy:
http://www.indyproject.org/
Дальше код будет выглядеть так:
pop3.Username = "имя пользователя";
pop3.Password = "пароль";
pop3.Connect("127.0.0.1"); //IP POP3 сервера
int count = pop3.CheckMessages();//Количество сообщений
if (count != 0)
{
Message Msg = new Message();
pop3.Retrieve(1, Msg);
Console.WriteLine(string.Format("Тема: {0}", Msg.Subject));
Console.WriteLine(string.Format("От кого: {0}", Msg.From.Text));
Console.WriteLine(string.Format("Кому: ", Msg.Recipients[0].Text));
Console.WriteLine();
Console.WriteLine(Msg.Body.Text);
}
pop3.Disconnect();
pop3.Dispose();
Console.ReadKey();
Не самое быстрое, но железно надёжное решение - прочитать руководящие документы. У меня локально нет RFC 1939 (кажется, там было), но я уверен, что найти его не так уж сложно. Вообще говоря, важность указывается в заголовке:
X-MSMail-Priority: Normal
Привожу простой программки для отправки почты, может пригодится кому:
using System.Net.Mail;
static class MailClient
{
static void Main(string[] args)
{
if (args.Length < 4)
{
Console.WriteLine("Синтаксис: mailc.exe [от кого] [кому] [тема] [сообщение]");
return;
}
string mailServerName = "smtphost"; //нужно указать сервер отправки почти. Так как для отправки
//используется Simple Mail Transfer Protocol (SMTP), то обычно выглядит это так: smtp.[имя хоста].ru
//Например: smtp.mail.ru, smtp.rambler.ru и т.д.
string from = args[0];
string to = args[1];
string subject = args[2];
string body = args[3];
try
{
//Ограничиваем срок жизни объекта message
using (MailMessage message = new MailMessage(from, to, subject, body))
{
// Создаём SMTP клиента для передачи сообщения
SmtpClient mailClient = new SmtpClient(mailServerName);
mailClient.UseDefaultCredentials = true; //Используем Windows-аутентификацию
// Отправляеи сообщение
mailClient.Send(message);
}
Console.WriteLine("Сообщение отправлено");
}
catch (FormatException ex)
{
Console.WriteLine(ex.Message);
}
catch (SmtpException ex)
{
Console.WriteLine(String.Format("Ошибка при работе с SMTP протоколом: {0}", ex.Message));
}
}
}
привет, инициализировал для пробы вот так:
при выполнении получаю эксепшн -
форма указанной строки не годится для адреса эллектронной почты.
подскажите пж что ему не нравится???
"dsyabl" слабо похож на корректную запись e-mail адреса.
блин, тупанул, думал от кого - имя отправителя а не адресс.
псб
DELE [message-number] - удалить сообщение под нужным номером
LIST - список сообщений
USER [user-name] - сообщить серваку имя пользователя
PASS [password] - сообщить серваку пароль
QUIT - конец сессии
Остались всякие NOOP, RETR и т.д., они нас не интересуют
TcpClient m_TcpClient = new TcpClient("pop3host", 110);
NetworkStream m_NetStream;
StreamReader m_Reader;
try
{
// инициализация
m_NetStream = m_TcpClient.GetStream(); // сетевой поток
m_Reader = new StreamReader(m_TcpClient.GetStream()); // ассоциируем с ним ридер потока
//Теперь POP3-сервер ожидает авторизацию
//m_Reader.ReadLine()
}
catch (InvalidOperationException err)
{
return (string.Format("Ошибка: {0}", err.ToString()));
}
//Выполняем авторизацию
string m_Data = string.Format("PASS {0}", "пароль") + System.Environment.NewLine;
byte[] szData = System.Text.Encoding.ASCII.GetBytes(m_Data.ToCharArray()); //Преобразуем в строку ASCII
m_NetStream.Write(szData, 0, szData.Length);//Выдаём серваку
m_Data = string.Format("USER {0}", "имя пользователя") + System.Environment.NewLine;
szData = System.Text.Encoding.ASCII.GetBytes(m_Data.ToCharArray()); //Преобразуем в строку ASCII
m_NetStream.Write(szData, 0, szData.Length);
Дальше, разобраться не сложно. Можно взять сокеты Indy.Sockets под .NET от Indy:
http://www.indyproject.org/
Дальше код будет выглядеть так:
http://www.indyproject.org/
Дальше код будет выглядеть так:
POP3 pop3 = new POP3();
pop3.Username = "имя пользователя";
pop3.Password = "пароль";
pop3.Connect("127.0.0.1"); //IP POP3 сервера
int count = pop3.CheckMessages();//Количество сообщений
if (count != 0)
{
Message Msg = new Message();
pop3.Retrieve(1, Msg);
Console.WriteLine(string.Format("Тема: {0}", Msg.Subject));
Console.WriteLine(string.Format("От кого: {0}", Msg.From.Text));
Console.WriteLine(string.Format("Кому: ", Msg.Recipients[0].Text));
Console.WriteLine();
Console.WriteLine(Msg.Body.Text);
}
pop3.Disconnect();
pop3.Dispose();
Console.ReadKey();
а что надо подключить??
подключил:
using System.Net.Mail;
10 ошибок выдает:
Error 2 The type or namespace name 'TcpClient' could not be found (are you missing a using directive or an assembly reference?) D:\PROJECT\Project sharp\Maile\Form1.cs 25 41 Maile
Error 3 The type or namespace name 'NetworkStream' could not be found (are you missing a using directive or an assembly reference?) D:\PROJECT\Project sharp\Maile\Form1.cs 26 13 Maile
Error 4 Since 'Maile.Form1.button1_Click(object, System.EventArgs)' returns void, a return keyword must not be followed by an object expression D:\PROJECT\Project sharp\Maile\Form1.cs 38 17 Maile
Error 5 The type or namespace name 'POP3' could not be found (are you missing a using directive or an assembly reference?) D:\PROJECT\Project sharp\Maile\Form1.cs 50 13 Maile
Error 6 The type or namespace name 'POP3' could not be found (are you missing a using directive or an assembly reference?) D:\PROJECT\Project sharp\Maile\Form1.cs 50 29 Maile
Error 7 'System.Windows.Forms.Message' does not contain a definition for 'Subject' and no extension method 'Subject' accepting a first argument of type 'System.Windows.Forms.Message' could be found (are you missing a using directive or an assembly reference?) D:\PROJECT\Project sharp\Maile\Form1.cs 59 66 Maile
Error 8 'System.Windows.Forms.Message' does not contain a definition for 'From' and no extension method 'From' accepting a first argument of type 'System.Windows.Forms.Message' could be found (are you missing a using directive or an assembly reference?) D:\PROJECT\Project sharp\Maile\Form1.cs 60 69 Maile
Error 9 'System.Windows.Forms.Message' does not contain a definition for 'Recipients' and no extension method 'Recipients' accepting a first argument of type 'System.Windows.Forms.Message' could be found (are you missing a using directive or an assembly reference?) D:\PROJECT\Project sharp\Maile\Form1.cs 61 63 Maile
Error 10 'System.Windows.Forms.Message' does not contain a definition for 'Body' and no extension method 'Body' accepting a first argument of type 'System.Windows.Forms.Message' could be found (are you missing a using directive or an assembly reference?) D:\PROJECT\Project sharp\Maile\Form1.cs 63 39 Maile
System.Net.dll нужно добавить в ссылки проекта (referencies).
вижу в спике referencies она уже добавлена:
C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Net.dll
спасиб, на 3 ошибки меньше
дальше указано: Можно взять сокеты Indy.Sockets под .NET от Indy:
что значит взять??
На сайте Indy:
Platforms:
Indy Sockets is available for the following development platforms:
C#
C++
Delphi / Kylix
Visual Basic.NET (and other .NET languages)
Coming Soon: Indy 10 for FreePascal and the Lazarus IDE.
дальше когда иду в загрузку там на выбор для делфи и для билдера
Все-таки нужно подключить голову. ЗАЗ назвал два пути реализации POP3 клиента: 1) руками работаем через TCP соединение или 2) используем стороние библиотеки, например Indy, и для каждого способа привел примерный код.
Действительно - там нету бинарных релизов. На странице проекта написано - хостимся на CodePlex. Библиотеки из исходных текстов вполне собираются (скачал - проверил), правда Temp-приложение не хочет, но его легко починить.
Действительно - там нету бинарных релизов. На странице проекта написано - хостимся на CodePlex. Библиотеки из исходных текстов вполне собираются (скачал - проверил), правда Temp-приложение не хочет, но его легко починить.
человеку не опытному в NET не легко разобрать, тем более там написано далее код выглядит так:
впечатление как-будто это продолжение.
Может есть у кого клиент на С# (интерессует только прием почты)?? А то я еще хз сколько буду розбираться(((
Так? :)
using Head.Brain;
POP3 Client as a C# Class
Imports System.Text
Private client As Net.Sockets.TcpClient
Private sr As IO.StreamReader
Private sw As IO.StreamWriter
Dim ns As Net.Sockets.NetworkStream
Dim otvet As String
Dim nummess As Array
Dim myArr As Array
Dim totmessages As Integer
Dim i As Integer
Dim MessageArr() As String
Sub CheckMail(ByVal server As String, ByVal user As String, ByVal pass As String)
Dim myStr As String = Encoding.ASCII.ToString
'соединяемся с сервером
client = New Net.Sockets.TcpClient
Try
client.Connect(server, 110)
Catch e As Exception
MessageBox.Show("Соединение не установленно" + e.ToString, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly, False)
Return
End Try
ns = client.GetStream
sr = New IO.StreamReader(ns, Encoding.ASCII, True)
sw = New IO.StreamWriter(ns)
otvet = sr.ReadLine()
'отправляем имя пользователя
sw.WriteLine("User " & user & Chr(13) & Chr(10))
sw.Flush()
otvet = sr.ReadLine()
'отправляем пароль
If otvet.Substring(0, 3) = "-ER" Then _
MessageBox.Show("Неверный логин", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly, False)
sw.WriteLine("Pass " & pass & Chr(13) & Chr(10))
sw.Flush()
otvet = sr.ReadLine
If otvet.Substring(0, 4) = "-ER" Then _
MessageBox.Show("Неверный пароль", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly, False)
'узнаем количество писем
sw.WriteLine("stat")
sw.Flush()
otvet = sr.ReadLine()
Debug.Print(otvet)
nummess = otvet.Split(" ")
totmessages = CInt(nummess(1))
'MessageBox.Show("У Вас " & CStr(totmessages) & " новых писем", "Новые письма", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly, False)
End Sub
Sub GetMailsID()
'получаем идеинтификаторы писем
sw.WriteLine("list")
sw.Flush()
otvet = sr.ReadLine()
Debug.Print(otvet)
myArr = otvet.Split(" ")
ReDim MessageArr(totmessages - 1)
For i = 0 To CInt(myArr(1)) - 1
MessageArr(i) = (sr.ReadLine())
Next
End Sub
Sub closeConnection()
'закрываем соединение
sw.WriteLine("quit")
sw.Flush()
otvet = sr.ReadLine()
Debug.Print(otvet)
End Sub
Sub GetMail()
'получаем письма
Dim x As Integer = 0
sr = New IO.StreamReader(ns, Encoding.Default, True)
For i = 0 To (totmessages - 1)
sw.WriteLine("retr " & (i + 1))
sw.Flush()
FileOpen(1, Application.StartupPath & "\mails\Mail" & MessageArr(i) & ".txt", OpenMode.Append, OpenAccess.Write)
Do While otvet <> "."
otvet = sr.ReadLine
Debug.Print(otvet)
Print(1, otvet & vbNewLine)
Loop
FileClose(1)
Next i
End Sub
End Module
Далее остаётся только:
1. парсить ответ
2. определять кодировку письма.
3. Раскодировать сообщение и аттач.