Query to view scheduled or draft post

First, don’t use query_posts().

Note: This function isn’t meant to be used by plugins or themes. As
explained later, there are better, more performant options to alter
the main query. query_posts() is overly simplistic and problematic way
to modify main query of a page by replacing it with new instance of
the query.

http://codex.wordpress.org/Function_Reference/query_posts

The problem is here though.

http://www.mywebsite.com/scheduled-test-post/?mailer

You are attempting to access a scheduled post when you are not logged in. The problem is not with your code above. This is built into WordPress. Logically, a scheduled posts should not show up to ordinary users until its scheduled date. That logic is made long before your template loads. The code in that template will have no effect.

And to complicate things, the post statuses are rabidly protected. You will notice that that code comes after the query itself, and actually blocks content that might have been returned. The obvious solution…

function allow_scheduled($qry) {
  if (
    $qry->is_main_query()
    && $qry->is_single()
    && isset($_GET['mailer'])
  ) {
    $qry->set('post_status',array('publish','future'));
    echo 'fired';
  }
}
add_action('pre_get_posts','allow_scheduled');

… doesn’t work.

The only easy way I know around that is to grab the post directly with get_post().

So you are going to have to interrupt the process early and bypass some of the Core. Something like:

function allow_scheduled($posts) {
  remove_action('posts_results','allow_scheduled');
  if (
    isset($_GET['mailer'])
    && 1 == count($posts)
    && 'future' == $posts[0]->post_status
  ) {
    add_action(
      'template_include',
      function() use ($posts) {
        get_header();
        $q = get_post( $posts[0]->ID );
        var_dump($q);
        // do stuff
        get_footer();
        exit;
      }
    );
  }
}
add_action('posts_results','allow_scheduled');

You are essentially giving everyone access to your scheduled posts, once they discover the ?mailer trick. I don’t especially like that, and honestly, this is all a bit convoluted. I’d consider something like an endpoint or possibly leverage the AJAX API.