public void Start(DbMailTask mailTaskTemplate, DbRecipient[] recipients)
        {
            if (_trafficController == null)
            {
                _trafficController = new TrafficController();
            }

            _recipients = recipients;

            _status.TotalCount = _recipients.Length;
            _status.Succeeded  = 0;
            _status.Failed     = 0;

            for (int recipientIndex = 0; recipientIndex < _recipients.Length; recipientIndex++)
            {
                var mailTask = mailTaskTemplate.Copy();
                while (!_submitMessage(recipientIndex, mailTask, _recipients[recipientIndex]))
                {
                    Thread.Sleep(10);
                }
            }

            while (_threadCounter > 0 || !_status.Completed)
            {
                Thread.Sleep(50);
            }
        }
Beispiel #2
0
        // GET: DbMailTasks/Create
        public ActionResult Create()
        {
            ViewBag.RecipientCount = db.DbRecipients.Count();

            var mailTask = new DbMailTask();

            mailTask.Subject = "Test email from ASP.NET MVC";
            mailTask.IsAuthenticationRequired = false;

            var body = new StringBuilder();

            body.Append("This sample demonstrates how to pickup recipient from database and send emails from ASP.NET MVC with thread pool.\r\n");
            body.Append("Curren task id is: [$taskid]\r\n\r\n");
            body.Append("From: [$sender]\r\n");
            body.Append("To: [$rcpt]\r\n");
            body.Append("Subject: [$subject]\r\n\r\n");

            body.Append("Above sender, rcpt, subject values will be replaced by actual value based on each recipient.\r\n\r\n");
            body.Append("If no sever address was specified, the email will be delivered to the recipient's server directly.\r\n");
            body.Append("However, it is not recommended, because most email providers would reject your message due to anti-spam policy.\r\n");

            mailTask.TextBody = body.ToString();

            ViewBag.Port     = DropDownListData.PortList(mailTask.Port);
            ViewBag.Protocol = DropDownListData.ProtocolList(mailTask.Protocol);

            ViewBag.IsSyncSendSucceeded = false;
            ViewBag.SyncSendStatus      = string.Empty;

            return(View(mailTask));
        }
Beispiel #3
0
        public ActionResult DeleteConfirmed(int id)
        {
            DbMailTask dbMailTask = db.DbMailTasks.Find(id);

            if (dbMailTask.Status == DbMailTaskStatus.Completed || dbMailTask.Status == DbMailTaskStatus.Terminated)
            {
                db.DbMailTasks.Remove(dbMailTask);
                db.Database.ExecuteSqlCommand("DELETE FROM DbRecipientResults WHERE TaskId = {0}", id);

                db.SaveChanges();
            }
            return(RedirectToAction("Index", "DbRecipients"));
        }
Beispiel #4
0
        // GET: DbMailTasks/Delete/5
        public ActionResult Delete(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            DbMailTask dbMailTask = db.DbMailTasks.Find(id);

            if (dbMailTask == null)
            {
                return(HttpNotFound());
            }
            return(View(dbMailTask));
        }
        bool _submitMessage(int recipientIndex, DbMailTask mailTask, DbRecipient recipient)
        {
            if (!_trafficController.PrepareIncreaseConnection())
            {
                _trafficController.Rollback();
                return(false);
            }

            if (!_trafficController.PrepareIncreaseMessage())
            {
                _trafficController.Rollback();
                return(false);
            }

            SendMailThreadState state = new SendMailThreadState();

            state.Server   = mailTask.BuildServer();
            state.Mail     = mailTask.BuildMail();
            state.DbTaskId = mailTask.TaskId;

            string recipientName    = string.IsNullOrWhiteSpace(recipient.Name) ? string.Empty : recipient.Name;
            string recipientAddress = string.IsNullOrWhiteSpace(recipient.Address) ? string.Empty : recipient.Address;

            state.Mail.To.Add(new MailAddress(recipientName, recipientAddress));

            state.Mail.TextBody = state.Mail.TextBody.Replace("[$sender]", state.Mail.From.ToString());
            state.Mail.TextBody = state.Mail.TextBody.Replace("[$rcpt]", state.Mail.To.ToString());
            state.Mail.TextBody = state.Mail.TextBody.Replace("[$subject]", state.Mail.Subject.ToString());
            state.Mail.TextBody = state.Mail.TextBody.Replace("[$taskid]", mailTask.TaskId.ToString());

            // even you can add different attachment for different recipient here.
            state.RecipientIndex = recipientIndex;

            try
            {
                Interlocked.Increment(ref _threadCounter);
                ThreadPool.QueueUserWorkItem(this._sendThreadProc, state);
                _trafficController.Commit();

                return(true);
            }
            catch
            {
                Interlocked.Decrement(ref _threadCounter);
                _trafficController.Rollback();
                return(false);
            }
        }
Beispiel #6
0
        public ActionResult Create(DbMailTask dbMailTask)
        {
            if (ModelState.IsValid)
            {
                if (string.IsNullOrWhiteSpace(dbMailTask.TaskName))
                {
                    dbMailTask.TaskName = "Unnamed task";
                }

                dbMailTask.CreationTime  = DateTime.Now;
                dbMailTask.LastWriteTime = DateTime.Now;
                db.DbMailTasks.Add(dbMailTask);
                db.SaveChanges();
                return(RedirectToAction("Index", "DbRecipients"));
            }

            return(View(dbMailTask));
        }
Beispiel #7
0
        static void _processTask(WebProject1Context db, DbMailTask mailTask)
        {
            var threadPool = new DbSendThreadPool();

            threadPool.UpdateResult = _updateResult;
            _threadPools.Add(mailTask.TaskId, threadPool);

            var recipients = db.DbRecipients.ToArray();

            mailTask.TotalCount = recipients.Length;
            mailTask.Status     = DbMailTaskStatus.Running;

            db.Entry(mailTask).State = EntityState.Modified;
            db.SaveChanges();

            Task.Run(() =>
            {
                threadPool.Start(mailTask, recipients);
            });
        }