Look at the world through the hiring manager's eyes, though, and you'll see that a letter and resume, no matter how well-written, is likely to be classified as spam (if it's electronic) or junk mail (if it's on paper) if he/she doesn't know you. (If you don't know the person's name, just their title, it's even worse. A to-whom-it-may-concern letter has no chance at all.)
So all things being equal, call. If you lack confidence, use your writing skills to create three scripts: one for reaching the hiring manager live, one for reaching an administrative assistant, and one for leaving a voice mail. Except for the last one, the script is just enough to get a conversation started -- and to help you not flounder around wondering what you ought to say.
When you call, keep your goal firmly in mind: You aren't trying to have your conversation in the call. You're trying to interest your prospect just enough to accept an appointment; you want the actual conversation to be face-to-face.
I'd also advise against knowing whether the hiring manager has an open position, because if you know, you'll have to explain why you're a great fit for it.
But if you don't know, you're free to explain all the things you could do to help the hiring manager, whether or not they're listed in the job description. That's a much better conversation to have, because you get to set its agenda.