You should create a new version of Add, SetItem, and InsertItem:
public class Emails : ObservableCollection<Email> {
    public Emails() {
    }
    public Emails(IEnumerable<Email> emails) {
        foreach (var e in emails) {
            Add(e);
        }
    }
    public IEnumerable<Email> GetAll() {
        return Items;
    }
    protected bool InsertItem(int index, Email item, bool throwOnInvalidEmailAddress = false) {
        if (IsValidEmailAddress(item.Address)) {
            base.InsertItem(index, item);
            return true;
        }
        if (throwOnInvalidEmailAddress)
            throw new Exception("Bad email address!");
        return false;
    }
    protected bool SetItem(int index, Email item, bool throwOnInvalidEmailAddress = false) {
        if (IsValidEmailAddress(item.Address)) {
            base.SetItem(index, item);
            return true;
        }
        if (throwOnInvalidEmailAddress)
            throw new Exception("Bad email address!");
        return false;
    }
    public bool Add(Email item, bool throwOnInvalidEmailAddress = false) {
        if (IsValidEmailAddress(item.Address)) {
            base.Add(item);
            return true;
        }
        if (throwOnInvalidEmailAddress)
            throw new Exception("Bad email address!");
        return false;
    }
    private static readonly Regex EmailValidatorRegex = 
        new Regex(@"^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$");
    private bool IsValidEmailAddress(string address) {
        return !string.IsNullOrWhiteSpace(address) && EmailValidatorRegex.IsMatch(address);
    }
}
Note 1: The used Regex came from @LInsoDeTeh 's answer
Note 2: You can use the provided throwOnInvalidEmailAddress parameter, to decide what to do with invalid addresses e.g. ignore them, throw an exception, ...