Frequency Etiquette
I think that more important than 'not sent out more than one a week' would be 'sent out as infrequently as possible'
If you NEED to send out two in one week, then do so. But if you don't need to send them out, then don't send out anything.
Alternatively, you could make it 'newsletter' style, and send it out on a regular (scheduled) basis. But in that case you would need to ensure that you have specific relevant things to say in each message.
Ease of use
Make it incredibly easy to sign up, and sign out.
Make it incredibly easy (and optional) for them to customize it.
You mentioned fine-grained control, but keep in mind, when the customers see long lists of checkboxes about what they like and don't like, they know that the more boxes they click, the more mail they'll receive, so they'll tend to click fewer.
A method you could use would be similar to Facebook's "I like this" "I don't like this" the only problem being that you need a LOT of data (and complex) logic to implement a schema like that.
Short direct emails would be best (unlike this response).
Include links to the information, although that could get your emails marked as spam.
Many people mentioned not selling the emails, I think that's a given, but the other facet is something Frakkle mentioned. Do not have any way for any person on your mailing list to glean the information about anyone else on the mailing list. Not even bccing people. Always compose individual and direct emails.
Programmatically
In this case, as with many other programming issues, use whichever service type you are most familiar with. I do not believe the differences between and ASP.NET service and a Windows service would be larger than the difference in your own skill levels.
Logging
For logging, when using a Windows Service, I've had good experience with Log4Net. In terms of (the much more important) content. You should be logging a few things (if applicable).
- Recipient
- Time Sent
- Content Tags
- Current Message Queue
1) Recipient
An integral part to log, because oftentimes errors in the 'service' are actually errors with the recipient. You can imagine the havoc that would occur if your test mailbox fills up and starts rejecting messages.
2) Time sent
Very important for obvious reasons. Most loggers time-stamp every message anyway though.
3) Content tags
If you are sending out some sort of customized modular content, then there will likely be a set of content tags based on their preferences ("VideoGames,StackOverflowNews,Lederhosen") this allows you to track in a much more fine-grained manner what could be wrong with a certain class of emails that fail.
4) Current Message Queue
Many of the problems can be enlightened by logging this value every time. It shows you the times when your program is wildly slow, and it also shows you when it is curiously faster than normal (suspiciously empty queue). More problems will be illuminated by this one than by any others.