Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Почтовый клиент на .Net

11K
07 июня 2006 года
Ands
13 / / 08.03.2006
Кто-нибудь знает, есть ли почтовые клиенты на платформе .Net?
422
07 июня 2006 года
Dimarik
181 / / 12.02.2005
В смысле типа Outlook Express, или что?
713
07 июня 2006 года
Ap0k
360 / / 13.03.2006
Что именно интересует?
Библиотеки для отправки/получения почты?
273
10 июня 2006 года
3A3-968M
1.2K / / 22.12.2005
[quote=Ap0k]Что именно интересует?
Библиотеки для отправки/получения почты?[/quote]
Почтовиков на .NET нету (если и есть, то только любительские).
Привожу простой программки для отправки почты, может пригодится кому:

Код:
using System;
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));
}
}
}
16K
14 июня 2006 года
wildc
1 / / 08.02.2006
Этот код ЛЮБОЙ может выдрать из МСДН. Ты лучше нашёл бы там как забрать почту!!!!
273
14 июня 2006 года
3A3-968M
1.2K / / 22.12.2005
[quote=wildc]Этот код ЛЮБОЙ может выдрать из МСДН. Ты лучше нашёл бы там как забрать почту!!!![/quote]
В 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 и т.д., они нас не интересуют

Код:
// POP3 у нас на 110 порту
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 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();
1.9K
31 марта 2008 года
tva94
115 / / 01.05.2007
Как получить важность письма, подскажите плз
241
04 апреля 2008 года
Sanila_san
1.6K / / 07.06.2005
Цитата:
Как получить важность письма, подскажите плз

Не самое быстрое, но железно надёжное решение - прочитать руководящие документы. У меня локально нет RFC 1939 (кажется, там было), но я уверен, что найти его не так уж сложно. Вообще говоря, важность указывается в заголовке:

 
Код:
X-Priority: 3
X-MSMail-Priority: Normal
2.1K
30 сентября 2009 года
FreeWay
142 / / 03.05.2007
[QUOTE=3A3-968M;126536]Почтовиков на .NET нету (если и есть, то только любительские).
Привожу простой программки для отправки почты, может пригодится кому:

Код:
using System;
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));
}
}
}


привет, инициализировал для пробы вот так:

 
Код:
string[] args = { "dsyabl", "DSYabl@hr.agat.ru", "temma", "body" };


при выполнении получаю эксепшн -
форма указанной строки не годится для адреса эллектронной почты.

подскажите пж что ему не нравится???
5
30 сентября 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: FreeWay
подскажите пж что ему не нравится???


"dsyabl" слабо похож на корректную запись e-mail адреса.

2.1K
30 сентября 2009 года
FreeWay
142 / / 03.05.2007
Цитата: hardcase
"dsyabl" слабо похож на корректную запись e-mail адреса.



блин, тупанул, думал от кого - имя отправителя а не адресс.
псб

2.1K
09 октября 2009 года
FreeWay
142 / / 03.05.2007
[QUOTE=3A3-968M;127099]В 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 и т.д., они нас не интересуют

Код:
// POP3 у нас на 110 порту
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/
Дальше код будет выглядеть так:

Код:
Дальше, разобраться не сложно. Можно взять сокеты Indy.Sockets под .NET от Indy:
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.IO;
using System.Net.Mail;


10 ошибок выдает:

 
Код:
Error   1   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  13  Maile
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
5
09 октября 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: FreeWay
а что надо подключить??

System.Net.dll нужно добавить в ссылки проекта (referencies).

2.1K
09 октября 2009 года
FreeWay
142 / / 03.05.2007
Цитата: hardcase
System.Net.dll нужно добавить в ссылки проекта (referencies).




вижу в спике referencies она уже добавлена:


C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Net.dll

297
09 октября 2009 года
koodeer
1.2K / / 02.05.2009
using System.Net.Sockets;
2.1K
09 октября 2009 года
FreeWay
142 / / 03.05.2007
Цитата: koodeer
using System.Net.Sockets;



спасиб, на 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.

дальше когда иду в загрузку там на выбор для делфи и для билдера

5
09 октября 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: FreeWay
а что надо подключить??

Все-таки нужно подключить голову. ЗАЗ назвал два пути реализации POP3 клиента: 1) руками работаем через TCP соединение или 2) используем стороние библиотеки, например Indy, и для каждого способа привел примерный код.


Цитата: FreeWay
что значит взять??

Действительно - там нету бинарных релизов. На странице проекта написано - хостимся на CodePlex. Библиотеки из исходных текстов вполне собираются (скачал - проверил), правда Temp-приложение не хочет, но его легко починить.

2.1K
09 октября 2009 года
FreeWay
142 / / 03.05.2007
Цитата: hardcase
Все-таки нужно подключить голову. ЗАЗ назвал два пути реализации POP3 клиента: 1) руками работаем через TCP соединение или 2) используем стороние библиотеки, например Indy, и для каждого способа привел примерный код.


Действительно - там нету бинарных релизов. На странице проекта написано - хостимся на CodePlex. Библиотеки из исходных текстов вполне собираются (скачал - проверил), правда Temp-приложение не хочет, но его легко починить.



человеку не опытному в NET не легко разобрать, тем более там написано далее код выглядит так:
впечатление как-будто это продолжение.

Может есть у кого клиент на С# (интерессует только прием почты)?? А то я еще хз сколько буду розбираться(((

297
09 октября 2009 года
koodeer
1.2K / / 02.05.2009
Цитата: hardcase
Все-таки нужно подключить голову.


Так? :)

 
Код:
using Head;
using Head.Brain;




POP3 Client as a C# Class
63K
09 марта 2011 года
2k9software
26 / / 09.03.2011
Код POP3 клиента на VB.NET:

Imports System.Text

Код:
Module basPOP3
    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. Раскодировать сообщение и аттач.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог