Save Entry Data as CSV and Email it to the Author / Logged in User
For this purpose there is not such a thing like a "best" way. Every thing has advantages and disadvantages. Depending on your goal you should decide what fits best for you.

I personally prefer to have my files attached to the email so I can be sure I actually have the file on every device and I can redownload it every time. Other people might say it's better to just have a link for whatever reasons.

So I would create a temporary file and attach it to the mail like you do. Make sure to name each file separately. If you have really large entries (that need more time to generate the csv) and two authors click the button at the same time they could eventually overwrite each other. So it might be a good idea to include the author ID or something in the filename. You can delete it afterwards. 

If you want to keep these files you could store them as Craft assets but i don't think this is necessary for your purpose. You could create a record if you like to track the activities. So if you need to see how many authors used that download how often you can insert it into your database.

However, the more interesting thing is how to fetch the entries and fields.
Btw you know you have to parse the body content in order to replace the twig tokens? 

Edit
You could use this function

 /**
 * Send Email
 *
 * @param $message string
 * @param $subject string
 * @param $mail string
 * @param array $attachments
 * @return bool
 */
public function sendMail($message, $subject, $mail, $attachments = array()){
    $adminEmail = craft()-&gt;systemSettings-&gt;getSetting('email', 'emailAddress');
    $email = new EmailModel();

    $email-&gt;fromEmail = $adminEmail;
    $email-&gt;replyTo = $adminEmail;
    $email-&gt;sender = $adminEmail;
    $email-&gt;fromName = craft()-&gt;getSiteName();
    $email-&gt;toEmail = $mail;
    $email-&gt;subject = $subject;
    $email-&gt;htmlBody = $message;

    if(is_array($attachments) &amp;&amp; count($attachments)){
        foreach($attachments as $attachment){
            $email-&gt;addAttachment($attachment['path'], $attachment['name']);
        }
    }
    return craft()-&gt;email-&gt;sendEmail($email);
}


with

$attachment = [
    [
        'name' =&gt; "The name you want to display.csv",
        'path'  =&gt; $file // path/to/your/file
    ]
];

$subject = "Your CSV";
$email = $user-&gt;email;;
$message = craft()-&gt;templates-&gt;render('path/to/template', array(
    'username' =&gt; '...',
    // .....
));
if($this-&gt;sendMail($message, $subject, $email, $attachment)){
    // message send
}else{
    // some errors
}