/// <summary> /// 登録された名称とドメインから、宛先候補ではないアドレスが宛先に含まれている場合に、警告を表示する。 /// </summary> /// <param name="mail"></param> private void CheckMailbodyAndRecipient(Outlook._MailItem mail) { //Load NameAndDomainsList var readCsv = new ReadAndWriteCsv("NameAndDomains.csv"); var nameAndDomainsList = readCsv.ReadCsv <NameAndDomains>(readCsv.ParseCsv <NameAndDomainsMap>()); //メールの本文中に、登録された名称があるか確認。 var recipientCandidateDomains = (from nameAnddomain in nameAndDomainsList where mail.Body.Contains(nameAnddomain.Name) select nameAnddomain.Domain).ToList(); //登録された名称かつ本文中に登場した名称以外のドメインが宛先に含まれている場合、警告を表示。 //送信先の候補が見つからない場合、何もしない。(見つからない場合の方が多いため、警告ばかりになってしまう。) if (recipientCandidateDomains.Count != 0) { foreach (var recipients in _displayNameAndRecipient) { if (!recipientCandidateDomains.Any( domains => domains.Equals( recipients.Value.Substring(recipients.Value.IndexOf("@", StringComparison.Ordinal))))) { //送信者ドメインは警告対象外。 if (!recipients.Value.Contains( mail.SendUsingAccount.SmtpAddress.Substring( mail.SendUsingAccount.SmtpAddress.IndexOf("@", StringComparison.Ordinal)))) { AlertBox.Items.Add(recipients.Key + @" : このアドレスは意図した宛先とは無関係の可能性があります!"); AlertBox.ColorFlag.Add(true); } } } } }
private void WhitelistToGrid() { var readCsv = new ReadAndWriteCsv("Whitelist.csv"); BindableWhitelist = new BindingSource(readCsv.ReadCsv <Whitelist>(readCsv.ParseCsv <WhitelistMap>()), string.Empty); WhitelistGrid.DataSource = BindableWhitelist; WhitelistGrid.Columns[0].HeaderText = @"アドレス/ドメイン"; WhitelistGrid.Columns[0].CellTemplate.ToolTipText = "アドレスまたはドメイン(@から)を登録"; WhitelistGrid.CellValidating += (sender, args) => { if (!string.IsNullOrEmpty(args.FormattedValue.ToString()) && !args.FormattedValue.ToString().Contains("@")) { MessageBox.Show("@は必須です。"); args.Cancel = true; } // @のみの登録を許すと全てのメールアドレスがホワイトリスト該当扱いになるので禁止。 if (args.FormattedValue.ToString().Equals("@")) { MessageBox.Show("メールアドレスかドメインを登録してください。"); args.Cancel = true; } }; }
/// <summary> /// 本文に登録したキーワードがある場合、登録した警告文を表示する。 /// </summary> /// <param name="mail"></param> private void CheckKeyword(Outlook._MailItem mail) { //Load AlertKeywordAndMessage var readCsv = new ReadAndWriteCsv("AlertKeywordAndMessageList.csv"); var alertKeywordAndMessageList = readCsv.ReadCsv <AlertKeywordAndMessage>(readCsv.ParseCsv <AlertKeywordAndMessageMap>()); if (alertKeywordAndMessageList.Count != 0) { foreach (var i in alertKeywordAndMessageList) { if (mail.Body.Contains(i.AlertKeyword)) { AlertBox.Items.Add(i.Message); AlertBox.ColorFlag.Add(true); } } } }
/// <summary> /// 送信先メールアドレスを取得し、画面に表示する。 /// </summary> /// <param name="mail">送信するメールに関する情報</param> private void DrawRecipient(Outlook._MailItem mail) { // TODO ここでいろいろやりすぎなので、直す。 //Load Whitelist var readCsv = new ReadAndWriteCsv("Whitelist.csv"); _whitelists.AddRange(readCsv.ReadCsv <Whitelist>(readCsv.ParseCsv <WhitelistMap>())); //Load AlertAddressList readCsv = new ReadAndWriteCsv("AlertAddressList.csv"); var alertAddresslist = readCsv.ReadCsv <AlertAddress>(readCsv.ParseCsv <AlertAddressMap>()); // 宛先(To,CC,BCC)に登録された宛先又は登録名を配列に格納。 var toAdresses = mail.To?.Split(';') ?? new string[] { }; var ccAdresses = mail.CC?.Split(';') ?? new string[] { }; var bccAdresses = mail.BCC?.Split(';') ?? new string[] { }; var senderDomain = mail.SendUsingAccount.SmtpAddress.Substring(mail.SendUsingAccount.SmtpAddress.IndexOf("@", StringComparison.Ordinal)); // 宛先や登録名から、表示用テキスト(メールアドレスや登録名)を各エリアに表示。 // 宛先ドメインが送信元ドメインと異なる場合、色を変更するフラグをtrue、そうでない場合falseとする。 // ホワイトリストに含まれる宛先の場合、ListのIsCheckedフラグをtrueにして、最初からチェック済みとする。 // 警告アドレスリストに含まれる宛先の場合、AlertBoxにその旨を追加する。 foreach (var i in _displayNameAndRecipient) { if (toAdresses.Any(address => address.Contains(i.Key))) { ToAddressList.Items.Add(i.Value, _whitelists.Count != 0 && _whitelists.Any(address => i.Value.Contains(address.WhiteName))); ToAddressList.ColorFlag.Add(!i.Value.Contains(senderDomain)); if (alertAddresslist.Count != 0 && alertAddresslist.Any(address => i.Value.Contains(address.TartgetAddress))) { AlertBox.Items.Add($"警告対象として登録されたアドレス/ドメインが宛先(To)に含まれています。 ({i.Value})"); AlertBox.ColorFlag.Add(true); } } if (ccAdresses.Any(address => address.Contains(i.Key))) { CcAddressList.Items.Add(i.Value, _whitelists.Count != 0 && _whitelists.Any(address => i.Value.Contains(address.WhiteName))); CcAddressList.ColorFlag.Add(!i.Value.Contains(senderDomain)); if (alertAddresslist.Count != 0 && alertAddresslist.Any(address => i.Value.Contains(address.TartgetAddress))) { AlertBox.Items.Add($"警告対象として登録されたアドレス/ドメインが宛先(CC)に含まれています。 ({i.Value})"); AlertBox.ColorFlag.Add(true); } } if (bccAdresses.Any(address => address.Contains(i.Key))) { BccAddressList.Items.Add(i.Value, _whitelists.Count != 0 && _whitelists.Any(address => i.Value.Contains(address.WhiteName))); BccAddressList.ColorFlag.Add(!i.Value.Contains(senderDomain)); if (alertAddresslist.Count != 0 && alertAddresslist.Any(address => i.Value.Contains(address.TartgetAddress))) { AlertBox.Items.Add($"警告対象として登録されたアドレス/ドメインが宛先(BCC)に含まれています。 ({i.Value})"); AlertBox.ColorFlag.Add(true); } } } }
private void AutoAddCcAndBcc(Outlook._MailItem mail) { var autoAddedCcAddressList = new List <string>(); var autoAddedBccAddressList = new List <string>(); //Load AutoCcBccKeywordList var readCsv = new ReadAndWriteCsv("AutoCcBccKeywordList.csv"); var autoCcBccKeywordList = readCsv.ReadCsv <AutoCcBccKeyword>(readCsv.ParseCsv <AutoCcBccKeywordMap>()); if (autoCcBccKeywordList.Count != 0) { foreach (var i in autoCcBccKeywordList) { if (mail.Body.Contains(i.Keyword) && !_displayNameAndRecipient.Any(recip => recip.Key.Contains(i.AutoAddAddress))) { var recip = mail.Recipients.Add(i.AutoAddAddress); recip.Type = i.CcOrBcc == CcOrBcc.CC ? (int)Outlook.OlMailRecipientType.olCC : (int)Outlook.OlMailRecipientType.olBCC; AlertBox.Items.Add($@"自動で {i.CcOrBcc} に {i.AutoAddAddress} が追加されました。(該当キーワード 「{i.Keyword}」)", true); AlertBox.ColorFlag.Add(false); if (i.CcOrBcc == CcOrBcc.CC) { autoAddedCcAddressList.Add(i.AutoAddAddress); } else { autoAddedBccAddressList.Add(i.AutoAddAddress); } // 自動追加されたアドレスはホワイトリスト登録アドレス扱い。 _whitelists.Add(new Whitelist { WhiteName = i.AutoAddAddress }); } } } //Load AutoCcBccRecipientList // TODO 流石にひどいので直す。 readCsv = new ReadAndWriteCsv("AutoCcBccRecipientList.csv"); var autoCcBccRecipientList = readCsv.ReadCsv <AutoCcBccRecipient>(readCsv.ParseCsv <AutoCcBccRecipientMap>()); if (autoCcBccRecipientList.Count != 0) { foreach (var i in autoCcBccRecipientList) { if (_displayNameAndRecipient.Any(recipient => recipient.Value.Contains(i.TargetRecipient)) && !_displayNameAndRecipient.Any(recip => recip.Key.Contains(i.AutoAddAddress))) { if (i.CcOrBcc == CcOrBcc.CC) { if (!autoAddedCcAddressList.Contains(i.AutoAddAddress)) { var recip = mail.Recipients.Add(i.AutoAddAddress); recip.Type = (int)Outlook.OlMailRecipientType.olCC; autoAddedCcAddressList.Add(i.AutoAddAddress); } } else if (!autoAddedBccAddressList.Contains(i.AutoAddAddress)) { var recip = mail.Recipients.Add(i.AutoAddAddress); recip.Type = (int)Outlook.OlMailRecipientType.olBCC; autoAddedBccAddressList.Add(i.AutoAddAddress); } AlertBox.Items.Add($@"自動で {i.CcOrBcc} に {i.AutoAddAddress} が追加されました。(該当宛先 「{i.TargetRecipient}」)", true); AlertBox.ColorFlag.Add(false); // 自動追加されたアドレスはホワイトリスト登録アドレス扱い。 _whitelists.Add(new Whitelist { WhiteName = i.AutoAddAddress }); } } } mail.Recipients.ResolveAll(); }
private void AutoCcBccRecipientListToGrid() { var readCsv = new ReadAndWriteCsv("AutoCcBccRecipientList.csv"); BindableAutoCcBccRecipientList = new BindingSource(readCsv.ReadCsv <AutoCcBccRecipient>(readCsv.ParseCsv <AutoCcBccRecipientMap>()), string.Empty); AutoCcBccRecipientGrid.DataSource = BindableAutoCcBccRecipientList; AutoCcBccRecipientGrid.Columns[0].HeaderText = @"宛先アドレス/ドメイン"; AutoCcBccRecipientGrid.Columns[0].CellTemplate.ToolTipText = "アドレスまたはドメイン(@から)を登録"; AutoCcBccRecipientGrid.Columns[1].HeaderText = @"CCまたはBCC"; AutoCcBccRecipientGrid.Columns[1].CellTemplate.ToolTipText = "CC または BCCと入力"; AutoCcBccRecipientGrid.Columns[2].HeaderText = @"追加アドレス"; AutoCcBccRecipientGrid.Columns[2].CellTemplate.ToolTipText = @"メールアドレス"; AutoCcBccRecipientGrid.CellValidating += (sender, args) => AutoAddEmailAddressValidation(args); // 裏ワザとして、宛先アドレスまたはドメインに@だけの登録で、常にCC/BCCに追加。というのはありな気がするので、あえてバリデーションしない。 }
private void AutoCcBccKeywordListToGrid() { var readCsv = new ReadAndWriteCsv("AutoCcBccKeywordList.csv"); BindableAutoCcBccKeywordList = new BindingSource(readCsv.ReadCsv <AutoCcBccKeyword>(readCsv.ParseCsv <AutoCcBccKeywordMap>()), string.Empty); AutoCcBccKeywordGrid.DataSource = BindableAutoCcBccKeywordList; AutoCcBccKeywordGrid.Columns[0].HeaderText = @"キーワード"; AutoCcBccKeywordGrid.Columns[0].CellTemplate.ToolTipText = @"キーワード"; AutoCcBccKeywordGrid.Columns[1].HeaderText = @"CCまたはBCC"; AutoCcBccKeywordGrid.Columns[1].CellTemplate.ToolTipText = @"CC または BCCと入力"; AutoCcBccKeywordGrid.Columns[2].HeaderText = @"追加アドレス"; AutoCcBccKeywordGrid.Columns[2].CellTemplate.ToolTipText = @"メールアドレス"; AutoCcBccKeywordGrid.CellValidating += (sender, args) => AutoAddEmailAddressValidation(args); }
private void AlertKeywordAndMessageListToGrid() { var readCsv = new ReadAndWriteCsv("AlertKeywordAndMessageList.csv"); BindableAlertKeywordAndMessageList = new BindingSource(readCsv.ReadCsv <AlertKeywordAndMessage>(readCsv.ParseCsv <AlertKeywordAndMessageMap>()), string.Empty); AlertKeywordAndMessageGrid.DataSource = BindableAlertKeywordAndMessageList; AlertKeywordAndMessageGrid.Columns[0].HeaderText = @"警告するキーワード"; AlertKeywordAndMessageGrid.Columns[0].CellTemplate.ToolTipText = @"警告するキーワード"; AlertKeywordAndMessageGrid.Columns[1].HeaderText = @"警告文"; AlertKeywordAndMessageGrid.Columns[1].CellTemplate.ToolTipText = @"警告文"; }
private void SetNameAndDomainsListToGrid() { var readCsv = new ReadAndWriteCsv("NameAndDomains.csv"); BindableNameAdnDomainList = new BindingSource(readCsv.ReadCsv <NameAndDomains>(readCsv.ParseCsv <NameAndDomainsMap>()), string.Empty); NameAndDomainsGrid.DataSource = BindableNameAdnDomainList; NameAndDomainsGrid.Columns[0].HeaderText = @"名称"; NameAndDomainsGrid.Columns[0].CellTemplate.ToolTipText = @"社名等の宛先名を入力"; NameAndDomainsGrid.Columns[1].HeaderText = @"ドメイン (@から)"; NameAndDomainsGrid.Columns[1].CellTemplate.ToolTipText = @"@から入力"; }