Register new user, assign custom role then send email

TO really fit your needs, I think it’s better to rewrite some part of wp_insert_user() function, some part can interrest you

   $user_email = apply_filters( 'pre_user_email', $raw_user_email );

And :

   $illegal_logins = (array) apply_filters( 'illegal_user_logins', array() );

if ( in_array( strtolower( $user_login ), array_map( 'strtolower', $illegal_logins ) ) ) {
    return new WP_Error( 'invalid_username', __( 'Sorry, that username is not allowed.' ) );
}

And :

     if ( isset( $userdata['role'] ) ) {
         $user->set_role( $userdata['role'] );
     } elseif ( ! $update ) {
         $user->set_role(get_option('default_role'));
     }

I think you’ll be able to combine all these parts to make your own user registration.

Hope it helps !