You don't have to use any of the features of the container if you think you can reimplement them in your own code. Just be aware that the container code will have been written to take care of annoying details like having to deal with simultaneous access from multiple threads and reconnection after failures and all those other issues that you didn't acknowledge in your post.
Actually, sorry, you do acknowledge some of those issues:
Tushar Kapila wrote:and more importantly - once we get the session from JNDI/static member - do we ever need to re init if its the same host/port as before?
If you get a session from JNDI you don't need to deal with any of those issues. Unless you were proposing to keep a long-running reference to the session, of course. But don't do that. If you want to send an e-mail, then get a session from JNDI and use that to send the e-mail. Don't keep a reference to that session.
If you roll your own session, then I don't know.