private byte[] CreateMemberId(IDistributionList member)
        {
            List <byte> id = new List <byte>();

            id.AddRange(PREFIX_MEMBER_ID);
            id.AddRange(StringUtil.HexToBytes(member.EntryID));
            return(id.ToArray());
        }
Ejemplo n.º 2
0
 public SmtpClientDistributor(
     IDistributionList distributionList,
     ILogger <SmtpClientDistributor> logger,
     IOptions <AppSettings> configuration)
 {
     DistributionList = distributionList.GetList();
     Configuration    = configuration.Value;
     _logger          = logger;
 }
        private void AddDistributionListMember(IDistributionList member)
        {
            // Resolving a distribution list can only be done by name. This fails if the name is in multiple
            // groups (e.g. 'Germany' and 'Sales Germany' fails to find Germany). Patch the member
            // tables explicitly.
            object[] members       = (object[])GetProperty(OutlookConstants.PR_DISTLIST_MEMBERS);
            object[] oneOffMembers = (object[])GetProperty(OutlookConstants.PR_DISTLIST_ONEOFFMEMBERS);

            // Create the new member ids
            byte[] memberId       = CreateMemberId(member);
            byte[] oneOffMemberId = CreateOneOffMemberId(member);

            // See if it is already a member
            // Compare on one-off member id, as memberId changes
            int existingIndex = -1;

            for (int i = 0; i < oneOffMembers.Length; ++i)
            {
                byte[] existing = (byte[])oneOffMembers[i];
                if (existing.SequenceEqual(oneOffMemberId))
                {
                    existingIndex = i;
                    break;
                }
            }

            // Copy the existing members
            int newElements = existingIndex < 0 ? 1 : 0;

            object[] newMembers       = new object[members.Length + newElements];
            object[] newOneOffMembers = new object[members.Length + newElements];
            for (int i = 0; i < members.Length; ++i)
            {
                newMembers[i]       = members[i];
                newOneOffMembers[i] = oneOffMembers[i];
            }

            // Create the new entry
            // If it was already a member, overwrite. Otherwise append.
            if (existingIndex < 0)
            {
                existingIndex = members.Length;
            }
            newMembers[existingIndex]       = memberId;
            newOneOffMembers[existingIndex] = oneOffMemberId;

            // Write back
            SetProperties(
                new string[] { OutlookConstants.PR_DISTLIST_MEMBERS, OutlookConstants.PR_DISTLIST_ONEOFFMEMBERS },
                new object[] { newMembers, newOneOffMembers }
                );
        }
Ejemplo n.º 4
0
        private void AddGroupMember(IDistributionList group, IItem item)
        {
            if (!_feature.GroupMembersAdd)
            {
                return;
            }

            if (item is IDistributionList)
            {
                if (!_feature.NestedGroups)
                {
                    return;
                }
            }

            group.AddMember(item);
        }
Ejemplo n.º 5
0
        private void CreateGroup(string id, Dictionary <string, object> value, ChunkIndex index)
        {
            if (!_feature.CreateGroups)
            {
                return;
            }

            using (IDistributionList group = Contacts.Create <IDistributionList>())
            {
                Logger.Instance.Debug(this, "Creating group: {0}", id);
                group.DLName = Get <string>(value, "displayName");
                if (Get <string>(value, "smtpAddress") != null)
                {
                    group.SMTPAddress = Get <string>(value, "smtpAddress");
                }

                SetItemStandard(group, id, value, index);
                group.Save();

                if (_feature.GroupMembers)
                {
                    ArrayList members = Get <ArrayList>(value, "members");
                    if (members != null)
                    {
                        foreach (string memberId in members)
                        {
                            using (IItem item = FindItemById(memberId))
                            {
                                Logger.Instance.Debug(this, "Finding member {0} of {1}: {2}", memberId, id, item?.EntryID);
                                if (item != null)
                                {
                                    AddGroupMember(group, item);
                                }
                            }
                        }
                    }
                    group.Save();
                }

                AddItemToGroups(group, id, value, index);
            }
        }
 private byte[] CreateOneOffMemberId(IDistributionList member)
 {
     return(CreateOneOffMemberId(member.DLName, "UNKNOWN", "UNKNOWN"));
 }
Ejemplo n.º 7
0
        private void CreateGroup(string id, Dictionary <string, object> value, ChunkIndex index)
        {
            if (!_feature.CreateGroups)
            {
                return;
            }

            string smtpAddress = Get <string> (value, "smtpAddress");

            if (!string.IsNullOrEmpty(smtpAddress) && _feature.SMTPGroupsAsContacts)
            {
                // Create a contact
                using (IContactItem contact = Contacts.Create <IContactItem>())
                {
                    Logger.Instance.Debug(this, "Creating group as contact: {0}", id);
                    contact.FullName          = contact.FileAs = Get <string>(value, "displayName");
                    contact.Email1Address     = smtpAddress;
                    contact.Email1AddressType = "SMTP";

                    SetItemStandard(contact, id, value, index);

                    if (_feature.GroupMembers)
                    {
                        // Add the group members as the body
                        ArrayList members = Get <ArrayList>(value, "members");
                        if (members != null)
                        {
                            string membersBody = null;
                            foreach (string memberId in members)
                            {
                                using (IItem item = FindItemById(memberId))
                                {
                                    Logger.Instance.Debug(this, "Finding member {0} of {1}: {2}", memberId, id, item?.EntryID);
                                    if (item != null)
                                    {
                                        if (membersBody == null)
                                        {
                                            membersBody = "";
                                        }
                                        else
                                        {
                                            membersBody += "\n";
                                        }

                                        if (item is IContactItem)
                                        {
                                            IContactItem memberContact = (IContactItem)item;
                                            membersBody += string.Format("{0} ({1})", memberContact.FullName, memberContact.Email1Address);
                                        }
                                        else if (item is IDistributionList)
                                        {
                                            IDistributionList memberGroup = (IDistributionList)item;
                                            if (string.IsNullOrEmpty(memberGroup.SMTPAddress))
                                            {
                                                membersBody += memberGroup.DLName;
                                            }
                                            else
                                            {
                                                membersBody += string.Format("{0} ({1})", memberGroup.DLName, memberGroup.SMTPAddress);
                                            }
                                        }
                                        else
                                        {
                                            membersBody += item.Subject;
                                        }
                                    }
                                }
                            }
                            contact.Body = membersBody;
                        }
                    }
                    contact.Save();

                    AddItemToGroups(contact, id, value, index);
                }
            }
            else
            {
                // Create a proper group
                using (IDistributionList group = Contacts.Create <IDistributionList>())
                {
                    Logger.Instance.Debug(this, "Creating group: {0}", id);
                    group.DLName = Get <string>(value, "displayName");
                    if (smtpAddress != null)
                    {
                        group.SMTPAddress = smtpAddress;
                    }

                    SetItemStandard(group, id, value, index);
                    group.Save();

                    if (_feature.GroupMembers)
                    {
                        ArrayList members = Get <ArrayList>(value, "members");
                        if (members != null)
                        {
                            foreach (string memberId in members)
                            {
                                using (IItem item = FindItemById(memberId))
                                {
                                    Logger.Instance.Debug(this, "Finding member {0} of {1}: {2}", memberId, id, item?.EntryID);
                                    if (item != null)
                                    {
                                        AddGroupMember(group, item);
                                    }
                                }
                            }
                        }
                        group.Save();
                    }

                    AddItemToGroups(group, id, value, index);
                }
            }
        }