@Override
    protected Event doExecuteInternal(final RequestContext requestContext) throws Throwable {
        val authentication = WebUtils.getAuthentication(requestContext);
        val principal = resolvePrincipal(authentication.getPrincipal(), requestContext);
        val token = getOrCreateToken(requestContext, principal);
        LOGGER.debug("Using token [{}] created at [{}]", token.getId(), token.getCreationTime());

        val allRecipients = new LinkedHashMap<TokenSharingStrategyOptions, List<String>>();
        val communicationStrategy = tokenCommunicationStrategy.determineStrategy(token);

        val smsSent = tryToSendSms(requestContext, communicationStrategy, principal, allRecipients, token);
        val emailSent = tryToSendEmail(requestContext, communicationStrategy, principal, allRecipients, token);

        if (!emailSent && !smsSent && (communicationsManager.isMailSenderDefined() || communicationsManager.isSmsSenderDefined())) {
            LOGGER.debug("No email or SMS recipients found for [{}]", principal.getId());
            if (allRecipients.isEmpty()) {
                return routeToEmailRegistrationFlow(principal, authentication, allRecipients);
            }
            val emailRecipients = allRecipients.getOrDefault(TokenSharingStrategyOptions.EMAIL, List.of());
            val smsRecipients = allRecipients.getOrDefault(TokenSharingStrategyOptions.SMS, List.of());

            if (emailRecipients.size() > 1 || smsRecipients.size() > 1) {
                LOGGER.debug("Multiple recipients found for [{}]: [{}]", principal.getId(), allRecipients);
                return buildSelectRecipientsEvent(requestContext, principal, allRecipients);
            }
        }

        val notificationSent = communicationStrategy.contains(TokenSharingStrategyOptions.NOTIFICATION) && isNotificationSent(principal, token);
        val phoneCallSent = communicationStrategy.contains(TokenSharingStrategyOptions.PHONE)
            && CasSimpleMultifactorMakePhoneCall.of(communicationsManager, properties).call(principal, token, requestContext);

        if (smsSent || emailSent || notificationSent || phoneCallSent) {
            LOGGER.debug("Successfully submitted token via strategy option [{}] to [{}]", communicationStrategy, principal.getId());
            storeToken(requestContext, token);
            return buildSuccessEvent(token);
        }
        LOGGER.error("Communication strategies failed to submit token [{}] to user", token.getId());
        return routeToErrorEvent();
    }
Event attribute to allow registration of email.
support/cas-server-support-simple-mfa-core/src/main/java/org/apereo/cas/mfa/simple/web/flow/CasSimpleMultifactorSendTokenAction.java