Depending on your normal server load, you may want to do this as a separate process, such as a simple Node script, instead of inside of your Meteor app. This is especially a good idea if your server has multiple cores, since your Meteor app can run on core while the script runs on another. Of course, if you’re using multiple servers to host your app this is less of an issue (but still not a bad idea).
You’re unlikely to crash your servers unless you have a memory issue (like continuing to hold onto each email message until your process runs out of RAM). If that’s an issue, implement a design where only X number of messages can be in your mail sending queue at once; when you have fewer than X messages, retrigger the process that adds more messages. If you can get by with processing and sending each message one at a time, then this shouldn’t be an issue.
Another option would be to use something like setTimeout() to add a small delay between sending each message. Definitely don’t do it in a loop in your main Meteor app, as your site would be unresponsive until all the messages are sent.
I’d also recommend storing the progress in a database, so if the job is interrupted for any reason, you can pick up where you left off.
Depending on how you plan to trigger sending these updates, you might find vsivsi:job-collection to be helpful for scheduling the jobs. You can use it from either Meteor or pure node.js.