1
1
using System ;
2
+ using System . Text . RegularExpressions ;
2
3
using Outlook = Microsoft . Office . Interop . Outlook ;
3
4
4
5
namespace FlexConfirmMail . Dialog
@@ -16,6 +17,16 @@ internal class RecipientInfo : IComparable
16
17
17
18
public RecipientInfo ( Outlook . Recipient recp )
18
19
{
20
+ recp . Resolve ( ) ;
21
+ QueueLogger . Log ( "RecipientInfo" ) ;
22
+ QueueLogger . Log ( $ " Resolved: { recp . Resolved } ") ;
23
+ QueueLogger . Log ( $ " Name: { recp . Name } ") ;
24
+ QueueLogger . Log ( $ " Type: { recp . Type } ") ;
25
+ QueueLogger . Log ( $ " Address: { recp . Address } ") ;
26
+ QueueLogger . Log ( $ " AddressEntry.Name: { recp . AddressEntry . Name } ") ;
27
+ QueueLogger . Log ( $ " AddressEntry.Address: { recp . AddressEntry . Address } ") ;
28
+ QueueLogger . Log ( $ " AddressEntry.DisplayType: { recp . AddressEntry . DisplayType } ") ;
29
+ QueueLogger . Log ( $ " AddressEntry.Type: { recp . AddressEntry . Type } ") ;
19
30
if ( recp . AddressEntry . DisplayType == Outlook . OlDisplayType . olUser
20
31
&& recp . AddressEntry . Type == "SMTP" )
21
32
{
@@ -39,6 +50,7 @@ public RecipientInfo(Outlook.Recipient recp)
39
50
40
51
private void FromSMTP ( Outlook . Recipient recp )
41
52
{
53
+ QueueLogger . Log ( " => FromSMTP" ) ;
42
54
Type = GetType ( recp ) ;
43
55
Address = recp . Address ;
44
56
Domain = GetDomainFromSMTP ( Address ) ;
@@ -48,24 +60,79 @@ private void FromSMTP(Outlook.Recipient recp)
48
60
49
61
private void FromExchange ( Outlook . Recipient recp )
50
62
{
63
+ QueueLogger . Log ( " => FromExchange" ) ;
51
64
Outlook . ExchangeUser user = recp . AddressEntry . GetExchangeUser ( ) ;
52
- if ( user == null || string . IsNullOrEmpty ( user . PrimarySmtpAddress ) )
65
+ QueueLogger . Log ( $ " user: { user } ") ;
66
+
67
+ string possibleAddress = "" ;
68
+ if ( user == null ||
69
+ string . IsNullOrEmpty ( user . PrimarySmtpAddress ) )
53
70
{
54
- FromOther ( recp ) ;
71
+ QueueLogger . Log ( " user is null or has no PrimarySmtpAddress: trying to get it via PropertyAccessor" ) ;
72
+ const string PR_SMTP_ADDRESS = "https://schemas.microsoft.com/mapi/proptag/0x39FE001E" ;
73
+ possibleAddress = GetSMTPAddressViaAccessor ( recp , PR_SMTP_ADDRESS ) ;
74
+ if ( string . IsNullOrEmpty ( possibleAddress ) )
75
+ {
76
+ const string PR_EMS_PROXY_ADDRESSES = "http://schemas.microsoft.com/mapi/proptag/0x800f101e" ;
77
+ possibleAddress = GetSMTPAddressViaAccessor ( recp , PR_EMS_PROXY_ADDRESSES ) ;
78
+ }
55
79
}
56
80
else
57
81
{
58
- Type = GetType ( recp ) ;
59
- Address = user . PrimarySmtpAddress ;
60
- Domain = GetDomainFromSMTP ( Address ) ;
61
- Help = Address ;
62
- IsSMTP = true ;
82
+ possibleAddress = user . PrimarySmtpAddress ;
83
+ }
84
+
85
+ if ( string . IsNullOrEmpty ( possibleAddress ) )
86
+ {
87
+ QueueLogger . Log ( " Couldn't get address: fallback to FromOther" ) ;
88
+ FromOther ( recp ) ;
89
+ return ;
90
+ }
91
+ QueueLogger . Log ( $ " => finally resolved addrss: { possibleAddress } ") ;
92
+
93
+ Type = GetType ( recp ) ;
94
+ Address = possibleAddress ;
95
+ Domain = GetDomainFromSMTP ( Address ) ;
96
+ Help = Address ;
97
+ IsSMTP = true ;
98
+ }
99
+
100
+ private string GetSMTPAddressViaAccessor ( Outlook . Recipient recp , string schemaName )
101
+ {
102
+ try
103
+ {
104
+ QueueLogger . Log ( $ " Retrieving values for { schemaName } ...") ;
105
+ dynamic propertyValue = recp . AddressEntry . PropertyAccessor . GetProperty ( schemaName ) ;
106
+ if ( propertyValue is string [ ] values )
107
+ {
108
+ foreach ( string value in values )
109
+ {
110
+ QueueLogger . Log ( $ " value: { value } ") ;
111
+ // The recipient may have multiple values with their types like:
112
+ // SIP:local@domain
113
+ // SMTP:local@domain
114
+ // We should accept only SMTP address.
115
+ if ( ! string . IsNullOrEmpty ( value ) &&
116
+ Regex . IsMatch ( value , "^(SMTP:)?[^:@]+@.+" , RegexOptions . IgnoreCase ) )
117
+ {
118
+ return Regex . Replace ( value , "^SMTP:" , "" ) ;
119
+ }
120
+ }
121
+ }
122
+ return propertyValue . ToString ( ) ;
123
+ }
124
+ catch ( Exception ex )
125
+ {
126
+ QueueLogger . Log ( $ " Failed to GetProperty with { schemaName } : { ex } ") ;
127
+ return "" ;
63
128
}
64
129
}
65
130
66
131
private void FromDistList ( Outlook . Recipient recp )
67
132
{
133
+ QueueLogger . Log ( " => FromDistList" ) ;
68
134
Outlook . ExchangeDistributionList dist = recp . AddressEntry . GetExchangeDistributionList ( ) ;
135
+ QueueLogger . Log ( $ " dist: { dist } ") ;
69
136
if ( dist == null || string . IsNullOrEmpty ( dist . PrimarySmtpAddress ) )
70
137
{
71
138
FromOther ( recp ) ;
@@ -82,6 +149,7 @@ private void FromDistList(Outlook.Recipient recp)
82
149
83
150
private void FromOther ( Outlook . Recipient recp )
84
151
{
152
+ QueueLogger . Log ( $ " => FromOther ({ recp . AddressEntry . DisplayType } )") ;
85
153
switch ( recp . AddressEntry . DisplayType )
86
154
{
87
155
case Outlook . OlDisplayType . olUser :
0 commit comments