A program shouldn't do surprising things. When you tell a program to send an email, the program should just send the email. It shouldn't also clean your socks, remind you to turn off the oven, and pay your taxes.
Also, if at any time you don't do exactly what the user told you to do, you must inform them. You should minimize these occurrences, because any time a program doesn't do what the user told it to do (even for reasons outside the control of the program), that detracts from the user's opinion of the excellence of the software. In our above example, the program shouldn't fail to send the email without informing the user that it failed. Failing is not what the user told it to do, and so the user needs to know.
The email example seems obvious, but there are many less obvious examples in the world of computing.