Hi Anthony,
That would be based on what these invalid mailboxes look like, for example:
User 1 to 3 all have invalid mailbox.

-> A quick way to bulk remove these contacts is that building an on-demand workflow to clear email field and filter out contacts who have invalid mailbox with advanced find,
however, as what we see, we should retrieve records three times:
1. filter out contacts whose email field doesn't contain @
2. filter out contacts whose email field contains illegal characters '_'
3. filter out contacts whose email field doesn't contain .com
-> Another way is that you could build a console app, filter out contact records with invalid mailbox by regex, then do bulk delete operation.
Example:
Retrieve contacts who have invalid mailbox and are owned by myself.

using ConnectionCRM;
using Microsoft.Crm.Sdk.Messages;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Xrm.Sdk.Messages;
using Microsoft.Xrm.Sdk.Metadata;
using Microsoft.Xrm.Sdk.Query;
using System;
using System.Configuration;
using System.Diagnostics;
using System.Net;
using System.Security.Cryptography;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Linq;
using System.Globalization;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections.Generic;
namespace ConnectionForD365
{
class Program
{
static void Main(string[] args)
{
connectToCRMByOrg();
}
public static void connectToCRMByOrg()
{
IOrganizationService organizationService = null;
try
{
String username = "your or admin user email";
String password = "password";
String organizationUrl = "https://orgURL/XRMServices/2011/Organization.svc";
ClientCredentials clientCredentials = new ClientCredentials();
clientCredentials.UserName.UserName = username;
clientCredentials.UserName.Password = password;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Console.WriteLine("Please waiting for connection...");
organizationService = (IOrganizationService)new OrganizationServiceProxy(new Uri(organizationUrl),
null, clientCredentials, null);
if (organizationService != null)
{
Guid userid = ((WhoAmIResponse)organizationService.Execute(new WhoAmIRequest())).UserId;
if (userid != Guid.Empty)
{
Console.WriteLine("Connection Established Successfully...");
OrganizationServiceProxy _serviceProxy = (OrganizationServiceProxy)organizationService;
_serviceProxy.EnableProxyTypes();
var pattern = @"\A(?:[a-z0-9!#$%&'* /=?^_`{|}~-] (?:\.[a-z0-9!#$%&'* /=?^_`{|}~-] )*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.) [a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\Z";
var list1 = GetContactsByEmail(pattern, organizationService);
var list2 = GetContactIdByEmail(pattern, organizationService);
foreach (var item in list1)
{
Console.WriteLine(item);
}
Console.WriteLine("-----------------------");
foreach (var item in list2)
{
Console.WriteLine("Those contacts who have invalid email address will be deleted: " item);
// organizationService.Delete("contact", item);
}
Console.WriteLine("OK");
}
}
else
{
Console.WriteLine("Failed to Established Connection!!!");
}
}
catch (Exception ex)
{
Console.WriteLine("Exception caught - " ex.Message);
}
}
private static IEnumerable GetContactsByEmail(String email, IOrganizationService organizationService)
{
QueryExpression query = new QueryExpression
{
EntityName = "contact",
ColumnSet = new ColumnSet("contactid", "fullname", "emailaddress1")
};
query.Criteria.AddCondition("owninguser", ConditionOperator.Equal, "userid");
IEnumerable entities = organizationService.RetrieveMultiple(query).Entities;
return entities
.Where(element => element.Contains("emailaddress1"))
.Where(element => !Regex.IsMatch((string)element["emailaddress1"], email))
.Select(element => new {
ContactId = element["contactid"],
Email = element["emailaddress1"],
Fullname = element["fullname"]
});
}
private static IEnumerable GetContactIdByEmail(String email, IOrganizationService organizationService)
{
QueryExpression query = new QueryExpression
{
EntityName = "contact",
ColumnSet = new ColumnSet("contactid", "fullname", "emailaddress1")
};
query.Criteria.AddCondition("owninguser", ConditionOperator.Equal, "userid");
IEnumerable entities = organizationService.RetrieveMultiple(query).Entities;
return entities
.Where(element => element.Contains("emailaddress1"))
.Where(element => !Regex.IsMatch((string)element["emailaddress1"], email))
.Select(element => element.Id);
}
}
}
You can run it directly in your environment, just replace
-> username,
-> password,
-> org URL,
-> record owner
with your own data.
Once you could confirm retrieved result is what you want to remove, then uncomment
organizationService.Delete("contact", item);
for bulk delete.
Regards,
Clofly