ItemAdded is called just once on you event receiver; an item can be added just once. The
ItemUpdated may be called multiple times. It will depend on what receivers or what workflows are active in the list and what method they use do to update the list item. Calling
SPListItem.Update() triggers the events while calling the
SPListItem.SystemUpdate() does not, which makes the latter suitable for internal updates that should not be reported.
If you cannot "persuade" components that you installed to use
SystemUpdate() for intermediate and other system changes ;-) you would have to think up some strategy how to avoid the "flocks of e-mails". For example, you could avoid an e-mail if it comes in less than a minute after the previous one.
I'd support Stefan's suggestion about Alerts. If you can make use of them you'd save time. I didn't notice an excessive amount of e-mails when using that. Either I was lucky having used only "well-behaving" event-receivers or Microsoft has some strategy to send e-mails when it makes sense.