Skip to content

Commit

Permalink
Merge pull request #35 from t-miyake/develop
Browse files Browse the repository at this point in the history
宛先アドレスの取得処理を改善 / 空欄の設定値による不具合を修正
  • Loading branch information
t-miyake committed Jul 8, 2020
2 parents 85ab5e5 + 87b88c3 commit 770046a
Show file tree
Hide file tree
Showing 9 changed files with 188 additions and 84 deletions.
133 changes: 95 additions & 38 deletions OutlookOkan/Models/GenerateCheckList.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;
Expand All @@ -28,31 +29,39 @@ public sealed class GenerateCheckList
public CheckList GenerateCheckListFromMail(Outlook._MailItem mail, GeneralSetting generalSetting)
{
var whitelistCsv = new ReadAndWriteCsv("Whitelist.csv");
_whitelist.AddRange(whitelistCsv.GetCsvRecords<Whitelist>(whitelistCsv.LoadCsv<WhitelistMap>()));
_whitelist.AddRange(whitelistCsv.GetCsvRecords<Whitelist>(whitelistCsv.LoadCsv<WhitelistMap>()).Where(x => !string.IsNullOrEmpty(x.WhiteName)));

var alertKeywordAndMessageListCsv = new ReadAndWriteCsv("AlertKeywordAndMessageList.csv");
var alertKeywordAndMessageList = alertKeywordAndMessageListCsv.GetCsvRecords<AlertKeywordAndMessage>(alertKeywordAndMessageListCsv.LoadCsv<AlertKeywordAndMessageMap>());
var alertKeywordAndMessageList = alertKeywordAndMessageListCsv.GetCsvRecords<AlertKeywordAndMessage>(alertKeywordAndMessageListCsv.LoadCsv<AlertKeywordAndMessageMap>())
.Where(x => !string.IsNullOrEmpty(x.AlertKeyword)).ToList();

var autoCcBccKeywordListCsv = new ReadAndWriteCsv("AutoCcBccKeywordList.csv");
var autoCcBccKeywordList = autoCcBccKeywordListCsv.GetCsvRecords<AutoCcBccKeyword>(autoCcBccKeywordListCsv.LoadCsv<AutoCcBccKeywordMap>());
var autoCcBccKeywordList = autoCcBccKeywordListCsv.GetCsvRecords<AutoCcBccKeyword>(autoCcBccKeywordListCsv.LoadCsv<AutoCcBccKeywordMap>())
.Where(x => !string.IsNullOrEmpty(x.AutoAddAddress) && !string.IsNullOrEmpty(x.Keyword)).ToList();

var autoCcBccAttachedFilesListCsv = new ReadAndWriteCsv("AutoCcBccAttachedFileList.csv");
var autoCcBccAttachedFilesList = autoCcBccAttachedFilesListCsv.GetCsvRecords<AutoCcBccAttachedFile>(autoCcBccAttachedFilesListCsv.LoadCsv<AutoCcBccAttachedFileMap>());
var autoCcBccAttachedFilesList = autoCcBccAttachedFilesListCsv.GetCsvRecords<AutoCcBccAttachedFile>(autoCcBccAttachedFilesListCsv.LoadCsv<AutoCcBccAttachedFileMap>())
.Where(x => !string.IsNullOrEmpty(x.AutoAddAddress)).ToList();

var autoCcBccRecipientListCsv = new ReadAndWriteCsv("AutoCcBccRecipientList.csv");
var autoCcBccRecipientList = autoCcBccRecipientListCsv.GetCsvRecords<AutoCcBccRecipient>(autoCcBccRecipientListCsv.LoadCsv<AutoCcBccRecipientMap>());
var autoCcBccRecipientList = autoCcBccRecipientListCsv.GetCsvRecords<AutoCcBccRecipient>(autoCcBccRecipientListCsv.LoadCsv<AutoCcBccRecipientMap>())
.Where(x => !string.IsNullOrEmpty(x.AutoAddAddress) && !string.IsNullOrEmpty(x.TargetRecipient)).ToList();

var alertAddressCsv = new ReadAndWriteCsv("AlertAddressList.csv");
var alertAddressList = alertAddressCsv.GetCsvRecords<AlertAddress>(alertAddressCsv.LoadCsv<AlertAddressMap>());
var alertAddressList = alertAddressCsv.GetCsvRecords<AlertAddress>(alertAddressCsv.LoadCsv<AlertAddressMap>())
.Where(x => !string.IsNullOrEmpty(x.TargetAddress)).ToList();

var nameAndDomainsCsv = new ReadAndWriteCsv("NameAndDomains.csv");
var nameAndDomainsList = nameAndDomainsCsv.GetCsvRecords<NameAndDomains>(nameAndDomainsCsv.LoadCsv<NameAndDomainsMap>());
var nameAndDomainsList = nameAndDomainsCsv.GetCsvRecords<NameAndDomains>(nameAndDomainsCsv.LoadCsv<NameAndDomainsMap>())
.Where(x => !string.IsNullOrEmpty(x.Domain) && !string.IsNullOrEmpty(x.Name));

var deferredDeliveryMinutesCsv = new ReadAndWriteCsv("DeferredDeliveryMinutes.csv");
var deferredDeliveryMinutes = deferredDeliveryMinutesCsv.GetCsvRecords<DeferredDeliveryMinutes>(deferredDeliveryMinutesCsv.LoadCsv<DeferredDeliveryMinutesMap>());
var deferredDeliveryMinutes = deferredDeliveryMinutesCsv.GetCsvRecords<DeferredDeliveryMinutes>(deferredDeliveryMinutesCsv.LoadCsv<DeferredDeliveryMinutesMap>())
.Where(x => !string.IsNullOrEmpty(x.TargetAddress)).ToList();

var internalDomainListCsv = new ReadAndWriteCsv("InternalDomainList.csv");
var internalDomainList = internalDomainListCsv.GetCsvRecords<InternalDomain>(internalDomainListCsv.LoadCsv<InternalDomainMap>());
var internalDomainList = internalDomainListCsv.GetCsvRecords<InternalDomain>(internalDomainListCsv.LoadCsv<InternalDomainMap>())
.Where(x => !string.IsNullOrEmpty(x.Domain)).ToList();

var externalDomainsWarningAndAutoChangeToBccSetting = new ExternalDomainsWarningAndAutoChangeToBcc();
var externalDomainsWarningAndAutoChangeToBccCsv = new ReadAndWriteCsv("ExternalDomainsWarningAndAutoChangeToBccSetting.csv");
Expand Down Expand Up @@ -111,7 +120,7 @@ private CheckList GetSenderAndSenderDomain(in Outlook._MailItem mail, CheckList
{
checkList.Sender = mail.SendUsingAccount?.SmtpAddress ?? Resources.FailedToGetInformation;

if (mail.SenderEmailType == "EX" && !checkList.Sender.Contains("@"))
if (mail.SenderEmailType == "EX" && !IsValidEmailAddress(checkList.Sender))
{
var tempOutlookApp = new Outlook.Application();
var tempRecipient = tempOutlookApp.Session.CreateRecipient(mail.SenderEmailAddress);
Expand Down Expand Up @@ -145,13 +154,13 @@ private CheckList GetSenderAndSenderDomain(in Outlook._MailItem mail, CheckList
}
else
{
if (!checkList.Sender.Contains("@"))
if (!IsValidEmailAddress(checkList.Sender))
{
checkList.Sender = mail.SenderEmailAddress ?? Resources.FailedToGetInformation;
}
}

if (!checkList.Sender.Contains("@"))
if (!IsValidEmailAddress(checkList.Sender))
{
checkList.Sender = Resources.FailedToGetInformation;
}
Expand All @@ -163,9 +172,9 @@ private CheckList GetSenderAndSenderDomain(in Outlook._MailItem mail, CheckList
//代理送信の場合。
checkList.Sender = mail.Sender?.Address ?? Resources.FailedToGetInformation;

if (checkList.Sender.Contains("@") && !checkList.Sender.Contains("/o=ExchangeLabs"))
if (IsValidEmailAddress(checkList.Sender))
{
//メールアドレスが取得できる場合はそのまま使う。
//メールアドレスが取得できる場合はそのまま使う。
checkList.SenderDomain = checkList.Sender.Substring(checkList.Sender.IndexOf("@", StringComparison.Ordinal));
checkList.Sender = $@"{checkList.Sender} ([{mail.SentOnBehalfOfName}] {Resources.SentOnBehalf})";
}
Expand Down Expand Up @@ -284,31 +293,45 @@ private int CountRecipientExternalDomains(DisplayNameAndRecipient displayNameAnd
private IEnumerable<NameAndRecipient> GetNameAndRecipient(Outlook.Recipient recipient)
{
var mailAddress = Resources.FailedToGetInformation;
if (recipient.Name?.Contains("@") == true) mailAddress = recipient.Name;
if (IsValidEmailAddress(recipient.Name))
{
mailAddress = recipient.Name;
}
else
{
if (IsValidEmailAddress(recipient.Address)) mailAddress = recipient.Address;
}

try

if (!IsValidEmailAddress(mailAddress))
{
var isDone = false;
var errorCount = 0;
while (!isDone && errorCount < 200)
try
{
try
var isDone = false;
var errorCount = 0;
while (!isDone && errorCount < 200)
{
mailAddress = recipient.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x39FE001E").ToString() ?? Resources.FailedToGetInformation;
try
{
var propertyAccessor = recipient.PropertyAccessor;
Thread.Sleep(10);

isDone = true;
}
catch (COMException)
{
//HRESULT:0x80004004 対策
Thread.Sleep(30);
errorCount++;
mailAddress = propertyAccessor.GetProperty(@"http://schemas.microsoft.com/mapi/proptag/0x39FE001E").ToString() ?? Resources.FailedToGetInformation;

isDone = true;
}
catch (COMException)
{
//HRESULT:0x80004004 対策
Thread.Sleep(30);
errorCount++;
}
}
}
}
catch (Exception)
{
// Do Nothing.
catch (Exception)
{
// Do Nothing.
}
}

string nameAndMailAddress;
Expand All @@ -321,11 +344,7 @@ private IEnumerable<NameAndRecipient> GetNameAndRecipient(Outlook.Recipient reci
nameAndMailAddress = recipient.Name.Contains($@" ({mailAddress})") ? recipient.Name : recipient.Name + $@" ({mailAddress})";
}

//ケースによってメールアドレスのみを正しく取得できない恐れがあるため、その場合は、表示名称をメールアドレスとして登録する。
if (mailAddress?.Contains("@") != true)
{
mailAddress = nameAndMailAddress;
}
if (!IsValidEmailAddress(mailAddress)) mailAddress = nameAndMailAddress;

return new List<NameAndRecipient> { new NameAndRecipient { MailAddress = mailAddress, NameAndMailAddress = nameAndMailAddress } };
}
Expand Down Expand Up @@ -405,7 +424,10 @@ private IEnumerable<NameAndRecipient> GetExchangeDistributionListMembers(Outlook
{
try
{
mailAddress = tempRecipient.AddressEntry.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x39FE001E").ToString() ?? Resources.FailedToGetInformation;
var propertyAccessor = tempRecipient.AddressEntry.PropertyAccessor;
Thread.Sleep(10);

mailAddress = propertyAccessor.GetProperty(@"http://schemas.microsoft.com/mapi/proptag/0x39FE001E").ToString() ?? Resources.FailedToGetInformation;
isDone = true;
}
catch (COMException)
Expand Down Expand Up @@ -1347,5 +1369,40 @@ private void AddAlerts(string alertMessage, bool isImportant, bool isWhite, bool
IsChecked = isChecked
});
}

/// <summary>
/// メールアドレスか否か判定する。
/// </summary>
/// <param name="emailAddress">判定したい文字列</param>
/// <returns>メールアドレスか否か</returns>
private bool IsValidEmailAddress(string emailAddress)
{
if (string.IsNullOrWhiteSpace(emailAddress)) return false;

try
{
emailAddress = Regex.Replace(emailAddress, @"(@)(.+)$", DomainMapper, RegexOptions.None, TimeSpan.FromMilliseconds(500));
string DomainMapper(Match match)
{
var idnMapping = new IdnMapping();
var domainName = idnMapping.GetAscii(match.Groups[2].Value);
return match.Groups[1].Value + domainName;
}
}
catch (Exception)
{
return false;
}

try
{
return Regex.IsMatch(emailAddress, @"^(?("")("".+?(?<!\\)""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))" + @"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-0-9a-z]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9]))$",
RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(500));
}
catch (Exception)
{
return false;
}
}
}
}
2 changes: 1 addition & 1 deletion OutlookOkan/OutlookOkan.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
<PublishUrl>publish\</PublishUrl>
<InstallUrl />
<TargetCulture>en</TargetCulture>
<ApplicationVersion>2.5.0.0</ApplicationVersion>
<ApplicationVersion>2.5.1.0</ApplicationVersion>
<AutoIncrementApplicationRevision>false</AutoIncrementApplicationRevision>
<UpdateEnabled>false</UpdateEnabled>
<UpdateInterval>0</UpdateInterval>
Expand Down
4 changes: 2 additions & 2 deletions OutlookOkan/Properties/AssemblyInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("2.5.0.0")]
[assembly: AssemblyFileVersion("2.5.0.0")]
[assembly: AssemblyVersion("2.5.1.0")]
[assembly: AssemblyFileVersion("2.5.1.0")]
[assembly: NeutralResourcesLanguage("en-US")]

6 changes: 4 additions & 2 deletions OutlookOkan/Properties/Resources.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 4 additions & 2 deletions OutlookOkan/Properties/Resources.ja-JP.resx
Original file line number Diff line number Diff line change
Expand Up @@ -361,7 +361,7 @@
<value>Copyright (C) 2020 Noraneko Inc.</value>
</data>
<data name="Version" xml:space="preserve">
<value>バージョン 2.5.0</value>
<value>バージョン 2.5.1</value>
</data>
<data name="VersionInfo" xml:space="preserve">
<value>バージョン情報</value>
Expand All @@ -373,7 +373,9 @@
<value>キーワード:機密
警告文:機密という言葉が含まれています。

警告するキーワードとその警告文を登録します。</value>
警告するキーワードとその警告文を登録します。

※警告文が空欄の場合、デフォルトの警告文が表示されます。</value>
</data>
<data name="SettingExampleAlertMailAddress" xml:space="preserve">
<value>アドレス:info@noraneko.co.jp
Expand Down
6 changes: 4 additions & 2 deletions OutlookOkan/Properties/Resources.resx
Original file line number Diff line number Diff line change
Expand Up @@ -361,7 +361,7 @@
<value>Copyright (C) 2020 Noraneko Inc.</value>
</data>
<data name="Version" xml:space="preserve">
<value>Version 2.5.0</value>
<value>Version 2.5.1</value>
</data>
<data name="VersionInfo" xml:space="preserve">
<value>About</value>
Expand All @@ -373,7 +373,9 @@
<value>Keywords: Confidential
Alerting text: It includes the phrase "Confidential".

Register the keywords to be alert and their alerting text.</value>
Register the keywords to be alert and their alerting text.

If the alerting text is blank, the confirmation screen will show the default alerting text.</value>
</data>
<data name="SettingExampleAlertMailAddress" xml:space="preserve">
<value>Email address: info@noraneko.co.jp
Expand Down
Loading

0 comments on commit 770046a

Please sign in to comment.