Вот шаблон скачивания почты через MailKit.dll, как прокси подключить?

orka13

Client
Регистрация
07.05.2015
Сообщения
2 160
Благодарностей
2 159
Баллы
113
В редких случаях после длительной работы ZennoPoster не всегда принимает письмо родными кубиками. Перешел на C#, там легче правки вносить и не слетают настройки, но потом задумался, что лучше попробовать еще хитрее метод: через библиотеку MailKit.dll принимать письма. Благодаря подсказкам в старых темах на форуме удалось ее подключить. Но возникла проблема с работой через прокси, нет нормальных примеров, и моего знания C# мало чтобы самому справиться.
Нет у кого рабочего шаблона или отрезка кода с правильным подключением прокси в связке MailKit.dll+ZennoPoster для приема почты? А то просто некоторые почтовики банят за частое обращение с одного IP.

Вот делюсь готовым мини-шаблоном для скачивания писем в список. В архиве все библиотеки, и вот сам код:
C#:
var server = "imap-mail.outlook.com";
string port = "993";
int count = 3; // предел сколько писем брать в обработку (берет начиная от новых)
var login = project.Variables["mail_login"].Value; // переменная с логином типа: [email protected] (смените на рабочую, а то эта умрет на днях)
var password = project.Variables["mail_password"].Value; // пароль от почты: cUwyru9t008
project.Lists["Mails_SourceList"].Clear(); // очищаем список, в который будет скачивать письма

try {
    using (var client = new ImapClient())
    {
        client.Connect(server, int.Parse(port), true);
        client.Authenticate(login, password);
        var inbox = client.Inbox;
        inbox.Open(FolderAccess.ReadWrite);
    
        for (int i = inbox.Count-1; i >=0 && i >= inbox.Count - count; i--)
        {
            var message = inbox.GetMessage(i);
            project.Lists["Mails_SourceList"].Add(message.Subject + "\r\n" + message.TextBody);
        }
        client.Disconnect(true);
    }
} catch (Exception e){
    return e.Message;
}
В директивах Using прописано:
Код:
using MailKit.Net.Imap;
using MailKit;
 

Вложения

Последнее редактирование:

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
823
Баллы
93
upload_2019-4-2_19-48-0.png

upload_2019-4-2_20-2-27.png

В owncode метод для создания прокси. На вход строка с прокси в формате зенки. Можно доделать чтобы разный тип прокси принимало. Я юзаю socks5.
upload_2019-4-2_19-59-48.png

Во вложении либа для создания прокси и txt c методом CreateProxy.
 

Вложения

  • Спасибо
Реакции: mazay

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 039
Баллы
113
если не ошибаюсь то http там и не сможешь использовать
 

Sanekk

Client
Регистрация
24.06.2016
Сообщения
987
Благодарностей
388
Баллы
63
  • Спасибо
Реакции: orka13 и Lord_Alfred

mazay

Новичок
Регистрация
22.08.2017
Сообщения
2
Благодарностей
1
Баллы
3
Помогите разобраться пожалуйста.

Переменная proxy содержит прокси socks5 в формате зенки.
В owncode добавил метод от @Moadip
.dll положил в /ExternalAssemblies
Без прокси все работает как надо.

Что нужно добавить, чтобы заработало через прокси?
Код:
var server = project.Variables["imap_server"].Value;
string port = project.Variables["imap_port"].Value;
int count = 1000; // предел сколько писем брать в обработку (берет начиная от новых)
var login = project.Variables["email"].Value;
var password = project.Variables["password"].Value;
var ssl = Convert.ToBoolean(project.Variables["imap_ssl"].Value);
project.Lists["Mails_SourceList"].Clear(); // очищаем список, в торый будет скачивать письма

try {
    using (var client = new ImapClient())
    {
        client.Connect(server, int.Parse(port), ssl);
        client.Authenticate(login, password);
        var inbox = client.Inbox;
        inbox.Open(FolderAccess.ReadWrite);
      
        for (int i = inbox.Count-1; i >=0 && i >= inbox.Count - count; i--)
        {
            var message = inbox.GetMessage(i);
            project.Lists["Mails_SourceList"].Add("\r\n" + message.From);
        }
        client.Disconnect(true);
    }
} catch (Exception e){
    return e.Message;
}
 

ErikMoor

Client
Регистрация
24.03.2016
Сообщения
121
Благодарностей
22
Баллы
18
Помогите разобрать за вознаграждение
MailKit.dll с вложения orka13 добавил в /ExternalAssemblies
Proxy.dll с вложения Moadip добавил в /ExternalAssemblies

В директивах Using прописано:
C#:
using MailKit.Net.Imap;
using MailKit;
using Proxy;
В owncode добавлено

Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
using System.Text.RegularExpressions;
using ZennoLab.CommandCenter;
using ZennoLab.InterfacesLibrary;
using ZennoLab.InterfacesLibrary.ProjectModel;
using ZennoLab.InterfacesLibrary.ProjectModel.Collections;
using ZennoLab.InterfacesLibrary.ProjectModel.Enums;
using ZennoLab.Macros;
using Global.ZennoExtensions;
using ZennoLab.Emulation;


namespace ZennoLab.OwnCode
{
    /// <summary>
    /// A simple class of the common code
    /// </summary>
    public class CommonCode
    {
        public static IProxyClient CreateProxy(string proxy)
        {
            if (proxy == "socks5://111.202.85.110:1085") return null;

            IProxyClient wp;

            var split = proxy.Split('@');

            if (split.Length == 1)
            {
                var address = split[0].Split(':');

                var ip = address[0];
                var port = int.Parse(address[1]);

                var factory = new ProxyFactory();
                wp = factory.CreateProxy(Limilabs.Proxy.ProxyType.Socks5, ip, port);
            }
            else
            {
                var address = split[1].Split(':');
                var credential = split[0].Split(':');

                var ip = address[0];
                var port = int.Parse(address[1]);

                var user = credential[0];
                var password = credential[1];

                var factory = new ProxyFactory();
                wp = factory.CreateProxy(Limilabs.Proxy.ProxyType.Socks5, ip, port, user, password);
            }

            return wp;          
        }
        /// <summary>
        /// Lock this object to mark part of code for single thread execution
        /// </summary>
        public static object SyncObject = new object();

        // Insert your code here
    }
}
В кубике прописан следующий код

C#:
var server = "mail.optimum.net";
string port = "993";
int count = 5; // предел сколько писем брать в обработку (берет начиная от новых)
var login = project.Variables["mail_login"].Value; // переменная с логином типа: [email protected] (смените на рабочую, а то эта умрет на днях)
var password = project.Variables["mail_password"].Value; // пароль от почты: cUwyru9t008
project.Lists["Mails_SourceList"].Clear(); // очищаем список, в торый будет скачивать письма

try {
    using (var client = new ImapClient())
    {
        var proxy = CommonCode.CreateProxy(proxyStr);
        var socket = proxy.Connect(server, port);
        client.Connect(socket, server, port);
        client.Authenticate(login, password);
        var inbox = client.Inbox;
        inbox.Open(FolderAccess.ReadWrite);
     
        for (int i = inbox.Count-1; i >=0 && i >= inbox.Count - count; i--)
        {
            var message = inbox.GetMessage(i);
            project.Lists["Mails_SourceList"].Add(message.Subject + "\r\n" + message.TextBody);
        }
        client.Disconnect(true);
    }
} catch (Exception e){
    return e.Message;
}
Без прокси все работает, но вот когда изменил код - нет
Ошибки следующие


Столбец 17
 

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
823
Баллы
93
if (proxy == "socks5://111.202.85.110:1085") return null;
Ты понимаешь смысл этой строчки?
Было if (proxy == "") return null;

Т.е. если в метод передается пустая строка, то возвращает null, тк если строка пустая, то бессмысленно создавать прокси.
Ты же прописал что если передается строка, и она равна "socks5://111.202.85.110:1085 то возвращает null.
Из этого два вывода:
1. Твою прокси теперь знают все. :-)
2. Ты передаешь свою прокси, и тк строка равна "socks5://111.202.85.110:1085" то получаешь обратно null и непонятки почему не пашет.

Ошибки следующие
Все же написано. И если внимательно читать, то все понятно, почему такая ошибка.
Ошибок две.
Первая.
Прописано namespace Proxy, которое не находится в подключенных либах.
using MailKit.Net.Imap;
using MailKit;
using Proxy;
Надо using Limilabs.Proxy;
Proxy это название либы, которая подключалась к шабу, но никак не namespace.

Вторая
Не может найти тип IProxyClient в OwnCode. Почему? Да все по той же причине, не добавлен нужный namespace - using Limilabs.Proxy;
Код добавлен, а namespace нет.

43924

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

Еще одна ошибка. В метод передается переменная proxyStr, но ее нет в коде.
43926

В итоге все ошибки от невнимательности. :-)
 

Вложения

VerBin

Client
Регистрация
28.05.2016
Сообщения
555
Благодарностей
455
Баллы
63
В версии mailkit 2.3 есть своя реализация прокси.
Для этого нет нужды использовать сторонние библиотеки.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 683
Баллы
113
В версии mailkit 2.3 есть своя реализация прокси.
Для этого нет нужды использовать сторонние библиотеки.
начал изучать mailkit и вот что не понравилось в ее встроенном методе прокси.
вот такой метод установки прокси работает, но если вдруг прокси становиться недоступным то снипет зависает на очень долго.
C#:
MailKit.Net.Proxy.Socks5Client objHttpProxyClient = new MailKit.Net.Proxy.Socks5Client("5.9.104.6",30328);
using (ImapClient objClient = new ImapClient())
{
    objClient.ServerCertificateValidationCallback = (s,c,h,e) => true;    // add this line
    objClient.ProxyClient = objHttpProxyClient;
    
    objClient.Connect (server, port, MailKit.Security.SecureSocketOptions.SslOnConnect);
    objClient.Authenticate(email, password);
а вот установка прокси через сокет мне понравилась. если прокси недоступен выходит сразу же.
Единственное я не понял, а откуда эта библиотека для прокси. Было бы полезно знать откуда свежие версии брать.
 

VerBin

Client
Регистрация
28.05.2016
Сообщения
555
Благодарностей
455
Баллы
63
начал изучать mailkit и вот что не понравилось в ее встроенном методе прокси.
вот такой метод установки прокси работает, но если вдруг прокси становиться недоступным то снипет зависает на очень долго.
C#:
MailKit.Net.Proxy.Socks5Client objHttpProxyClient = new MailKit.Net.Proxy.Socks5Client("5.9.104.6",30328);
using (ImapClient objClient = new ImapClient())
{
    objClient.ServerCertificateValidationCallback = (s,c,h,e) => true;    // add this line
    objClient.ProxyClient = objHttpProxyClient;
   
    objClient.Connect (server, port, MailKit.Security.SecureSocketOptions.SslOnConnect);
    objClient.Authenticate(email, password);
а вот установка прокси через сокет мне понравилась. если прокси недоступен выходит сразу же.
Единственное я не понял, а откуда эта библиотека для прокси. Было бы полезно знать откуда свежие версии брать.
В самом классе реализации прокси не предусмотрено свойство таймаута:

У класса ImapClient имеется свойство таймаута, поиграйся с ним:
 
  • Спасибо
Реакции: evgosyan и Phoenix78

kitkv

Client
Регистрация
26.07.2021
Сообщения
17
Благодарностей
1
Баллы
3
Добрый день. Принимаю почту почту через mailkit с ящика gmail. Настроил по Вашей инструкции все работало. Спасибо) С сегодняшнего дня прием 20 писем вместо 2-3 секунд стал занимать 5 минут. В чем может быть причина?
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)