How to send email to specific email address instead of CRM User/Enity ?

At standard operation email is being sent to EntityReference object corresponding to: User, Contact etc. Entity reference is being converted anyway into ActivityParty object.

So, why not to use ActivityParty just from email address collection:

private const string HtmlMimeType = @"Content-Type: text/html; charset=UTF-8";
private const string PlainTextMimeType = @"Content-Type: text/plain; charset=UTF-8";

public void CreateEmail(string title, string message, EntityReference[] senders, MailAddressCollection recipients, bool useHtmlFormat, bool sendAfterCreate)
{
    var recipientsCollection = recipients.Select(recipientAddress => new ActivityParty { AddressUsed = recipientAddress.Address }).ToList();

    CreateEmail(title, message, CreateActivityParties(senders), recipientsCollection, useHtmlFormat, sendAfterCreate);
}

private static IEnumerable<ActivityParty> CreateActivityParties(EntityReference[] entities)
{
    var activityParty = new ActivityParty[entities.Length];
            
    for (int index = 0; index < entities.Length; index++)
        activityParty[index] = CreateActivityParty(entities[index]);

    return activityParty;
}

private void CreateEmail(string title, string message, IEnumerable<ActivityParty> senders, IEnumerable<ActivityParty> recipients, bool useHtmlFormat, bool sendAfterCreate)
{
    var email = new Email
    {
        Subject = title.IsNullOrEmpty() ? DefaultSubjectValue : title,
        Description = message,
        From = senders,
        To = recipients,
        MimeType = useHtmlFormat ? HtmlMimeType : PlainTextMimeType
    };

    ValidateEmail();
    OrganizationService.Create(email);

    Send(sendAfterCreate);
}

private void Send(bool send)
{
    var tokenRequest = new GetTrackingTokenEmailRequest();
    var tokenResponse = (GetTrackingTokenEmailResponse)OrganizationService.Execute(tokenRequest);

    var request = new SendEmailRequest
    {
        EmailId = _entityPrototype.InterposedEntity.Id,
        TrackingToken = tokenResponse.TrackingToken,
        IssueSend = send
    };

    OrganizationService.Execute(request);
}

Have an own opinion?