Define a calculation field, cNameList, that extracts the names from the email field with each name separated by a return character so that you get a list of values for each email:
Substitute ( Left ( emailfield ; Position ( emailfield ; "@" ; 1 ; 1 ) - 1 ) ; ["." ; ¶ ];["_" ; ¶ ] )
In a text field, gSearchNames, build a similar return separated list of all first and last names. In your example, you'd have this list:
Now this relationship will match every instance of a first or last name in gSearchName to every instance of a first or last name in cNameList:
Table::gSearchNames = Table2::cNameList
This can produce a list of records in a portal, or you can use the list function in a calculation field to generate a list of email addresses in a single field. This works because return separated lists of values in relationships function with an "OR" based value matching.