Why some commands don't take input redirection?
The short answer: because they weren't programmed to.
For a program to read from
stdin (which is the stream that the shell connects to the file specified after
<) is not automatic. It needs to be coded by the programmer. For that matter, reading from files given on the command line is also not automatic. That is, the contents of those files, whether given by redirection or specified by name, do not magically appear inside the program's variables without extra coding.
If a program was never coded to read from a stream, it doesn't matter whether you put a redirection - it will simply not read from it. By its POSIX specification (http://pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html),
echo is not required to read from
stdin, and only examines its command-line arguments (and some environment variables). To find out for other programs, you can read the source code, the documentation, or simply try it out as you said :-)
To answer your last question: you cannot really say a command is interactive. You can determine whether the input stream it's reading from is connected to a terminal (as opposed to, for instance, a plain file). There are examples in many languages on http://rosettacode.org/wiki/Check_input_device_is_a_terminal. You could conceive a mailing program that uses this feature to determine if it's being used interactively (accepting keyboard commands to read mail), or non-interactively (say, to read a mail message from a file). I am not sure how
mail does it. (Note that
mail behaves differently when called with or without command-line arguments!)