реализция ввода данных в программу

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by realcoder, 19 Aug 2011.

  1. realcoder

    realcoder Member

    Joined:
    9 Dec 2010
    Messages:
    226
    Likes Received:
    11
    Reputations:
    4
    пишу емэйл спамер, хотелось бы узнать совета: как загонять в программу списки мыл, с которых спамить?
    есть несколько мыслей:
    1.организовать формат хранения, типа:
    email:smtpserver:port:login:pass
    но врятли ктонить захочет заказывать\писать форматировалку списка, т.к. формат нигде не определен,не используется ни кем, и является моей личной задумкой, поэтому сразу же возникнут проблемы с ним.
    2.сделать так же как и описанно выше, только дописать чтонибуть типа "мастер экспорта" или модуль, который будет из мэйл:пасс конвертить в этот формат и указывать smtp сервер один на всех, т.к. дампы чаще всего бывают с одного сервера.
    3. добавлять smtp серверы и указывать для каких мыл их использовать. типа: указали сервер smtp.mail.ru, и указали что его юзать только для мыл оканчивающихся на @mail.ru, добавили сервер mail.rambler.ru и указали что только для мыл с доменом @rambler.ru и т.д. а потом в перемешку все дампы mail:pass закидываются.
    как по вашему лучше сделать?
     
  2. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    xml,свой бинарный формат
     
  3. realcoder

    realcoder Member

    Joined:
    9 Dec 2010
    Messages:
    226
    Likes Received:
    11
    Reputations:
    4
    как хранить я найду сам - меня интересует как юзер быдет загонять мыла с которых спаить в программу. мне нужно организовать максимально удобный для юзера способ
     
  4. inCode

    inCode Member

    Joined:
    20 Jun 2011
    Messages:
    141
    Likes Received:
    22
    Reputations:
    5
    когда-то писал чекер, парсил емейл логин@домен;пасс, по домену программа обращалась к файлику servers в котором лежали строки формата domain;pop3name;pop3port. Функция возвращала значение сервера и порта и делался конект...

    идея в том, что если такое реализовать в спамере
    +использование вполне стандартного списка эмейлов
    +юзер самостоятельно может редактировать(расширять список поддерживаемых серверов)
    -значительно замедляется процесс спама при больших списках эмейлов. Как вариант в одном рабочем потоке реализовывать асинхронную работу между отправкой и получением данных.
     
  5. realcoder

    realcoder Member

    Joined:
    9 Dec 2010
    Messages:
    226
    Likes Received:
    11
    Reputations:
    4
    думаю замедляться будет при больших списках серверов, ведь работает по принцыпу:
    1.получили мыло(читается из файла с дампом maill:pass и много времени не займет). в идеале должно быть сколько мыл в спамлисте столько и для отправки спама, а так при отправке письма каждый раз мыло меняется, если конец списка - перемещаемся в начало.
    2. нашли сервер для него(скорость обратно пропорциональна размеру списка серваков)
    3. получили мыло из спамлиста(аналогично первому пункту)
    4. отправили письмо.
    5. инкремент индексов спам листа и списка мыл для спама. в случае если первый равен длине списка-закончили спам, если второй- обнуляем его(тоже занимает незначительное время)
     
  6. inCode

    inCode Member

    Joined:
    20 Jun 2011
    Messages:
    141
    Likes Received:
    22
    Reputations:
    5
    ну если у этого юзера пару милионов серверов, то можно на крайняк еще сделать сортировку на разделы по первому символу домена для облегчения поиска нужного домена, хотя это бред. Или хранить уже заюзанные стринги в листе, что бы лишний раз в файл не лазить. Думаю там больше нескольки тысяч реально тяжело набрать :)
    имхо как не крути, но нужно учитывать стандарт email;pass + возможность юзеру самому редактировать список серверов. Удобнее непридумать ;)
     
    1 person likes this.
  7. realcoder

    realcoder Member

    Joined:
    9 Dec 2010
    Messages:
    226
    Likes Received:
    11
    Reputations:
    4
    спасибо :) думаю, так и сделаю
     
  8. shadowrun

    shadowrun Banned

    Joined:
    29 Aug 2010
    Messages:
    842
    Likes Received:
    170
    Reputations:
    84
    Несколько СМТП + должен знать на каком почтовике сколько писем можно отослать и после исчерпания этого лимита начинай работу с другим ящиком.
     
  9. 1n0y

    1n0y Active Member

    Joined:
    9 May 2009
    Messages:
    276
    Likes Received:
    282
    Reputations:
    2
    незнаю на чем ты будешь писать, но на всякий случай вот функция, написанная мной на делфи несколько лет назад:

    Code:
    function get_serv(lg:string):string;
    var
    hst:boolean;
    begin
     hst:=false;
    if (pos('@mail.ru', lg)<>0) or (pos('@bk.ru', lg)<>0) or (pos('@list.ru', lg)<>0) or (pos('@inbox.ru', lg)<>0) then
     begin
      result:='pop.mail.ru';
      hst:=true;
     end;
    if (pos('@i.ua', lg)<>0) or (pos('@ua.fm', lg)<>0) or (pos('@email.ua', lg)<>0) or (pos('@3g.ua', lg)<>0) then
     begin
      result:='pop.i.ua';
      hst:=true;
     end;
    if (pos('@nm.ru', lg)<>0) or (pos('@fromru.com', lg)<>0) or (pos('@front.ru', lg)<>0) or (pos('@hotbox.ru', lg)<>0) or (pos('@hotmail.ru', lg)<>0) or (pos('@krovatka.su', lg)<>0) or (pos('@land.ru', lg)<>0) or (pos('@mail15.com', lg)<>0) or (pos('@mail333.com', lg)<>0) or (pos('@newmail.ru', lg)<>0) or (pos('@nightmail.ru', lg)<>0) or (pos('@pisem.net', lg)<>0) or (pos('@pochtamt.ru', lg)<>0) or (pos('@qip.ru', lg)<>0) or (pos('@pop3.ru', lg)<>0) or (pos('@rbcmail.ru', lg)<>0) or (pos('@smtp.ru', lg)<>0) or (pos('@pochta.ru', lg)<>0) then
     begin
      result:='pop.qip.ru';
      hst:=true;
     end;
    if (pos('@yandex.ru', lg)<>0) or (pos('@ya.ru', lg)<>0) or (pos('@yandex.ua', lg)<>0) or (pos('@yandex.com', lg)<>0) then
     begin
      result:='pop.yandex.ru';
      hst:=true;
     end;
    if (pos('@ukrpost.ua', lg)<>0) or (pos('@ukrpost.net', lg)<>0) then
     begin
      result:='mail.ukrpost.ua';
      hst:=true;
     end;
    if (pos('@km.ru', lg)<>0) or (pos('@freemail.ru', lg)<>0) or (pos('@bossmail.ru', lg)<>0) or (pos('@boymail.ru', lg)<>0) or (pos('@girlmail.ru', lg)<>0) or (pos('@megabox.ru', lg)<>0) or (pos('@safebox.ru', lg)<>0) then
     begin
      result:='pop.km.ru';
      hst:=true;
     end;
    if (pos('@narod.ru', lg)<>0) then
     begin
      result:='pop3.narod.ru';
      hst:=true;
     end;
    if (pos('@rambler.ru', lg)<>0)  or (pos('@lenta.ru', lg)<>0)  or (pos('@myrambler.ru', lg)<>0)  or (pos('@autorambler.ru', lg)<>0)  or (pos('@ro.ru', lg)<>0) or (pos('@r0.ru', lg)<>0) then
     begin
      result:='pop3.rambler.ru';
      hst:=true;
     end;
    if (pos('@meta.ua', lg)<>0) then
     begin
      result:='pop.meta.ua';
      hst:=true;
     end;
    if (pos('@ukr.net', lg)<>0) then
     begin
      result:='pop3.ukr.net';
      hst:=true;
     end;
    if (pos('@online.ua', lg)<>0) then
     begin
      result:='pop3.online.ua';
      hst:=true;
     end;
    if hst<> true then
    begin
     result:=copy(lg, pos('@', lg)+1, length(lg));
     result:='pop.'+result;
    end;
    end;
    конечно реализацию можно придумать и получше :)
    в неё я забил большинство известных мне поп.серверов. плюс, если прога не находет подходящего в списке - пытается сделать его сама из домена.
     
  10. Bers

    Bers Member

    Joined:
    17 May 2010
    Messages:
    78
    Likes Received:
    30
    Reputations:
    26

    Господи ты боже ж мой, я подавился бутером. Хорошо хоть откашлялся, а то бы умер самой дурацкой смертью...

    Я не очень в курсе насчет дельфи, но там 100% должна быть реализована структура данных "хеш-таблица". Неужели не пришло в голову использовать ее? Это было бы даже быстрее, чем копипастить.

    Code:
    public static class Pop3ServerDeterminer
    {
        private static Dictionary<string, string> domainOnPop3 = new Dictionary<string, string>
        {
            { "mail.ru", "pop.mail.ru" },
            { "list.ru", "pop.mail.ru" },
            { "bk.ru", "pop.mail.ru" },
            { "yandex.ru", "pop.yandex.ru" }
        };
    
        private static string GetDomainByEmail(string email)
        {
            var index = email.IndexOf('@');
            if (index < 0)
            {
                throw new ArgumentException("This is not a valid email address");
            }
    
            return email.Substring(index + 1);
        }
    
        public static string GetServerByEmail(string email)
        {
            string domain = GetDomainByEmail(email.ToLowerInvariant());
            string server;
            if (!domainOnPop3.TryGetValue(domain, out server))
            {
                return string.Format("pop.{0}", domain);
            }
    
            return server;
        }
    }
    
    И тесты:
    Code:
    [TestClass]
    public class Pop3ServerDeterminerTest
    {
        [TestMethod]
        public void GetServerByEmailTest_MailRu()
        {
            var email = "[email protected]"; 
            var expected = "pop.mail.ru"; 
            var actual = Pop3ServerDeterminer.GetServerByEmail(email);
            Assert.AreEqual(expected, actual);
        }
    
        [TestMethod]
        public void GetServerByEmailTest_ListRu()
        {
            var email = "[email protected]";
            var expected = "pop.mail.ru";
            var actual = Pop3ServerDeterminer.GetServerByEmail(email);
            Assert.AreEqual(expected, actual);
        }
    
        [TestMethod]
        public void GetServerByEmailTest_BkRu()
        {
            var email = "[email protected]";
            var expected = "pop.mail.ru";
            var actual = Pop3ServerDeterminer.GetServerByEmail(email);
            Assert.AreEqual(expected, actual);
        }
    
        [TestMethod]
        public void GetServerByEmailTest_UnknownDomain()
        {
            var email = "[email protected]";
            var expected = "pop.testdomain.org";
            var actual = Pop3ServerDeterminer.GetServerByEmail(email);
            Assert.AreEqual(expected, actual);
        }
    
        [TestMethod]
        [ExpectedException(typeof(ArgumentException))]
        public void GetServerByEmailTest_IncorrectEmail()
        {
            var email = "test_testdomain.org";
            Pop3ServerDeterminer.GetServerByEmail(email);
            Assert.Fail();
        }
    }
    
    5 минут подумать спинным мозгом...

    Пардон за C#, но дельфи я не знаю :(
     
    #10 Bers, 20 Aug 2011
    Last edited: 20 Aug 2011
  11. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    берем адресс:
    [email protected]
    отрезаем от него mail.ru
    берем стринглист (A) вида имя=значение
    mail.ru=pop.mail.ru
    listbox.ru=pop.mail.ru
    и т.д.

    и popserver:=A.Value['mail.ru'] вернет pop.mail.ru
    а если popserver='' тогда надобно спросить пользователя.