/// <summary> /// 対象のメールアイテムが添付ファイル暗号化を行える状態か検証する /// </summary> /// <param name="item">メールアイテム</param> public void ValidateMailItemForEncryption(IMyMailItem item) { if (item.RecipientsCount <= 0) { throw new MailItemValidationException("送信先が設定されていません。TO, CC, BCCのいずれかに一つ以上のメールアドレスを入力してください"); } if (String.IsNullOrEmpty(item.Subject)) { throw new MailItemValidationException("件名が設定されていません。件名を入力して下さい"); } var attachments = item.GetAttachments().ToList(); if (attachments.Count <= 0) { throw new MailItemValidationException("添付ファイルが一つも存在しません。一つ以上の添付ファイルを設定して下さい。"); } var fileNameSet = new HashSet <string>(); foreach (var attachment in attachments) { if (fileNameSet.Contains(attachment.FileName)) { throw new MailItemValidationException("添付ファイルに同名のファイルが複数存在します。添付ファイル名は全て別名にして下さい:" + attachment.FileName); } fileNameSet.Add(attachment.FileName); } }
/// <summary> /// 添付ファイルを暗号化して送信する. /// </summary> /// <param name="item">メールアイテム</param> private void EncryptAndSend(IMyMailItem item) { var operation = new MailItemOperation(); // メールアイテムの検証 operation.ValidateMailItemForEncryption(item); // 添付ファイルをパスワード付きZIPファイルに変換する. var password = operation.ConvertAttachmentsToPasswordProtectedZipFile(item); // パスワード通知メールを作成する. var passwordNotificationMail = operation.CreatePasswordNotificationMail(item, password); // 作成したメールアイテムを保存する. item.Save(); passwordNotificationMail.Save(); passwordNotificationMail.Display(); // 送信まで自動で行う場合は、送信 if (Properties.Settings.Default.AutoSending) { item.Send(); passwordNotificationMail.Send(); } }
/// <summary> /// ZIPファイル名を作成する /// </summary> /// <param name="item"></param> /// <returns></returns> private string CreateZipFileName(IMyMailItem item) { if (item.HasOneZipFileOnly()) { // 添付ファイルがZIPファイル一つのみの場合は、ZIPファイル名を流用する return(item.GetAttachments().First().FileName); } return(CreateDefaultZipFileName()); }
/// <summary> /// パスワード付きZIPのエントリを作成する. /// </summary> /// <param name="mailItem">メールアイテム</param> /// <param name="zipFolder">パスワード付きZIPの元にするフォルダ</param> private void CreateZipEntriesInFolder(IMyMailItem mailItem, ZipContentsFolder zipFolder) { if (mailItem.HasOneZipFileOnly()) { ExtractZipFile(zipFolder, mailItem.GetAttachments().First()); } else { SaveAttachmentsToZipFolder(zipFolder.ContentsRootFolderPath, mailItem.GetAttachments()); } }
/// <summary> /// パスワード通知メールを作成する. /// </summary> /// <param name="sourceMail">元になるメールアイテム</param> /// <param name="password">パスワード</param> /// <returns></returns> public IMyMailItem CreatePasswordNotificationMail(IMyMailItem sourceMail, string password) { // 同じ送信先、送信元のメールアイテムを作成する. var result = sourceMail.NewItemWithSameRecipientsAndSender(); // 本文を作成する var bodyTemplate = Template.Parse(Properties.Settings.Default.PasswordMailTemplate); var subject = Properties.Settings.Default.PasswordMailTitlePrefix + sourceMail.Subject; var body = bodyTemplate.Render(new { Tos = result.Tos(), Company = Properties.Settings.Default.DefaultCompany, User = Properties.Settings.Default.DefaultUserName, sourceMail.Subject, Password = password, }); result.SetContents(subject, body); return(result); }
/// <summary> /// 添付ファイルをパスワード付きZIPファイルに変換する. /// </summary> /// <param name="item"></param> /// <returns>ZIPファイルのパスワード</returns> public string ConvertAttachmentsToPasswordProtectedZipFile(IMyMailItem item) { // 最終的な添付ファイルとなるパスワード付きZIPファイル名を作成する var zipFileName = CreateZipFileName(item); // ZIPファイル作成用のフォルダを準備する using (var zipFolder = new ZipContentsFolder(zipFileName)) { // パスワード付きZIP用のエントリをフォルダにまとめて作成する. CreateZipEntriesInFolder(item, zipFolder); // パスワードを生成する. var password = GeneratePassword(); // 添付ファイル用のパスワード付きZIPファイルを生成する. ArchiveFolderWithPassword(zipFolder, password); // 現在の添付ファイルを作成したパスワード付きZIPファイルに置き換える ReplaceAttachmentsToZipFile(item, zipFolder); return(password); } }
/// <summary> /// 現在の添付ファイルをパスワード付きZIPファイルで置き換える /// </summary> /// <param name="item"></param> /// <param name="zipFolder"></param> private void ReplaceAttachmentsToZipFile(IMyMailItem item, ZipContentsFolder zipFolder) { item.RemoveAttachments(); item.AddAttachment(zipFolder.ZipFilePath); }