@Bean
    @ConditionalOnMissingBean(name = SmsSender.BEAN_NAME)
    @RefreshScope(proxyMode = ScopedProxyMode.DEFAULT)
    public SmsSender smsSender(
        @Qualifier(HttpClient.BEAN_NAME_HTTPCLIENT_TRUST_STORE)
        final HttpClient supportsTrustStoreSslSocketFactoryHttpClient,
        final CasConfigurationProperties casProperties) {
        val groovy = casProperties.getSmsProvider().getGroovy();
        if (groovy.getLocation() != null && CasRuntimeHintsRegistrar.notInNativeImage()) {
            return new GroovySmsSender(groovy.getLocation());
        }
        val rest = casProperties.getSmsProvider().getRest();
        if (StringUtils.isNotBlank(rest.getUrl())) {
            return new RestfulSmsSender(rest, supportsTrustStoreSslSocketFactoryHttpClient);
        }
        return SmsSender.noOp();
    }
This is {@link CasCoreNotificationsAutoConfiguration}.

@author Misagh Moayyed
@since 5.0.0
core/cas-server-core-notifications/src/main/java/org/apereo/cas/config/CasCoreNotificationsAutoConfiguration.java