public void Process(ScheduledTaskContext context)
        {
            if (context.Task.TaskType != TaskType)
            {
                return;
            }
            try {
                dynamic content            = context.Task.ContentItem;
                MailCommunicationPart part = context.Task.ContentItem.As <MailCommunicationPart>();
                Int32[] ids            = null;
                Int32?  idLocalization = null;

                _mailerConfig = _orchardServices.WorkContext.CurrentSite.As <MailerSiteSettingsPart>();
                if (content.QueryPickerPart != null && content.QueryPickerPart.Ids.Length > 0)
                {
                    ids = content.QueryPickerPart.Ids;
                }

                var localizedPart = content.LocalizationPart;
                if (localizedPart != null && localizedPart.Culture != null)
                {
                    idLocalization = localizedPart.Culture.Id;
                }

                IList lista;
                if (part.UseRecipientList)
                {
                    if (string.IsNullOrWhiteSpace(part.RecipientList))
                    {
                        lista = new List <object>();
                    }
                    else
                    {
                        lista = _mailCommunicationService
                                .GetMailQueryResult(
                            part.RecipientList.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries),
                            idLocalization,
                            false,
                            context.Task.ContentItem);
                    }
                }
                else
                {
                    lista = _mailCommunicationService.GetMailQueryResult(ids, idLocalization, false, context.Task.ContentItem);
                }

                // ricava i settings e li invia tramite FTP
                var templateId = ((Laser.Orchard.TemplateManagement.Models.CustomTemplatePickerPart)content.CustomTemplatePickerPart).SelectedTemplate.Id;
                Dictionary <string, object> settings = GetSettings(content, templateId, part);

                if (lista == null || lista.Count == 0)
                {
                    Logger.Error(T("No recipients selected.").ToString());
                }
                else if ((settings.Count > 0) && (lista.Count > 0))
                {
                    SendSettings(settings, part.Id);

                    // impagina e invia i recipiens tramite FTP
                    int           pageNum  = 0;
                    List <object> pagina   = new List <object>();
                    int           pageSize = _mailerConfig.RecipientsPerJsonFile;
                    for (int i = 0; i < lista.Count; i++)
                    {
                        if (((i + 1) % pageSize) == 0)
                        {
                            SendRecipients(pagina, part.Id, pageNum);
                            pageNum++;
                            pagina = new List <object>();
                        }
                        pagina.Add(lista[i]);
                    }
                    // invia l'ultima pagina se non è vuota
                    if (pagina.Count > 0)
                    {
                        SendRecipients(pagina, part.Id, pageNum);
                    }
                    part.RecipientsNumber = lista.Count;
                    part.SentMailsNumber  = 0;
                    part.MailMessageSent  = true;
                }
                else
                {
                    Logger.Error(T("Error parsing mail template.").ToString());
                }
            } catch (Exception ex) {
                string idcontenuto = "nessun id ";
                try {
                    idcontenuto = context.Task.ContentItem.Id.ToString();
                } catch (Exception ex2) { Logger.Error(ex2, ex2.Message); }
                Logger.Error(ex, "Error on " + TaskType + " for ContentItem id = " + idcontenuto + " : " + ex.Message);
            }
        }
        private Dictionary <string, object> GetSettings(dynamic contentModel, int templateId, MailCommunicationPart part)
        {
            var data = new Dictionary <string, object>();

            var baseUri = new Uri(_orchardServices.WorkContext.CurrentSite.BaseUrl);

            Dictionary <string, object> similViewBag = new Dictionary <string, object>();

            similViewBag.Add("CampaignLink", _communicationService.GetCampaignLink("Email", part));

            string body = _templateService.RitornaParsingTemplate(contentModel, templateId, similViewBag);

            if (!body.StartsWith("Error On Template"))
            {
                string host = string.Format("{0}://{1}{2}",
                                            baseUri.Scheme,
                                            baseUri.Host,
                                            baseUri.Port == 80 ? string.Empty : ":" + baseUri.Port);

                var urlHelper = _commonServices.GetUrlHelper();


                // Add Link [UNSUBSCRIBE]
                string ph_Unsubscribe  = "[UNSUBSCRIBE]";
                string unsubscribe     = T("Click here to stop receiving email for commercial use").Text;
                string linkUnsubscribe = "<a href='" + string.Format("{0}{1}", host, urlHelper.UnsubscribeMailCommunication()) + "'>" + unsubscribe + "</a>";

                if (body.Contains(ph_Unsubscribe))
                {
                    body = body.Replace(ph_Unsubscribe, linkUnsubscribe);
                }
                else
                {
                    body += "<br /><br />" + linkUnsubscribe;
                }

                var    subject  = contentModel.TitlePart.Title;
                var    smtp     = _orchardServices.WorkContext.CurrentSite.As <SmtpSettingsPart>();
                string priority = "L";
                switch (_mailerConfig.MailPriority)
                {
                case MailPriorityValues.High:
                    priority = "H";
                    break;

                case MailPriorityValues.Normal:
                    priority = "N";
                    break;

                default:
                    priority = "L";
                    break;
                }

                var baseUrl = baseUri.ToString();
                // token di sicurezza: contiene data e ora (senza minuti e secondi) e id del content item
                var token = string.Format("{0}{1}", DateTime.Now.ToString("yyyyMMddHH"), (contentModel as ContentItem).Id);
                token = Convert.ToBase64String(System.Text.Encoding.Unicode.GetBytes(token));
                //var url = string.Format("{0}/Laser.Orchard.MailCommunication/MailerResult?tk={1}", baseUrl, token);  // versione per il GET
                var tenantPrefix = GetTenantUrlPrexix(_shellSettings);
                var url          = string.Format("{0}/{1}api/Laser.Orchard.MailCommunication/MailerResultAPI?tk={2}", baseUrl, tenantPrefix, token); // versione per il POST

                data.Add("Subject", subject);
                data.Add("Body", body);
                data.Add("Sender", smtp.Address);
                data.Add("Priority", priority);
                data.Add("Url", url);        // url di ritorno per comunicare a Orchard il numero di mail inviate con successo
                data.Add("Attachments", ""); // TODO esempio: "[\"prova.pdf\",\"prova.docx\"]" 2016-01-14: per ora non li gestiamo
            }

            return(data);
        }