пишу емэйл спамер, хотелось бы узнать совета: как загонять в программу списки мыл, с которых спамить? есть несколько мыслей: 1.организовать формат хранения, типа: email:smtpserverort:loginass но врятли ктонить захочет заказывать\писать форматировалку списка, т.к. формат нигде не определен,не используется ни кем, и является моей личной задумкой, поэтому сразу же возникнут проблемы с ним. 2.сделать так же как и описанно выше, только дописать чтонибуть типа "мастер экспорта" или модуль, который будет из мэйл:пасс конвертить в этот формат и указывать smtp сервер один на всех, т.к. дампы чаще всего бывают с одного сервера. 3. добавлять smtp серверы и указывать для каких мыл их использовать. типа: указали сервер smtp.mail.ru, и указали что его юзать только для мыл оканчивающихся на @mail.ru, добавили сервер mail.rambler.ru и указали что только для мыл с доменом @rambler.ru и т.д. а потом в перемешку все дампы mailass закидываются. как по вашему лучше сделать?
как хранить я найду сам - меня интересует как юзер быдет загонять мыла с которых спаить в программу. мне нужно организовать максимально удобный для юзера способ
когда-то писал чекер, парсил емейл логин@домен;пасс, по домену программа обращалась к файлику servers в котором лежали строки формата domain;pop3name;pop3port. Функция возвращала значение сервера и порта и делался конект... идея в том, что если такое реализовать в спамере +использование вполне стандартного списка эмейлов +юзер самостоятельно может редактировать(расширять список поддерживаемых серверов) -значительно замедляется процесс спама при больших списках эмейлов. Как вариант в одном рабочем потоке реализовывать асинхронную работу между отправкой и получением данных.
думаю замедляться будет при больших списках серверов, ведь работает по принцыпу: 1.получили мыло(читается из файла с дампом maillass и много времени не займет). в идеале должно быть сколько мыл в спамлисте столько и для отправки спама, а так при отправке письма каждый раз мыло меняется, если конец списка - перемещаемся в начало. 2. нашли сервер для него(скорость обратно пропорциональна размеру списка серваков) 3. получили мыло из спамлиста(аналогично первому пункту) 4. отправили письмо. 5. инкремент индексов спам листа и списка мыл для спама. в случае если первый равен длине списка-закончили спам, если второй- обнуляем его(тоже занимает незначительное время)
ну если у этого юзера пару милионов серверов, то можно на крайняк еще сделать сортировку на разделы по первому символу домена для облегчения поиска нужного домена, хотя это бред. Или хранить уже заюзанные стринги в листе, что бы лишний раз в файл не лазить. Думаю там больше нескольки тысяч реально тяжело набрать имхо как не крути, но нужно учитывать стандарт email;pass + возможность юзеру самому редактировать список серверов. Удобнее непридумать
Несколько СМТП + должен знать на каком почтовике сколько писем можно отослать и после исчерпания этого лимита начинай работу с другим ящиком.
незнаю на чем ты будешь писать, но на всякий случай вот функция, написанная мной на делфи несколько лет назад: 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; конечно реализацию можно придумать и получше в неё я забил большинство известных мне поп.серверов. плюс, если прога не находет подходящего в списке - пытается сделать его сама из домена.
Господи ты боже ж мой, я подавился бутером. Хорошо хоть откашлялся, а то бы умер самой дурацкой смертью... Я не очень в курсе насчет дельфи, но там 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#, но дельфи я не знаю
берем адресс: [email protected] отрезаем от него mail.ru берем стринглист (A) вида имя=значение mail.ru=pop.mail.ru listbox.ru=pop.mail.ru и т.д. и popserver:=A.Value['mail.ru'] вернет pop.mail.ru а если popserver='' тогда надобно спросить пользователя.