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); } }
// 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)); }
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")); }
// 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); } }
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)); }
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); }); }