We send mail through a .NET application, which sends them individually. There is a limited customization for each one, and so the database needs to be read to send them. We actually read a batch, process on the client, send, update the database back with sending records.
700,000 emails in a few hours is no joke. We examined lots of services and processes over the years. Managing that workloads requires lots of tracking and processing to comply with SPAM laws. There potentially could be a more efficient way, and it's probably worth examining. Currently there are about 3 tables used to store the emails, the recipients, and something else (escapes me this minute). We keep about 4 days worth of tracking there, though there are logs written to local disk on the clients as well.