(AlexanderVH?) this function takes a subscriberlist of mixed emails and usernames, retrieves emails from a table EmailFromUserName? (name,email), and returns a comma separated list with only emails. The output is used in !sendMailTo There is a folder property subscribeusernamesonly (values: 0,1) that controls whether subscription is restricted to usernames only.:

def _CsvOfRecipientEmails(self,recipients):
    """generate commaseparated string of emails from mixed list of userid's and mail """
    if not recipients or len(recipients)==0:
        return ''
    idsonly= 0
    if hasattr(self.aq_parent, 'EmailFromUserName'):
        obj= getattr(self.aq_parent, 'EmailFromUserName')
    if hasattr (self.aq_parent.aq_parent,'subscribeusernamesonly'):
        #stores whether plain email addresses are allowed
        idsonly= getattr(self.aq_parent.aq_parent,'subscribeusernamesonly')
    for name in recipients:
        if not re.search(r'@',name):
            if obj:
                item= obj.__call__(name=name)
                if item and len(item)>0:
        elif idsonly==0:#if plain email addresses are allowed.
    return join(recipientEmails,',')


A central table means you can restrict email notification to members only. The moment a member is removed he won't get notification any more. This is actually independent from the username idea, because for emails you can check for presence in the table as well

you can change an emailaddress for a user in one single place

users can have extra anonymity: you can email them but you don't know their email address.

Still, while an ex-member will not be notified anymore, his username can still clutter subscription lists unless you have an extra routine to delete it.