Exemple #1
0
        public List <string> Send()
        {
            List <string> Result   = new List <string>();
            Encryption    enc      = new Encryption(); //links encrpytion
            Campaign      campaign = new Campaign(Artisan);
            int           c_seed   = 0;


            dynamic cdata = campaign.Campaign_info(Id); //get info campaign

            if (cdata != null)
            {
                string   raw_rp           = Convert.ToString(cdata.return_path);
                string[] seed_emails      = Campaign.Convert_emails(Convert.ToString(cdata.email_test));
                string   raw_hd           = Text.Base64Decode(Convert.ToString(cdata.header));
                string   raw_bd           = Text.Base64Decode(Convert.ToString(cdata.body));
                var      servers          = Campaign.Bulk_split(Convert.ToString(cdata.ips));
                string   file             = Storage + "/" + Convert.ToString(cdata.send_file);
                string   platform         = Convert.ToString(cdata.platform);
                string   redirect_link    = Convert.ToString(cdata.redirect_link);
                string   unsubscribe_link = Convert.ToString(cdata.unsubscribe_link);

                int countlines = int.Parse(Convert.ToString(cdata.send_count));
                int countIps   = servers.Count;

                List <int> ipLimit = Campaign.DistributeInteger(countlines, countIps).ToList();

                List <Task> tasks = new List <Task>();
                for (int i = 0; i < countIps; i++)
                {
                    int current = i;
                    tasks.Add(
                        Task.Factory.StartNew(() =>
                    {
                        try
                        {
                            if (ipLimit[current] > 0)
                            {
                                var details_server = campaign.Server_info(int.Parse(servers[current][4]));
                                if (details_server != null)
                                {
                                    Pmta p   = new Pmta(Convert.ToString(details_server.ip), Password);    //load pmta
                                    int skip = current == 0 ? 0 : ipLimit.Take(current).Sum();
                                    Console.WriteLine("skip " + skip);

                                    List <string[]> emails = File.ReadLines(file).Skip(skip).Take(ipLimit[current])
                                                             .Select(t => t.Trim().Split(','))
                                                             .Where(item => item.Length == 2)
                                                             .ToList();

                                    if (emails.Count > 0)
                                    {
                                        string email_ip = servers[current][0];
                                        string domain   = servers[current][1];
                                        string rdns     = Text.Rdns(email_ip, domain);
                                        string vmta_ip  = email_ip.Replace(':', '.');
                                        string vmta     = Mta.ToLower() == "none" ? $"mta-{vmta_ip}" : (Mta == "vmta" ? $"vmta-{vmta_ip}-{Username}" : $"smtp-{vmta_ip}-{Username}");
                                        string job      = $"{Id}";

                                        string rp       = Text.Build_rp(raw_rp, domain, rdns, "reply");
                                        Message message = new Message(rp);
                                        string header   = Text.Header_normal(raw_hd);
                                        message.AddMergeData(Text.Generate(header + "\n" + raw_bd));
                                        message.VirtualMTA = vmta;
                                        message.JobID      = Id.ToString();
                                        message.Verp       = false;
                                        message.Encoding   = Encoding.EightBit;

                                        foreach (string[] email in emails)
                                        {
                                            Recipient r = new Recipient(email[1]);
                                            //links
                                            r["red"]   = enc.Encrypt($"r!!{Id}!!{servers[current][2]}!!{servers[current][3]}!!{email[0]}!!{redirect_link}!!{platform}");
                                            r["unsub"] = enc.Encrypt($"u!!{Id}!!{servers[current][2]}!!{servers[current][3]}!!{email[0]}!!{unsubscribe_link}");
                                            r["opn"]   = enc.Encrypt($"o!!{Id}!!{servers[current][2]}!!{servers[current][3]}!!{email[0]}");
                                            r["out"]   = enc.Encrypt($"out!!{new Random().Next(5, 15)}");
                                            r["short"] = enc.Encrypt(email[0]);      //shortlink
                                            //header body
                                            r["pe"]       = $"n,{Id},{Username},{servers[current][2]},{servers[current][3]},{email[0]}";
                                            r["ip"]       = email_ip;
                                            r["domain"]   = domain;
                                            r["rdns"]     = rdns;
                                            r["name"]     = email[1].Split('@')[0];
                                            r["to"]       = email[1];
                                            r["date"]     = Text.GetRFC822Date();
                                            r["boundary"] = Text.Random("[rndlu/30]");
                                            r["*parts"]   = "1";

                                            message.AddRecipient(r);
                                            Interlocked.Increment(ref c_seed);

                                            if (Seed != 0 && c_seed % Seed == 0)
                                            {
                                                if (seed_emails.Length > 0)
                                                {
                                                    foreach (string test_email in seed_emails)
                                                    {
                                                        Recipient t = new Recipient(test_email);
                                                        //links
                                                        t["red"]   = enc.Encrypt($"r!!{Id}!!{servers[current][2]}!!{servers[current][3]}!!0!!{redirect_link}!!{platform}");
                                                        t["unsub"] = enc.Encrypt($"u!!{Id}!!{servers[current][2]}!!{servers[current][3]}!!0!!{unsubscribe_link}");
                                                        t["opn"]   = enc.Encrypt($"o!!{Id}!!{servers[current][2]}!!{servers[current][3]}!!0");
                                                        t["out"]   = enc.Encrypt($"out!!{new Random().Next(5, 10)}");
                                                        t["short"] = enc.Encrypt("0");      //shortlink
                                                        //header body
                                                        t["pe"]       = $"t,{Id},{Username},!!{servers[current][2]}!!{servers[current][3]}!!,0";
                                                        t["ip"]       = email_ip;
                                                        t["domain"]   = domain;
                                                        t["rdns"]     = rdns;
                                                        t["name"]     = test_email.Split('@')[0];
                                                        t["to"]       = email[1];
                                                        t["date"]     = Text.GetRFC822Date();
                                                        t["boundary"] = Text.Random("[rndlu/30]");
                                                        t["*parts"]   = "1";
                                                        message.AddRecipient(t);
                                                    }
                                                }
                                            }
                                        }
                                        p.Send(message);
                                        p.Close();
                                        //Task.Run(() => campaign.Campaign_update_send(Id, skip + ipLimit[current]));
                                        return;
                                    }
                                    else
                                    {
                                        logger.Error("Emails Empty" + Id);
                                        p.Close();
                                        return;
                                    }
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            logger.Error($"ERR {ex.Message} -- {ex.StackTrace}");
                            Console.WriteLine($"ERR {ex.Message} -- {ex.StackTrace}");
                        }
                    })
                        );
                }

                Task.WaitAll(tasks.ToArray());
                campaign.Campaign_update_send(Id, countlines);
                campaign.Campaign_update_progress(Id, "start", true, 0);
                return(Result);
            }
            else
            {
                Result.Add("Campaign Not Found " + Id);
                logger.Debug("Campaign Not Found " + Id);
                campaign.Campaign_update_progress(Id, "start", true, 0);
                return(Result);
            }
        }
Exemple #2
0
        public List <string> Send()
        {
            List <string> Result              = new List <string>();
            Campaign      campaign            = new Campaign(Artisan);
            int           c_seed              = 0;
            int           placeholder_counter = 1;
            Random        random              = new Random();

            dynamic cdata = campaign.Campaign_info(Id);

            if (cdata != null)
            {
                string   raw_rp      = Convert.ToString(cdata.return_path) ?? "";
                string[] seed_emails = Campaign.Convert_emails(Convert.ToString(cdata.email_test));
                string   raw_hd      = Text.Base64Decode(Convert.ToString(cdata.header));
                string   raw_bd      = Text.Base64Decode(Convert.ToString(cdata.body));
                var      servers     = Campaign.Convert_ips(Convert.ToString(cdata.ips), Convert.ToString(cdata.option));
                if (servers.Count == 0)
                {
                    Result.Add("No Servers To Process");
                    logger.Error("No Servers To Process");
                    campaign.Campaign_update_progress(Id, "start", true, 0);
                    return(Result);
                }
                string file          = "/" + Convert.ToString(cdata.send_file);
                bool   IsPlaceholder = Convert.ToString(cdata.is_placeholder) == "1";
                if (IsPlaceholder)
                {
                    Placeholder = new Placeholder(cdata.placeholder_data, (int)cdata.placeholder_every);
                }
                bool IsAutoReply = Convert.ToString(cdata.is_auto_reply) == "1";
                if (IsAutoReply)
                {
                    Reply = new Rotation(cdata.auto_reply_data, (int)cdata.auto_reply_every);
                }
                bool IsNegative = Convert.ToString(cdata.is_negative) == "1";
                if (IsNegative && string.IsNullOrEmpty(Negative))
                {
                    Negative = campaign.Campaign_negative(Convert.ToString(cdata.negative));
                }

                if (IsNegative)
                {
                    raw_bd = Text.Build_negative(raw_bd, Negative);
                }
                //read all config then loop, fixed content
                for (int i = 0; i < Loop; i++) //loop
                {
                    Console.WriteLine("Reply Loop : " + i);
                    foreach (var server in servers)
                    {
                        try
                        {
                            var details_server = campaign.Server_info(int.Parse((string)server.Key));
                            if (details_server != null)
                            {
                                Pmta p = new Pmta((string)details_server.ip, Password); //load pmta
                                foreach (var ip in server.Value)
                                {
                                    var info_send = campaign.Campaign_send_info(Id);
                                    if (info_send != null)
                                    {
                                        int total_send = 0, value_to_send = 0; //check fraction
                                        int total_sended = int.Parse((string)info_send.send_progress);
                                        int file_count   = int.Parse((string)info_send.send_count);
                                        if (total_sended + Fraction >= file_count)
                                        {
                                            if (file_count - total_sended <= 0)
                                            {
                                                campaign.Campaign_update_progress(Id, "finish", true, 0);
                                                Result.Add("Campaign Ended" + Id);
                                                p.Close(); //close
                                                return(Result);
                                            }
                                            else
                                            {
                                                value_to_send = file_count - total_sended;
                                            }
                                        }
                                        else
                                        {
                                            value_to_send = Fraction;
                                        }

                                        //load emails

                                        List <string[]> emails = File.ReadLines(Storage + file).Skip(total_sended).Take(value_to_send)
                                                                 .Select(t => t.Trim().Split(','))
                                                                 .Where(item => item.Length == 2)
                                                                 .ToList();
                                        if (emails.Count > 0)
                                        {
                                            string rdns = Text.Rdns(ip["ip"], ip["domain"]);
                                            foreach (string[] email in emails)
                                            {
                                                string currentEmail = IsAutoReply ? Reply.GetAndRotate() : email[1];
                                                string key          = Text.Adler32($"{Id}{email[0]}");

                                                string redirect    = Text.Base64Encode($"{Id}-{email[0]}-{key}-{SendId}-{random.Next(1000, 999999)}");
                                                string unsubscribe = Text.Base64Encode($"{Id}-{email[0]}-{key}-{SendId}-{random.Next(1000, 999999)}");
                                                string open        = Text.Base64Encode($"{Id}-{email[0]}-{key}-{SendId}-{random.Next(1000, 999999)}");

                                                string boundary  = Text.Random("[rndlu/30]");
                                                string bnd       = Text.Boundary(raw_hd);
                                                string hd        = Text.ReplaceBoundary(raw_hd);
                                                string bd        = Text.ReplaceBoundary(raw_bd);
                                                string emailName = email[1].Split('@')[0];
                                                string rp        = Text.Build_rp(raw_rp, ip["domain"], rdns, emailName, currentEmail, ip["idi"], ip["idd"], ip["ids"], (string)details_server.name + ip["ids"], email[1]);
                                                rp = IsPlaceholder ? Placeholder.ReplaceRotate(rp, placeholder_counter) : rp; // replace and rotate return path
                                                hd = Text.Build_header(hd, ip["ip"], (string)details_server.name + ip["ids"], ip["domain"], rdns, email[1], emailName, boundary, bnd, currentEmail, ip["idi"], ip["idd"], ip["ids"], email[0]);
                                                hd = IsPlaceholder ? Placeholder.ReplaceRotate(hd, placeholder_counter) : hd; //replace and rotate header
                                                hd = Text.Inject_header(hd, "x", Id.ToString(), Username, ip["ip"], ip["idd"], email[0]);
                                                bd = Text.Build_body(bd, ip["ip"], (string)details_server.name + ip["ids"], ip["domain"], rdns, email[1], emailName, redirect, unsubscribe, open, boundary, bnd, currentEmail, ip["idi"], ip["idd"], ip["ids"], email[1]);
                                                bd = IsPlaceholder ? Placeholder.ReplaceRotate(bd, placeholder_counter) : bd; //replace and rotate body

                                                Message message = new Message(rp);
                                                message.AddData(Text.ReplaceBoundary(hd + "\n" + bd + "\n\n", bnd));
                                                message.AddRecipient(new Recipient(currentEmail));
                                                message.VirtualMTA = ip["vmta"];
                                                message.JobID      = Id.ToString();
                                                message.EnvID      = Id.ToString();
                                                message.Verp       = false;
                                                message.Encoding   = Encoding.EightBit;
                                                p.Send(message);
                                                total_send++;
                                                c_seed++;
                                                //Task.Run(() => campaign.Campaign_update_send(Id, total_send + total_sended));
                                                campaign.Campaign_update_send(Id, total_send + total_sended);
                                                if (Seed != 0 && c_seed % Seed == 0 && seed_emails.Length > 0)
                                                {
                                                    foreach (string test_email in seed_emails)
                                                    {
                                                        string currentTest = IsAutoReply ? Reply.GetCurrent() : test_email;

                                                        string tkey         = Text.Adler32($"{Id}0");
                                                        string tredirect    = Text.Base64Encode($"{Id}-0-{tkey}-{SendId}-{random.Next(1000, 999999)}");
                                                        string tunsubscribe = Text.Base64Encode($"{Id}-0-{tkey}-{SendId}-{random.Next(1000, 999999)}");
                                                        string topen        = Text.Base64Encode($"{Id}-0-{tkey}-{SendId}-{random.Next(1000, 999999)}");

                                                        string tboundary  = Text.Random("[rndlu/30]");
                                                        string tbnd       = Text.Boundary(raw_hd);
                                                        string thd        = Text.ReplaceBoundary(raw_hd);
                                                        string tbd        = Text.ReplaceBoundary(raw_bd);
                                                        string temailName = test_email.Split('@')[0];
                                                        string trp        = Text.Build_rp(raw_rp, ip["domain"], rdns, temailName, currentTest, "", ip["idi"], ip["idd"], ip["ids"], (string)details_server.name + ip["ids"]);
                                                        trp = IsPlaceholder ? Placeholder.ReplaceCurrent(trp) : trp; //return path placeholder
                                                        thd = Text.Build_header(thd, ip["ip"], (string)details_server.name + ip["ids"], ip["domain"], rdns, test_email, temailName, tboundary, tbnd, currentTest, "", ip["idi"], ip["idd"], ip["ids"]);
                                                        thd = IsPlaceholder ? Placeholder.ReplaceCurrent(thd) : thd; //head placeholder
                                                        thd = Text.Inject_header(thd, "x", Id.ToString(), Username, ip["ip"], ip["idd"]);
                                                        tbd = Text.Build_body(tbd, ip["ip"], (string)details_server.name + ip["ids"], ip["domain"], rdns, test_email, temailName, tredirect, tunsubscribe, topen, tboundary, tbnd, currentTest, "", ip["idi"], ip["idd"], ip["ids"]);
                                                        tbd = IsPlaceholder ? Placeholder.ReplaceCurrent(tbd) : tbd; // body placeholder
                                                        Message testMessage = new Message(trp);
                                                        testMessage.AddData(thd + "\n" + tbd + "\n\n");
                                                        testMessage.AddRecipient(new Recipient(currentTest));
                                                        testMessage.VirtualMTA = ip["vmta"];
                                                        testMessage.JobID      = Id.ToString();
                                                        testMessage.EnvID      = Id.ToString();
                                                        testMessage.Verp       = false;
                                                        testMessage.Encoding   = Encoding.EightBit;
                                                        p.Send(testMessage);
                                                    }
                                                }
                                                if (IsPlaceholder)
                                                {
                                                    placeholder_counter++;                //increment placeholder counter
                                                }
                                            }
                                        }
                                        else
                                        {
                                            Result.Add("Emails Empty" + Id);
                                            logger.Error("Emails Empty" + Id);
                                            campaign.Campaign_update_progress(Id, "start", true, 0);
                                            p.Close();
                                            return(Result);
                                        }
                                    }
                                    else
                                    {
                                        Result.Add("Cant get Send progress campaign" + Id);
                                        logger.Error("Cant get Send progress campaign" + Id);
                                        campaign.Campaign_update_progress(Id, "start", true, 0);
                                        p.Close();
                                        return(Result);
                                    }
                                    Thread.Sleep(Delay * 1000); //sleep delay
                                }
                                p.Close();                      //close pmta connection
                            }
                            else
                            {
                                Result.Add("Server Not Found " + server.Key);
                                logger.Error("Server Not Found " + server.Key);
                                campaign.Campaign_update_progress(Id, "start", true, 0);
                                return(Result);
                            }
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine($"ERR SERVER ID {server.Key} {ex.Message} -- {ex.StackTrace}");
                            logger.Error($"ERR SERVER ID {server.Key}  {ex.Message} -- {ex.StackTrace}");
                        }
                    }
                    Thread.Sleep(Sleep * 1000);
                }
                campaign.Campaign_update_progress(Id, "start", true, 0);
                return(Result);
            }
            else
            {
                Result.Add("Campaign Not Found " + Id);
                logger.Debug("Campaign Not Found " + Id);
                campaign.Campaign_update_progress(Id, "start", true, 0);
                return(Result);
            }
        }
Exemple #3
0
        public List <string> Send()
        {
            List <string> Result   = new List <string>();
            Campaign      campaign = new Campaign(Artisan);
            Message       message;
            int           c_seed = 0;
            Random        random = new Random();

            for (int i = 0; i < Loop; i++) //loop
            {
                Console.WriteLine("Loop : " + i);
                try
                {
                    dynamic cdata = campaign.Campaign_info(Id);
                    if (cdata != null)
                    {
                        string   raw_rp           = Convert.ToString(cdata.return_path) ?? "";
                        string[] seed_emails      = Campaign.Convert_emails(Convert.ToString(cdata.email_test));
                        string   raw_hd           = Text.Base64Decode(Convert.ToString(cdata.header));
                        string   raw_bd           = Text.Base64Decode(Convert.ToString(cdata.body));
                        var      servers          = Campaign.Convert_ips(Convert.ToString(cdata.ips));
                        string   file             = "/" + Convert.ToString(cdata.send_file);
                        string   platform         = Convert.ToString(cdata.platform);
                        string   redirect_link    = Convert.ToString(cdata.redirect_link);
                        string   unsubscribe_link = Convert.ToString(cdata.unsubscribe_link);

                        foreach (var server in servers)
                        {
                            var details_server = campaign.Server_info(int.Parse((string)server.Key));
                            if (details_server != null)
                            {
                                Pmta p = new Pmta(Convert.ToString(details_server.ip), Password); //load pmta
                                foreach (var ip in server.Value)
                                {
                                    var info_send = campaign.Campaign_send_info(Id);
                                    if (info_send != null)
                                    {
                                        int total_send = 0, value_to_send = 0; //check fraction
                                        int total_sended = int.Parse((string)info_send.send_progress);
                                        int file_count   = int.Parse((string)info_send.send_count);
                                        if (total_sended + Fraction >= file_count)
                                        {
                                            if (file_count - total_sended <= 0)
                                            {
                                                campaign.Campaign_update_progress(Id, "finish", true, 0);
                                                Result.Add("Campaign Ended" + Id);
                                                p.Close(); //close
                                                return(Result);
                                            }
                                            else
                                            {
                                                value_to_send = file_count - total_sended;
                                            }
                                        }
                                        else
                                        {
                                            value_to_send = Fraction;
                                        }

                                        //load emails

                                        List <string[]> emails = File.ReadLines(Storage + file).Skip(total_sended).Take(value_to_send)
                                                                 .Select(t => t.Trim().Split(','))
                                                                 .Where(item => item.Length == 2)
                                                                 .ToList();
                                        if (emails.Count > 0)
                                        {
                                            string email_ip = ip["ip"];
                                            string domain   = ip["domain"];
                                            string rdns     = Text.Rdns(email_ip, domain);
                                            string vmta_ip  = email_ip.Replace(':', '.');
                                            string vmta     = Mta.ToLower() == "none" ? $"mta-{vmta_ip}" : (Mta == "vmta" ? $"vmta-{vmta_ip}-{Username}" : $"smtp-{vmta_ip}-{Username}");
                                            string job      = $"{Id}";

                                            string rp = Text.Build_rp(raw_rp, domain, rdns, "reply");
                                            message = new Message(rp);
                                            string header = Text.Header_normal(raw_hd);
                                            message.AddMergeData(Text.Generate(header + "\n" + raw_bd));
                                            message.VirtualMTA = vmta;
                                            message.JobID      = Id.ToString();
                                            message.Verp       = false;
                                            message.Encoding   = Encoding.EightBit;

                                            foreach (string[] email in emails)
                                            {
                                                Recipient r = new Recipient(email[1]);
                                                //links
                                                string key = Text.Adler32($"{Id}{email[0]}");
                                                r["red"]   = Text.Base64Encode($"{Id}-{email[0]}-{key}-{random.Next(1000, 99999)}");
                                                r["unsub"] = Text.Base64Encode($"{Id}-{email[0]}-{key}-{random.Next(1000, 99999)}");
                                                r["opn"]   = Text.Base64Encode($"{Id}-{email[0]}-{key}-{random.Next(1000, 99999)}");

                                                //header body
                                                r["pe"]       = $"n,{Id},{Username},{ip["ip"]},{ip["idd"]},{email[0]}";
                                                r["ip"]       = email_ip;
                                                r["domain"]   = domain;
                                                r["rdns"]     = rdns;
                                                r["name"]     = email[1].Split('@')[0];
                                                r["to"]       = email[1];
                                                r["date"]     = Text.GetRFC822Date();
                                                r["boundary"] = Text.Random("[rndlu/30]");
                                                r["*parts"]   = "1";

                                                message.AddRecipient(r);

                                                total_send++;
                                                c_seed++;

                                                if (Seed != 0 && c_seed % Seed == 0)
                                                {
                                                    if (seed_emails.Length > 0)
                                                    {
                                                        foreach (string test_email in seed_emails)
                                                        {
                                                            Recipient t = new Recipient(test_email);
                                                            //links
                                                            string tkey = Text.Adler32($"{Id}0");
                                                            t["red"]   = Text.Base64Encode($"{Id}-0-{tkey}-{random.Next(1000, 99999)}");
                                                            t["unsub"] = Text.Base64Encode($"{Id}-0-{tkey}-{random.Next(1000, 99999)}");
                                                            t["opn"]   = Text.Base64Encode($"{Id}-0-{tkey}-{random.Next(1000, 99999)}");

                                                            //header body
                                                            t["pe"]       = $"t,{Id},{Username},{ip["ip"]},{ip["idd"]},0";
                                                            t["ip"]       = email_ip;
                                                            t["domain"]   = domain;
                                                            t["rdns"]     = rdns;
                                                            t["name"]     = test_email.Split('@')[0];
                                                            t["to"]       = email[1];
                                                            t["date"]     = Text.GetRFC822Date();
                                                            t["boundary"] = Text.Random("[rndlu/30]");
                                                            t["*parts"]   = "1";
                                                            message.AddRecipient(t);
                                                        }
                                                    }
                                                }
                                            }
                                            p.Send(message);
                                            Task.Run(() => campaign.Campaign_update_send(Id, total_send + total_sended));
                                        }
                                        else
                                        {
                                            Result.Add("Emails Empty" + Id);
                                            logger.Error("Emails Empty" + Id);
                                            campaign.Campaign_update_progress(Id, "start", true, 0);
                                            p.Close();
                                            return(Result);
                                        }
                                    }
                                    else
                                    {
                                        Result.Add("Cant get Send progress campaign" + Id);
                                        logger.Error("Cant get Send progress campaign" + Id);
                                        campaign.Campaign_update_progress(Id, "start", true, 0);
                                        p.Close();
                                        return(Result);
                                    }
                                    Thread.Sleep(Delay * 1000); //sleep delay
                                }
                                p.Close();                      //close pmta connection
                            }
                            else
                            {
                                Result.Add("Server Not Found " + server.Key);
                                logger.Error("Server Not Found " + server.Key);
                                campaign.Campaign_update_progress(Id, "start", true, 0);
                                return(Result);
                            }
                        }
                    }
                    else
                    {
                        Result.Add("Campaign Not Found " + Id);
                        logger.Debug("Campaign Not Found " + Id);
                        campaign.Campaign_update_progress(Id, "start", true, 0);
                        return(Result);
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"ERR {ex.Message} -- {ex.StackTrace}");
                    logger.Error($"ERR {ex.Message} -- {ex.StackTrace}");
                }
                Thread.Sleep(Sleep * 1000);
            }

            campaign.Campaign_update_progress(Id, "start", true, 0);
            return(Result);
        }
Exemple #4
0
        public List <string> Send()
        {
            List <string> Result   = new List <string>();
            Encryption    enc      = new Encryption(); //links encrpytion
            Campaign      campaign = new Campaign(Artisan);
            //int c_seed = 0;

            dynamic cdata = campaign.Campaign_info(Id); //get info campaign

            if (cdata != null)
            {
                string      raw_rp           = Convert.ToString(cdata.return_path);
                string[]    seed_emails      = Campaign.Convert_emails(Convert.ToString(cdata.email_test));
                string      raw_hd           = Text.Base64Decode(Convert.ToString(cdata.header));
                string      raw_bd           = Text.Base64Decode(Convert.ToString(cdata.body));
                var         servers          = Campaign.Bulk_split(Convert.ToString(cdata.ips));
                string      file             = Storage + "/" + Convert.ToString(cdata.send_file);
                string      platform         = Convert.ToString(cdata.platform);
                string      redirect_link    = Convert.ToString(cdata.redirect_link);
                string      unsubscribe_link = Convert.ToString(cdata.unsubscribe_link);
                int         countIps         = servers.Count;
                List <Task> tasks            = new List <Task>();

                for (int i = 0; i < Loop; i++)
                {
                    var info_send = campaign.Campaign_send_info(Id);
                    if (info_send != null)
                    {
                        int dataToSend   = countIps * Fraction;
                        int total_sended = int.Parse((string)info_send.send_progress);
                        int file_count   = int.Parse((string)info_send.send_count);
                        int value_to_send;
                        if (total_sended + dataToSend >= file_count)
                        {
                            if (total_sended - file_count <= 0)
                            {
                                campaign.Campaign_update_progress(Id, "finish", true, 0);
                                Result.Add("Campaign Ended" + Id);
                                return(Result);
                            }
                            else
                            {
                                value_to_send = file_count - total_sended;
                            }
                        }
                        else
                        {
                            value_to_send = dataToSend;
                        }


                        List <int> ipLimit = Campaign.DistributeInteger(value_to_send, countIps).ToList();

                        for (int j = 0; j < countIps; j++)
                        {
                            int current = j;

                            tasks.Add(
                                Task.Factory.StartNew(() =>
                            {
                                try
                                {
                                    if (ipLimit[current] > 0)
                                    {
                                        var details_server = campaign.Server_info(int.Parse(servers[current][4]));
                                        if (details_server != null)
                                        {
                                            int skip = (current == 0 ? 0 : ipLimit.Take(current).Sum()) + total_sended;
                                            List <string[]> emails = File.ReadLines(file).Skip(skip).Take(ipLimit[current])
                                                                     .Select(t => t.Trim().Split(','))
                                                                     .Where(item => item.Length == 2)
                                                                     .ToList();
                                            if (emails.Count > 0)
                                            {
                                                PickupFile helper = new PickupFile();
                                            }
                                        }
                                    }
                                }
                                catch (Exception ex)
                                {
                                    logger.Error($"ERR {ex.Message} -- {ex.StackTrace}");
                                    Console.WriteLine($"ERR {ex.Message} -- {ex.StackTrace}");
                                }
                            })
                                );
                        }

                        Task.WaitAll(tasks.ToArray());
                        campaign.Campaign_update_send(Id, value_to_send + total_sended);
                        campaign.Campaign_update_progress(Id, "start", true, 0);
                    }
                    else
                    {
                        Result.Add("Cant get Send progress campaign" + Id);
                        logger.Error("Cant get Send progress campaign" + Id);
                        campaign.Campaign_update_progress(Id, "start", true, 0);
                    }
                }
            }



            return(Result);
        }
Exemple #5
0
        public List <string> Send()
        {
            List <string> Result              = new List <string>();
            Campaign      campaign            = new Campaign(Artisan);
            int           placeholder_counter = 1;
            int           c_seed              = 0;
            Random        random              = new Random();

            for (int i = 0; i < Loop; i++) //loop
            {
                Console.WriteLine("Loop : " + i);
                try
                {
                    dynamic cdata = campaign.Campaign_info(Id);
                    if (cdata != null)
                    {
                        string   raw_rp      = Convert.ToString(cdata.return_path) ?? "";
                        string[] seed_emails = Campaign.Convert_emails(Convert.ToString(cdata.email_test));
                        string   raw_hd      = Text.Base64Decode(Convert.ToString(cdata.header));
                        string   raw_bd      = Text.Base64Decode(Convert.ToString(cdata.body));
                        var      servers     = Campaign.Convert_ips(Convert.ToString(cdata.ips), Convert.ToString(cdata.option));
                        if (servers.Count == 0)
                        {
                            Result.Add("No Servers To Process");
                            logger.Error("No Servers To Process");
                            campaign.Campaign_update_progress(Id, "start", true, 0);
                            return(Result);
                        }
                        string file             = "/" + Convert.ToString(cdata.send_file);
                        string platform         = Convert.ToString(cdata.platform);
                        string redirect_link    = Convert.ToString(cdata.redirect_link);
                        string unsubscribe_link = Convert.ToString(cdata.unsubscribe_link);
                        bool   IsPlaceholder    = Convert.ToString(cdata.is_placeholder) == "1";
                        if (IsPlaceholder)
                        {
                            Placeholder = new Placeholder(cdata.placeholder_data, (int)cdata.placeholder_every);
                        }
                        bool IsAutoReply = Convert.ToString(cdata.is_auto_reply) == "1";
                        if (IsAutoReply)
                        {
                            Reply = new Rotation(cdata.auto_reply_data, (int)cdata.auto_reply_every);
                        }

                        bool IsNegative = Convert.ToString(cdata.is_negative) == "1";
                        if (IsNegative && string.IsNullOrEmpty(Negative))
                        {
                            Negative = campaign.Campaign_negative(Convert.ToString(cdata.negative));
                        }

                        if (IsNegative)
                        {
                            raw_bd = Text.Build_negative(raw_bd, Negative);
                        }

                        foreach (var server in servers)
                        {
                            try
                            {
                                var details_server = campaign.Server_info(int.Parse((string)server.Key));
                                if (details_server != null)
                                {
                                    Pmta p = new Pmta(Convert.ToString(details_server.ip), Password); //load pmta
                                    foreach (var ip in server.Value)
                                    {
                                        var info_send = campaign.Campaign_send_info(Id);
                                        if (info_send != null)
                                        {
                                            int total_send = 0, value_to_send = 0; //check fraction
                                            int total_sended = int.Parse((string)info_send.send_progress);
                                            int file_count   = int.Parse((string)info_send.send_count);
                                            if (total_sended + Fraction >= file_count)
                                            {
                                                if (file_count - total_sended <= 0)
                                                {
                                                    campaign.Campaign_update_progress(Id, "finish", true, 0);
                                                    Result.Add("Campaign Ended" + Id);
                                                    p.Close(); //close
                                                    return(Result);
                                                }
                                                else
                                                {
                                                    value_to_send = file_count - total_sended;
                                                }
                                            }
                                            else
                                            {
                                                value_to_send = Fraction;
                                            }

                                            //load emails

                                            List <string[]> emails = File.ReadLines(Storage + file).Skip(total_sended).Take(value_to_send)
                                                                     .Select(t => t.Trim().Split(','))
                                                                     .Where(item => item.Length == 2)
                                                                     .ToList();
                                            if (emails.Count > 0)
                                            {
                                                string rdns = Text.Rdns(ip["ip"], ip["domain"]);
                                                string rp   = Text.Build_rp(raw_rp, ip["domain"], rdns, "info");
                                                rp = IsPlaceholder ? Placeholder.ReplaceRotate(rp, placeholder_counter) : rp;
                                                Message message = new Message(rp);
                                                string  header  = Text.Header_normal(raw_hd);
                                                string  genB    = Text.ReplaceBoundary(header + "\n" + raw_bd + "\n\n");
                                                message.AddMergeData(Text.Generate(genB));
                                                message.VirtualMTA = ip["vmta"];
                                                message.JobID      = Id.ToString();
                                                message.EnvID      = Id.ToString();
                                                message.Verp       = false;
                                                message.Encoding   = Encoding.EightBit;

                                                foreach (string[] email in emails)
                                                {
                                                    string currentEmail = IsAutoReply ? Reply.GetAndRotate() : email[1];

                                                    Recipient r = new Recipient(currentEmail);
                                                    //links
                                                    string key = Text.Adler32($"{Id}{email[0]}");
                                                    r["red"]   = Text.Base64Encode($"{Id}-{email[0]}-{key}-{SendId}-{random.Next(1000, 999999)}");
                                                    r["unsub"] = Text.Base64Encode($"{Id}-{email[0]}-{key}-{SendId}-{random.Next(1000, 999999)}");
                                                    r["opn"]   = Text.Base64Encode($"{Id}-{email[0]}-{key}-{SendId}-{random.Next(1000, 999999)}");

                                                    //header body
                                                    r["pe"]       = $"n,{Id},{Username},{ip["ip"]},{ip["idd"]},{email[0]}";
                                                    r["ip"]       = ip["ip"];
                                                    r["server"]   = (string)details_server.name + ip["ids"];
                                                    r["domain"]   = ip["domain"];
                                                    r["idi"]      = ip["idi"];
                                                    r["idd"]      = ip["idd"];
                                                    r["ids"]      = ip["ids"];
                                                    r["ide"]      = email[0];
                                                    r["rdns"]     = rdns;
                                                    r["name"]     = currentEmail.Split('@')[0];
                                                    r["to"]       = email[1];
                                                    r["reply"]    = currentEmail;
                                                    r["date"]     = Text.GetRFC822Date();
                                                    r["boundary"] = Text.Random("[rndlu/30]");
                                                    r["bnd"]      = Text.Boundary(header);
                                                    r["*parts"]   = "1";
                                                    if (IsPlaceholder)
                                                    {
                                                        r = Placeholder.ReplaceRotateReciption(r, placeholder_counter);
                                                    }
                                                    message.AddRecipient(r);

                                                    total_send++;
                                                    c_seed++;
                                                    placeholder_counter++;

                                                    if (Seed != 0 && c_seed % Seed == 0 && seed_emails.Length > 0)
                                                    {
                                                        foreach (string test_email in seed_emails)
                                                        {
                                                            string    currentTest = IsAutoReply ? Reply.GetCurrent() : test_email;
                                                            Recipient t           = new Recipient(currentTest);
                                                            //links
                                                            string tkey = Text.Adler32($"{Id}0");
                                                            t["red"]   = Text.Base64Encode($"{Id}-0-{tkey}-{SendId}-{random.Next(1000, 999999)}");
                                                            t["unsub"] = Text.Base64Encode($"{Id}-0-{tkey}-{SendId}-{random.Next(1000, 999999)}");
                                                            t["opn"]   = Text.Base64Encode($"{Id}-0-{tkey}-{SendId}-{random.Next(1000, 999999)}");

                                                            //header body
                                                            t["pe"]       = $"t,{Id},{Username},{ip["ip"]},{ip["idd"]},0";
                                                            t["ip"]       = ip["ip"];
                                                            t["server"]   = (string)details_server.name + ip["ids"];
                                                            t["domain"]   = ip["domain"];
                                                            t["idi"]      = ip["idi"];
                                                            t["idd"]      = ip["idd"];
                                                            t["ids"]      = ip["ids"];
                                                            t["ide"]      = "0";
                                                            t["rdns"]     = rdns;
                                                            t["name"]     = currentTest.Split('@')[0];
                                                            t["to"]       = test_email;
                                                            t["reply"]    = currentTest;
                                                            t["date"]     = Text.GetRFC822Date();
                                                            t["boundary"] = Text.Random("[rndlu/30]");
                                                            t["bnd"]      = Text.Boundary(header);
                                                            t["*parts"]   = "1";
                                                            if (IsPlaceholder)
                                                            {
                                                                t = Placeholder.ReplaceCurrentReciption(t);
                                                            }
                                                            message.AddRecipient(t);
                                                        }
                                                    }
                                                }
                                                p.Send(message);
                                                //Task.Run(() => campaign.Campaign_update_send(Id, total_send + total_sended));
                                                campaign.Campaign_update_send(Id, total_send + total_sended);
                                            }
                                            else
                                            {
                                                Result.Add("Emails Empty" + Id);
                                                logger.Error("Emails Empty" + Id);
                                                campaign.Campaign_update_progress(Id, "start", true, 0);
                                                p.Close();
                                                return(Result);
                                            }
                                        }
                                        else
                                        {
                                            Result.Add("Cant get Send progress campaign" + Id);
                                            logger.Error("Cant get Send progress campaign" + Id);
                                            campaign.Campaign_update_progress(Id, "start", true, 0);
                                            p.Close();
                                            return(Result);
                                        }
                                        Thread.Sleep(Delay * 1000); //sleep delay
                                    }
                                    p.Close();                      //close pmta connection
                                }
                                else
                                {
                                    Result.Add("Server Not Found " + server.Key);
                                    logger.Error("Server Not Found " + server.Key);
                                    campaign.Campaign_update_progress(Id, "start", true, 0);
                                    return(Result);
                                }
                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine($"ERR SERVER ID {server.Key} {ex.Message} -- {ex.StackTrace}");
                                logger.Error($"ERR SERVER ID {server.Key}  {ex.Message} -- {ex.StackTrace}");
                            }
                        }
                    }
                    else
                    {
                        Result.Add("Campaign Not Found " + Id);
                        logger.Debug("Campaign Not Found " + Id);
                        campaign.Campaign_update_progress(Id, "start", true, 0);
                        return(Result);
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"ERR {ex.Message} -- {ex.StackTrace}");
                    logger.Error($"ERR {ex.Message} -- {ex.StackTrace}");
                }
                Thread.Sleep(Sleep * 1000);
            }
            campaign.Campaign_update_progress(Id, "start", true, 0);
            return(Result);
        }
Exemple #6
0
        public List <string> Send()
        {
            List <string> Result              = new List <string>();
            Campaign      campaign            = new Campaign(Artisan);
            List <Task>   tasks               = new List <Task>();
            Random        random              = new Random();
            int           c_seed              = 0;
            int           placeholder_counter = 1;

            for (int l = 0; l < Loop; l++) //loop
            {
                Console.WriteLine("Loop : " + l);
                try
                {
                    dynamic cdata = campaign.Campaign_info(Id);
                    if (cdata != null)
                    {
                        string   raw_rp      = Convert.ToString(cdata.return_path) ?? "";
                        string[] seed_emails = Campaign.Convert_emails(Convert.ToString(cdata.email_test));
                        string   raw_hd      = Text.Base64Decode(Convert.ToString(cdata.header));
                        string   raw_bd      = Text.Base64Decode(Convert.ToString(cdata.body));
                        var      servers     = Campaign.Bulk_split(Convert.ToString(cdata.ips));
                        if (servers.Count == 0)
                        {
                            Result.Add("No Servers To Process");
                            logger.Error("No Servers To Process");
                            campaign.Campaign_update_progress(Id, "start", true, 0);
                            return(Result);
                        }
                        string file             = "/" + Convert.ToString(cdata.send_file);
                        string platform         = Convert.ToString(cdata.platform);
                        string redirect_link    = Convert.ToString(cdata.redirect_link);
                        string unsubscribe_link = Convert.ToString(cdata.unsubscribe_link);
                        bool   IsPlaceholder    = Convert.ToString(cdata.is_placeholder) == "1";
                        if (IsPlaceholder)
                        {
                            Placeholder = new Placeholder(cdata.placeholder_data, (int)cdata.placeholder_every);
                        }
                        bool IsAutoReply = Convert.ToString(cdata.is_auto_reply) == "1";
                        if (IsAutoReply)
                        {
                            Reply = new Rotation(cdata.auto_reply_data, (int)cdata.auto_reply_every);
                        }
                        bool IsNegative = Convert.ToString(cdata.is_negative) == "1";
                        if (IsNegative && string.IsNullOrEmpty(Negative))
                        {
                            Negative = campaign.Campaign_negative(Convert.ToString(cdata.negative));
                        }
                        if (IsNegative)
                        {
                            raw_bd = Text.Build_negative(raw_bd, Negative);
                        }

                        string mta      = Convert.ToString(cdata.option);
                        int    progress = int.Parse(Convert.ToString(cdata.send_progress));
                        int    total    = int.Parse(Convert.ToString(cdata.send_count));
                        int    countIps = servers.Count;

                        if (total - progress <= 0)
                        {
                            campaign.Campaign_update_progress(Id, "finish", true, 0);
                            return(Result);
                        }

                        int toSend = countIps * Fraction;
                        if (total - (progress + (countIps * Fraction)) < 0)
                        {
                            toSend = total - progress;
                        }

                        List <int> ipLimit = Campaign.DistributeInteger(toSend, countIps).ToList();
                        for (int i = 0; i < countIps; i++)
                        {
                            int current = i;
                            tasks.Add(
                                Task.Factory.StartNew(() =>
                            {
                                try
                                {
                                    if (ipLimit[current] > 0)
                                    {
                                        var details_server = campaign.Server_info(int.Parse(servers[current][4]));
                                        if (details_server != null)
                                        {
                                            Pmta p   = new Pmta(Convert.ToString(details_server.ip), Password);    //load pmta
                                            int skip = (current == 0 ? 0 : ipLimit.Take(current).Sum()) + progress;
                                            Console.WriteLine("skip " + skip);

                                            List <string[]> emails = File.ReadLines(Storage + file).Skip(skip).Take(ipLimit[current])
                                                                     .Select(t => t.Trim().Split(','))
                                                                     .Where(item => item.Length == 2)
                                                                     .ToList();
                                            if (emails.Count > 0)
                                            {
                                                string vmta = "mta-" + servers[current][0].Replace(":", ".");
                                                if (servers[current].Length == 6)
                                                {
                                                    vmta = $"{mta}-{servers[current][0].Replace(":", ".")}-{servers[current][5]}";
                                                }
                                                string rdns     = Text.Rdns(servers[current][0], servers[current][1]);
                                                string rp       = Text.Build_rp(raw_rp, servers[current][1], rdns, "info");
                                                rp              = IsPlaceholder ? Placeholder.ReplaceRotate(rp, placeholder_counter, true) : rp;
                                                Message message = new Message(rp);
                                                string header   = Text.Header_normal(raw_hd);
                                                string genB     = Text.ReplaceBoundary(header + "\n" + raw_bd + "\n\n");
                                                message.AddMergeData(Text.Generate(genB));
                                                message.VirtualMTA = vmta;
                                                message.JobID      = Id.ToString();
                                                message.EnvID      = Id.ToString();
                                                message.Verp       = false;
                                                message.Encoding   = Encoding.EightBit;

                                                foreach (string[] email in emails)
                                                {
                                                    string currentEmail = IsAutoReply ? Reply.ThreadGetAndRotate() : email[1];

                                                    Recipient r = new Recipient(currentEmail);
                                                    //links
                                                    string key = Text.Adler32($"{Id}{email[0]}");
                                                    r["red"]   = Text.Base64Encode($"{Id}-{email[0]}-{key}-{SendId}-{random.Next(1000, 999999)}");
                                                    r["unsub"] = Text.Base64Encode($"{Id}-{email[0]}-{key}-{SendId}-{random.Next(1000, 999999)}");
                                                    r["opn"]   = Text.Base64Encode($"{Id}-{email[0]}-{key}-{SendId}-{random.Next(1000, 999999)}");

                                                    //header body
                                                    r["pe"]       = $"b,{Id},{Username},{servers[current][0]},{servers[current][3]},{email[0]}";
                                                    r["ip"]       = servers[current][0];
                                                    r["server"]   = (string)details_server.name + servers[current][4];
                                                    r["domain"]   = servers[current][1];
                                                    r["idi"]      = servers[current][2];
                                                    r["idd"]      = servers[current][3];
                                                    r["ids"]      = servers[current][4];
                                                    r["ide"]      = email[0];
                                                    r["rdns"]     = rdns;
                                                    r["name"]     = currentEmail.Split('@')[0];
                                                    r["to"]       = email[1];
                                                    r["reply"]    = currentEmail;
                                                    r["date"]     = Text.GetRFC822Date();
                                                    r["boundary"] = Text.Random("[rndlu/30]");
                                                    r["bnd"]      = Text.Boundary(header);
                                                    r["*parts"]   = "1";
                                                    if (IsPlaceholder)
                                                    {
                                                        r = Placeholder.ReplaceRotateReciption(r, placeholder_counter, true);
                                                    }

                                                    message.AddRecipient(r);
                                                    Interlocked.Increment(ref c_seed);
                                                    Interlocked.Increment(ref placeholder_counter);

                                                    if (Seed != 0 && c_seed % Seed == 0 && seed_emails.Length > 0)
                                                    {
                                                        foreach (string test_email in seed_emails)
                                                        {
                                                            string currentTest = IsAutoReply ? Reply.GetCurrent() : test_email;

                                                            Recipient t = new Recipient(currentTest);
                                                            //links
                                                            string tkey = Text.Adler32($"{Id}0");
                                                            t["red"]    = Text.Base64Encode($"{Id}-0-{tkey}-{SendId}-{random.Next(1000, 999999)}");
                                                            t["unsub"]  = Text.Base64Encode($"{Id}-0-{tkey}-{SendId}-{random.Next(1000, 999999)}");
                                                            t["opn"]    = Text.Base64Encode($"{Id}-0-{tkey}-{SendId}-{random.Next(1000, 999999)}");

                                                            //header body
                                                            t["pe"]       = $"t,{Id},{Username},{servers[current][0]},{servers[current][3]},0";
                                                            t["ip"]       = servers[current][0];
                                                            t["server"]   = (string)details_server.name + servers[current][4];
                                                            t["domain"]   = servers[current][1];
                                                            t["idi"]      = servers[current][2];
                                                            t["idd"]      = servers[current][3];
                                                            t["ids"]      = servers[current][4];
                                                            t["ide"]      = "0";
                                                            t["rdns"]     = rdns;
                                                            t["name"]     = currentTest.Split('@')[0];
                                                            t["to"]       = test_email;
                                                            t["reply"]    = currentTest;
                                                            t["date"]     = Text.GetRFC822Date();
                                                            t["boundary"] = Text.Random("[rndlu/30]");
                                                            t["bnd"]      = Text.Boundary(header);
                                                            t["*parts"]   = "1";
                                                            if (IsPlaceholder)
                                                            {
                                                                t = Placeholder.ReplaceCurrentReciption(t);
                                                            }
                                                            message.AddRecipient(t);
                                                        }
                                                    }
                                                }
                                                p.Send(message);
                                                p.Close();
                                            }
                                        }
                                    }
                                }
                                catch (Exception ex)
                                {
                                    logger.Error($"ERR {ex.Message} -- {ex.StackTrace}");
                                    Console.WriteLine($"ERR {ex.Message} -- {ex.StackTrace}");
                                }
                            })
                                );
                        }
                        Task.WaitAll(tasks.ToArray());
                        campaign.Campaign_update_send(Id, toSend + progress);
                    }
                    else
                    {
                        Result.Add("Campaign Not Found " + Id);
                        logger.Debug("Campaign Not Found " + Id);
                        campaign.Campaign_update_progress(Id, "start", true, 0);
                        return(Result);
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"ERR {ex.Message} -- {ex.StackTrace}");
                    logger.Error($"ERR {ex.Message} -- {ex.StackTrace}");
                }
                Thread.Sleep(Sleep * 1000);
            }
            campaign.Campaign_update_progress(Id, "start", true, 0);
            return(Result);
        }