Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/33: Рейтинг темы: голосов - 33, средняя оценка - 4.55
1 / 1 / 0
Регистрация: 21.04.2011
Сообщений: 30
1

Приём писем с почты

04.10.2011, 21:33. Просмотров 6821. Ответов 16
Метки нет (Все метки)

Здравствуйте! С отправкой писем проблем не возникло, а вот инструкий по получению писем я не нашёл.
Цель: принимать письма, после чего нужно будет анализировать из содержимое, и заново отправлять эти письма (в том же виде, в котором они пришли).

На данный момент не знаю как получить письма. Заранее спасибо за помощь!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.10.2011, 21:33
Ответы с готовыми решениями:

Чтение писем с почты
Несколько раз поднималась тема почтового клиента на vb.net есть ли у кого примеры как -считать...

Приём данных с COM порта
Добрый день! У меня вот имеется код на Qbasic, никак не соображу как правильно перевести его на VB...

COM-USB приём, передача данных
Добрый день! Такая проблема: данные с микроконтроллера ATMEGA 128 идут по RS232C после чего...

Проблема с кодировкой входящих писем. почтовый клиент. приём почты. POP3.
Скачал класс ( прогу в коде ) POP3 стороннего разработчика для приемё писем. ...

16
91 / 46 / 2
Регистрация: 02.11.2010
Сообщений: 261
04.10.2011, 21:44 2
Лучший ответ Сообщение было отмечено как решение

Решение

По информации сайта http://sources.ru/



C#
1
2
3
4
5
6
7
8
9
10
Public void CheckMail()
{
NetworkStream ns;
            StreamReader sr;  //два потока для чтения из потока
            StreamWriter sw;  //и для записи в поток
            String response; //для хранения результата запроса
            
            TcpClient tcpClient = new TcpClient(); //создаем клиент
            try
            {

А теперь все то же самое на VB.NET
1. Шаг первый, надо соединиться с сервером, вот код который это делает:
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    Dim client As Net.Sockets.TcpClient
        Dim sr As IO.StreamReader
        Dim sw As IO.StreamWriter
        Dim ns As Net.Sockets.NetworkStream
        Dim otvet As String
        'соединяемся с сервером
            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()                              'это наш ответ от сервера
На это нам сервер должен ответить +ОК [какой то текст]. В конце каждой отправленной сервером строки
обязательно символы перехода на новую строку(chr(13) & chr(10))

2. Второй шаг, после утвердительного ответа сервера отправляем имя пользователя

Код
user [имя] & chr(13) & chr(10)
На что сервер нам может ответить следующее:

+OK [какойто текст] - такой пользователь существует, продолжайте
-ERR [какойто текст] - ошибка, либо такого пользователя нет

Вот код который это делает:


vb.net
1
2
3
4
5
6
7
8
ExpandedWrap disabled
 
            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)
3. Далее посылаем серверу пароль

Код
pass [****] & chr(13) & chr(10)
Вместо **** указывается пароль.

На что сервер нам опять ответит следующим:
+OK [какойто текст] - пароль верный, продолжайте
-ERR [какойто текст] - ошибка, либо неверный пароль

Вот код который это делает:

vb.net
1
2
3
4
5
6
7
8
9
ExpandedWrap disabled
 
             'отправляем пароль
            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)



4. Теперь можно определить количество новых писем на сервере, и их общий объём, для этого отправим

Код
stat
Ответом будет
Код
+OK [кол-во] [объем]
vb.net
1
2
3
4
5
6
7
8
9
ExpandedWrap disabled
 
        Dim nummess As Array
        Dim totmessages As Integer
            sw.WriteLine("stat")
            sw.Flush()
            otvet = sr.ReadLine()
            nummess = otvet.Split(" ")
            totmessages = CInt(nummess(1))
5. Для того чтобы определить индексы писем и объем каждого по отдельности, отправляем
list
Код

	
Сервер ответит списком с номером и объемом письма
Код
+OK 2 messages 320
1 120
2 200
.
Список оканчивается переходом на новую строку и знаком "."


vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
ExpandedWrap disabled
 
        Dim i As Integer
        Dim MessageArr() As String
            'получаем идеинтификаторы писем
            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



6. Теперь мы можем производить разные операции с письмами
Код
dele [x]
Удаление сообщения номер x. Изменения вступают в силу только после корректного
закрытия соединения.

vb.net
1
2
3
4
5
ExpandedWrap disabled
 
            sw.WriteLine("dele x") 'х это идеинтификатор письма
            sw.Flush()
            otvet = sr.ReadLine()



Возможные ответы:
Код
+OK [какойто текст] - письмо удалено
-ERR [какойто текст] - нет письма с таким идеинтификатором
Код
retr [x]
Приём сообщения номер x. Оно оканчивается переходом на новую строку и знаком "."

vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ExpandedWrap disabled
 
            'получаем письма
            Dim x As Integer = 0
            sr = New IO.StreamReader(ns, Encoding.Default, True) 'Encoding.Default вот чего не хватало для чтения руских букв
            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


Возможные ответы:
Код
+OK [какойто текст] - вот ваше письмо
-ERR [какойто текст] - нет такого письма
Примеры:
Код
+OK 120 octets
[заголовок письма]
[текст письма]
.

Дополнительные POP3 команды

Следующие дополнительные команды дают вам большую свободу при работе с
сообщениями:

Код
Команда: TOP [сообщение] [n]
Аргументы: [сообщение] - номер сообщения [n] - положительное число
(обязательный аргумент)

Описание: Если ответ сервера положительный, то после него он передаёт
заголовки сообщения и указанное кол - во строк из тела сообщения.

Возможные ответы:

Код
+OK top of message follows
-ERR no such message

Примеры:


Код
C: TOP 1 10 S: +OK
S: <здесь POP3 сервер передаёт заголовки
первого сообщения и первые 10-ть строк из тела сообщения.>
S: . ...
C: TOP 100 3
S: -ERR no such message

Команда: UIDL [сообщение]
Аргументы: [сообщение] - номер сообщения (необязательный аргумент).

Описание:
Если был указан номер сообщения, то сервер выдаёт уникальный
идентификатор для этого сообщения. Если аргумент не был передан, то
идентификаторы перечисляются для всех сообщений, кроме помеченных для
удаления.

Возможные ответы:

Код
+OK unique-id listing follows
-ERR no such message
Примеры:

Код
C: UIDL S: +OK
S: 1 whqtswO00WBw418f9t5JxYwZ
S: 2 QhdPYR:00WBw1Ph7x7
S: . ...
C: UIDL 2
S: +OK 2 QhdPYR:00WBw1Ph7x7 ...
C: UIDL 3
S: -ERR no such message, only 2 messages in maildrop

Команда:loop
Эта команда просто говорит серверу, что мы ещё висим на порту, чтобы он не закрывал соединение
после длительной паузы.

Команда:quit
Закрытие соединения.
9
1 / 1 / 0
Регистрация: 21.04.2011
Сообщений: 30
04.10.2011, 21:48  [ТС] 3
Ох, сколько всего... Надо разбираться. Спасиоб!
0
91 / 46 / 2
Регистрация: 02.11.2010
Сообщений: 261
04.10.2011, 21:52 4
PbICbK, для таких целей VB.NET не очень подходит. Вот на шарпе несколько строчек кода, а на VB несколько страниц
1
1 / 1 / 0
Регистрация: 21.04.2011
Сообщений: 30
04.10.2011, 21:53  [ТС] 5
Devel, хм... Тогда думаю стоит перейти на C#,т.к. с С++ работал, синтаксис знаком.

Код для C# имеется?
0
Devel
04.10.2011, 21:56
  #6

Не по теме:

PbICbK, у меня глупый вопрос: Что вы тут делаете? Все те кто работал на С++ или переходят на шарп, или остаются на плюсе. Но на бейсик никто с плюса не идет как мне кажется

0
PbICbK
04.10.2011, 21:57  [ТС]
  #7

Не по теме:

Devel, как-то так получилось) Для мелких прог удобно было, да и студия понравилась.
Хотя чувствую пора таки переходить на шарп, и этот проект это ещё раз доказал))

0
91 / 46 / 2
Регистрация: 02.11.2010
Сообщений: 261
04.10.2011, 22:02 8
Цитата Сообщение от PbICbK Посмотреть сообщение
студия понравилась

Не по теме:

Это да... 8 чудо света!

0
1 / 1 / 0
Регистрация: 21.04.2011
Сообщений: 30
04.10.2011, 22:03  [ТС] 9
Devel, собственно весь тот же код для C# есть?
0
91 / 46 / 2
Регистрация: 02.11.2010
Сообщений: 261
04.10.2011, 22:08 10
C#
1
2
3
4
5
6
7
8
9
10
Public void CheckMail()
{
NetworkStream ns;
            StreamReader sr;  //два потока для чтения из потока
            StreamWriter sw;  //и для записи в поток
            String response; //для хранения результата запроса
            
            TcpClient tcpClient = new TcpClient(); //создаем клиент
            try
            {
Не проверял, но написано работает
0
1 / 1 / 0
Регистрация: 21.04.2011
Сообщений: 30
04.10.2011, 22:10  [ТС] 11
Devel, эм... создали клиент. а как проверять количество писем, прочитанные, непрочитанные, как принимать конкретное письмо?
0
91 / 46 / 2
Регистрация: 02.11.2010
Сообщений: 261
04.10.2011, 22:19 12
Цитата Сообщение от PbICbK Посмотреть сообщение
Devel, эм... создали клиент. а как проверять количество писем, прочитанные, непрочитанные, как принимать конкретное письмо?
Я в Sharp не бум-бум. Добро пожаловать в раздел С# .NET!
0
1 / 1 / 0
Регистрация: 21.04.2011
Сообщений: 30
04.10.2011, 22:19  [ТС] 13
Devel, понятно, спасибо. Буду копать дальше))
1
1 / 1 / 0
Регистрация: 21.04.2011
Сообщений: 30
10.10.2011, 20:42  [ТС] 14
Решил всё таки делать на VB.NET.
Возникла проблема:

vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
   Dim client As Net.Sockets.TcpClient
        Dim sr As IO.StreamReader
        Dim sw As IO.StreamWriter
        Dim ns As Net.Sockets.NetworkStream
        Dim otvet As String
        'соединяемся с сервером
            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()                              'это наш ответ от сервера
Нужно читать почту Gmail, где идёт обязательное шифрование SSL, где это указать?
0
1 / 1 / 0
Регистрация: 21.04.2011
Сообщений: 30
22.10.2011, 19:02  [ТС] 15
Народ! Мне всё ещё нужна помощь! Проблема указана постом выше!

PS: тот же код отлично работает с mail.ru (ввиду отстутствия шифрования), с gmail.com не прокатывает (у них обязательное шифрование SSL). Сервер ничего не отвечает.
PSS: очень нужна ваша помощь((((
0
0 / 0 / 0
Регистрация: 24.09.2015
Сообщений: 17
22.06.2017, 07:44 16
Поднимаю выше указанный вопрос.
Как и куда прописать SSL шифрование
при отправки логина получаю ответ:
-ERR [AUTH] Working without SSL/TLS encryption is not allowed. Please visit http://help.yandex.ru/mail/mail-clients/ssl.xml sc=1iY5Po6D6Ko1_220444_30j
0
Лень — мое второе и
2940 / 2173 / 634
Регистрация: 28.11.2014
Сообщений: 3,307
Записей в блоге: 2
22.06.2017, 11:23 17
Georgy_Taren, Думаю вместо обычного NetworkStream необходимо использовать SslStream (System.Net.Security.SslStream)

vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Dim client As Net.Sockets.TcpClient
        Dim sr As IO.StreamReader
        Dim sw As IO.StreamWriter
        Dim ns As SslStream
        Dim otvet As String
        'соединяемся с сервером
        client = New Net.Sockets.TcpClient
 
        Try
            client.Connect("pop.gmail.com", 995)
 
        Catch ex As Exception
            MessageBox.Show("Соединение не установленно" + e.ToString, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly, False)
            Return
        End Try
        ns = New SslStream(client.GetStream)
        ns.AuthenticateAsClient("pop.gmail.com")
        sr = New IO.StreamReader(ns, Encoding.ASCII, True)  'это то что отправляет наши команды на сервер
        sw = New IO.StreamWriter(ns)                       'а это то что читает ответы сервера
        otvet = sr.ReadLine()
        TextBox1.Text &= otvet
Ответ: +OK Gpop ready for requests from {my_ip} x10mb8128543ljd
3
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.06.2017, 11:23

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Приём писем. PHP
всем привет! как отправлять письма зают многие, а вот как подключиться к ящику и приветить почту...

Приём почты
Подскажите что нужно сделать что-бы реализовать прием почты на своём сайте, тоесть после прихода...

Приём почты с почтового ящика
OpenPop.Pop3.Pop3Client pop = new Pop3Client(); List&lt;OpenPop.Mime.Message&gt; list = new...

Приём почты со страницы ASP.NET
Подскажите как принять почту со страницы ASP.NET Странник


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.