We are trying to send an email to recent donors asking them to tell a friend about a current campaign. I know TAF pages exist as part of the donation page flow, but do they exist outside of that at all, or is there an easy way to make one?
Tell-a-friend has been implemented for donation (including membership), participant, and pledge pages.
I'm not quite sure how you want to use them. If you have a technology provider in-house or a CiviCRM consultant they could look over and adapt the Smarty template code at https://github.com/civicrm/civicrm-core/blob/master/templates/CRM/Friend/Form/Friend.tpl. See also the related php code at https://github.com/civicrm/civicrm-core/blob/master/CRM/Friend/Form/Friend.php, as well as the template at https://github.com/civicrm/civicrm-core/blob/master/templates/CRM/Friend/Friend.tpl and its similarly matching php code.
If you are on the Drupal platform I think this would be quite easy to set up using Webform and Webform CiviCRM. What you would do is create a webform with the number of contacts that you want to allow your supporter to contact on it. You can then configure the webform to send emails to each of the collected emails (or use Drupal Rules for this purpose). You can send out a link to this webform via CiviMail and use a Checksum token to auto populate the webform with the original contact details.
Ps. to make this a bit nicer you could have a condition on the webform to show hide extra contacts depending on the number of friends to email.
I like Jamie's suggestion of Webform CiviCRM as an avenue to explore. As far as the default TAF functionality, I believe you can send a direct link to the TAF page for your particular Contribution page (assuming TAF is activated) and get people to that page straight from an email, but the caveat is that they need to be logged in to avoid a fatal error. This is because the TAF page needs to get the contact ID of the sender and can't get that from an anonymous page view. (You could experiment and see if sending the link with a checksum in the URL was enough to make it work, I'm not certain).
You can test that on the demo server with this link (try it once while not logged in, and then after logging in):