/// <summary>
        /// Diese Methode wird aufgerufen, wenn eine Schulung angelegt wurde und generiert und schickt eine Mail an den Dozenten der Schulung.
        /// </summary>
        /// <param name="schulung">Die Schulung, die angelegt wurde</param>
        public async Task GenerateAndSendAnlegeMailAsync(Schulung schulung, string rootUrl, string vorstand)
        {
            try
            {
                MimeMessage message = new MimeMessage();
                message.From.Add(new MailboxAddress("Schulungsportal", emailSender.GetAbsendeAdresse())); //Absender
                foreach (var dozent in schulung.Dozenten)
                {
                    message.To.Add(GetSafeMailboxAddress(dozent.Name, dozent.EMail)); // Empfaenger
                }
                message.Subject = "[INFO/noreply] Schulung angelegt";                 //Betreff

                var teilnehmerListeUrl = rootUrl + "/Schulung/Teilnehmer/" + schulung.AccessToken;

                var dozentenEmails = schulung.Dozenten.Select(d => d.EMail);
                var attachments    = GetAppointment(schulung, dozentenEmails, emailSender.GetAbsendeAdresse(), istAbsage: false);

                MailViewModel mvm = new MailViewModel
                {
                    //CCLogoFile = "cclogo.png@"+Guid.NewGuid().ToString(),
                    //FacebookLogoFile = "fblogo.png@" + Guid.NewGuid().ToString(),
                    //InstaLogoFile = "instalogo.png@" + Guid.NewGuid().ToString(),
                    Schulung           = schulung,
                    Vorstand           = vorstand,
                    TeilnehmerListeUrl = teilnehmerListeUrl,
                };

                var body = new TextPart("html") //Inhalt
                {
                    Text = await RunCompileAsync("AnlegeMail", mvm),
                    ContentTransferEncoding = ContentEncoding.Base64,
                };

                var outmultipart = new Multipart("mixed");
                outmultipart.Add(body);
                //inmultipart.Add(attachments.First());
                // Bilder für Corporate Design, funktioniert leider nicht
                //outmultipart.Add(inmultipart);
                //outmultipart.Add(LoadInlinePicture("CCLogo.png", mvm.CCLogoFile));
                //outmultipart.Add(LoadInlinePicture("FBLogo.png", mvm.FacebookLogoFile));
                //outmultipart.Add(LoadInlinePicture("InstaLogo.png", mvm.InstaLogoFile));
                foreach (var attachment in attachments)
                {
                    outmultipart.Add(attachment);
                }

                message.Body = outmultipart;

                await emailSender.SendEmailAsync(message);
            }
            catch (Exception e)
            {
                logger.Error(e);
                string code = "#601";
                e = new Exception("Fehler beim Versenden der Anlegemail (" + e.Message + ") " + code, e);
                throw e;
            }
        }
        /// <summary>
        /// Diese Methode generiert und schickt eine Bestaetigungsmail an einen Nutzer, der sich zu einer Schulung angemeldet hat.
        /// </summary>
        /// <param name="anmeldung">Die Anmeldung, die beim anmelden erstellt wird.</param>
        /// <param name="schulung">Die Schulung, zu der sich der Nutzer angemeldet hat.</param>
        public async Task GenerateAndSendBestätigungsMailAsync(Anmeldung anmeldung, Schulung schulung, string vorstand, string rootUrl)
        {
            try
            {
                MimeMessage message = new MimeMessage();
                message.From.Add(new MailboxAddress(emailSender.GetAbsendeAdresse()));                                //Absender
                message.To.Add(GetSafeMailboxAddress(anmeldung.Vorname + " " + anmeldung.Nachname, anmeldung.Email)); // Empfaenger
                message.Subject = "[INFO/noreply] Schulungsanmeldung " + schulung.Titel;                              //Betreff

                var selbstmanagementUrl = rootUrl + "/Anmeldung/Selbstmanagement/" + anmeldung.AccessToken;

                var attachments = GetAppointment(schulung, new [] { anmeldung.Email }, emailSender.GetAbsendeAdresse(), istAbsage: false);

                MailViewModel mvm = new MailViewModel
                {
                    //CCLogoFile = "cclogo.png@"+Guid.NewGuid().ToString(),
                    //FacebookLogoFile = "fblogo.png@" + Guid.NewGuid().ToString(),
                    //InstaLogoFile = "instalogo.png@" + Guid.NewGuid().ToString(),
                    SelbstmanagementUrl = selbstmanagementUrl,
                    Schulung            = schulung,
                    Vorstand            = vorstand,
                };

                var body = new TextPart("html") //Inhalt
                {
                    Text = await RunCompileAsync("BestaetigungsMail", mvm),
                    ContentTransferEncoding = ContentEncoding.Base64,
                };

                var outmultipart = new Multipart("mixed");
                outmultipart.Add(body);
                //inmultipart.Add(attachments.First());
                // Bilder für Corporate Design, funktioniert leider nicht
                //outmultipart.Add(inmultipart);
                //outmultipart.Add(LoadInlinePicture("CCLogo.png", mvm.CCLogoFile));
                //outmultipart.Add(LoadInlinePicture("FBLogo.png", mvm.FacebookLogoFile));
                //outmultipart.Add(LoadInlinePicture("InstaLogo.png", mvm.InstaLogoFile));
                foreach (var attachment in attachments)
                {
                    outmultipart.Add(attachment);
                }

                message.Body = outmultipart;

                await emailSender.SendEmailAsync(message);
            } catch (Exception e)
            {
                logger.Error(e);
                string code = "#601";
                e = new Exception("Fehler beim Versenden der Bestätigungsmail (" + e.Message + ") " + code, e);
                throw e;
            }
        }
        public async Task GenerateAndSendSchulungsNewsletterAsync(List <Schulung> schulungen, string vorstand)
        {
            // Kein newsletter ohne Schulungen
            if (schulungen.Count() == 0)
            {
                return;
            }
            try
            {
                MimeMessage message = new MimeMessage();
                message.From.Add(new MailboxAddress("Schulungsportal", emailSender.GetAbsendeAdresse())); //Absender
                // message.To.Add(new MailboxAddress("@everyone")); // Empfaenger
                message.Subject = "[INFO/noreply] Schulungsnewsletter";                                   //Betreff

                MailViewModel mvm = new MailViewModel
                {
                    CCLogoFile       = "cclogo.png@" + Guid.NewGuid().ToString(),
                    FacebookLogoFile = "fblogo.png@" + Guid.NewGuid().ToString(),
                    InstaLogoFile    = "instalogo.png@" + Guid.NewGuid().ToString(),
                    Schulungen       = schulungen,
                    Vorstand         = vorstand,
                };

                var body = new TextPart("html") //Inhalt
                {
                    Text = await RunCompileAsync("NewsletterMail", mvm),
                    ContentTransferEncoding = ContentEncoding.Base64,
                };

                var multipart = new MultipartRelated();
                multipart.Add(body);
                // Bilder für Corporate Design
                multipart.Add(LoadInlinePicture("CCLogo.png", mvm.CCLogoFile));
                multipart.Add(LoadInlinePicture("FBLogo.png", mvm.FacebookLogoFile));
                multipart.Add(LoadInlinePicture("InstaLogo.png", mvm.InstaLogoFile));

                message.Body = multipart;

                await emailSender.SendEmailAsync(message);
            }
            catch (Exception e)
            {
                logger.Error(e);
                string code = "#601";
                e = new Exception("Fehler beim Versenden des Newsletters (" + e.Message + ") " + code, e);
                throw e;
            }
        }
        public async Task GenerateAndSendAbsageAnSchulungsdozentMailAsync(Anmeldung anmeldung, String begruendung, String vorstand)
        {
            var         schulung = anmeldung.Schulung;
            MimeMessage message  = new MimeMessage();

            message.From.Add(new MailboxAddress("Schulungsportal", emailSender.GetAbsendeAdresse())); //Absender
            foreach (var dozent in schulung.Dozenten)
            {
                message.To.Add(GetSafeMailboxAddress(dozent.Name, dozent.EMail));                       // Empfaenger
            }
            message.Subject = "Schulung " + anmeldung.Schulung.Titel + ": Abmeldung eines Teilnehmers"; //Betreff

            MailViewModel mwm = new MailViewModel {
                Vorstand         = vorstand,
                Begruendung      = begruendung,
                Anmeldung        = anmeldung,
                Schulung         = schulung,
                CCLogoFile       = "cclogo.png@" + Guid.NewGuid().ToString(),
                FacebookLogoFile = "fblogo.png@" + Guid.NewGuid().ToString(),
                InstaLogoFile    = "instalogo.png@" + Guid.NewGuid().ToString(),
            };

            var body = new TextPart("html") //Inhalt
            {
                Text = await RunCompileAsync("AbsageAnSchulungsdozentMail", mwm),
                ContentTransferEncoding = ContentEncoding.Base64,
            };

            var multipart = new MultipartRelated();

            multipart.Add(body);
            // Bilder für Corporate Design
            multipart.Add(LoadInlinePicture("CCLogo.png", mwm.CCLogoFile));
            multipart.Add(LoadInlinePicture("FBLogo.png", mwm.FacebookLogoFile));
            multipart.Add(LoadInlinePicture("InstaLogo.png", mwm.InstaLogoFile));

            message.Body = multipart;

            await emailSender.SendEmailAsync(message);
        }
        /// <summary>
        /// Diese Methode generiert und schickt eine Mail an die Dozenten der Schulungen einen Tag nach dieser um zu erinnern,
        /// die Anwesenheitsliste an den Schulungsbeauftragten zu senden
        /// </summary>
        /// <param name="anmeldung">Die Anmeldung.</param>
        /// <param name="schulung">Die Schulung, zu die abgesagt wird.</param>
        public async Task GenerateAndSendGeprueftReminderMail(Schulung schulung, string vorstand)
        {
            MimeMessage message = new MimeMessage();

            message.From.Add(new MailboxAddress("Schulungsportal", emailSender.GetAbsendeAdresse())); //Absender
            foreach (var dozent in schulung.Dozenten)
            {
                message.To.Add(GetSafeMailboxAddress(dozent.Name, dozent.EMail));          // Empfaenger
            }
            message.Subject = "[INFO/noreply] Reminder Teilnehmerliste " + schulung.Titel; //Betreff

            var multipart = new MultipartRelated();

            MailViewModel mvm = new MailViewModel
            {
                CCLogoFile       = "cclogo.png@" + Guid.NewGuid().ToString(),
                FacebookLogoFile = "fblogo.png@" + Guid.NewGuid().ToString(),
                InstaLogoFile    = "instalogo.png@" + Guid.NewGuid().ToString(),
                Schulung         = schulung,
                Vorstand         = vorstand,
            };

            var body = new TextPart("html") //Inhalt
            {
                Text = await RunCompileAsync("GeprueftReminder", mvm),
                ContentTransferEncoding = ContentEncoding.Base64,
            };

            multipart.Add(body);
            // Bilder für Corporate Design
            multipart.Add(LoadInlinePicture("CCLogo.png", mvm.CCLogoFile));
            multipart.Add(LoadInlinePicture("FBLogo.png", mvm.FacebookLogoFile));
            multipart.Add(LoadInlinePicture("InstaLogo.png", mvm.InstaLogoFile));
            message.Body = multipart;

            await emailSender.SendEmailAsync(message);
        }