I put together some functions that allows a PHP script to send the SQL data obtained from user inputs on a website via an email attachment as a CSV file. It works perfectly and I have no issues with the code. Alternatively with the right SQL query it would run every X amount of days with a cron job and only produce the data within a specific criteria such as every month.
The idea behind the code is for users that cannot extract their data from SQL and have limited experience running their businesses online. I would like some input from what I have put together from scripts and endless amounts of testing to see if the code is up to standard.
Firstly I create the fileName:
function fileName() { $path = "csv/"; $filename = "Subscribers" . date('Ymd') . ".csv"; $filepath = $path . $filename; return $filepath; }
After which I create the CSV file:
function createCSV() { include_once "conn.php"; global $conn; $filepath = fileName(); $output = fopen($filepath, "w"); fputcsv($output, array( 'Name', 'Email', 'Date Joined' )); $query = "SELECT name, email, dateTime FROM tableData"; $result = mysqli_query($conn, $query); while ($row = mysqli_fetch_assoc($result)) { fputcsv($output, $row); } return $output; fclose($output); }
Followed by the code I cut and edited from a thread online for attaching the CSV using the built in mail function:
function sendCSV() { // Recipient $to = '[email protected]'; // Sender $from = '[email protected]'; $fromName = 'Test'; // Email subject $subject = 'PHP Email with Attachment'; // Attachment file $file = fileName(); $files = glob('csv/*.csv'); unlink($files); createCSV(); // Email body content $htmlContent = ' <h3>PHP Email with Attachment</h3> <p>This email is sent from the PHP script with attachment.</p> '; // Header for sender info $headers = "From: $fromName" . " <" . $from . ">"; // Boundary $semi_rand = md5(time()); $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; // Headers for attachment $headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\""; // Multipart boundary $message = "--{$mime_boundary}\n" . "Content-Type: text/html; charset=\"UTF-8\"\n" . "Content-Transfer-Encoding: 7bit\n\n" . $htmlContent . "\n\n"; // Preparing attachment if (!empty($file) > 0) { if (is_file($file)) { $message .= "--{$mime_boundary}\n"; $fp = @fopen($file, "rb"); $data = @fread($fp, filesize($file)); @fclose($fp); $data = chunk_split(base64_encode($data)); $message .= "Content-Type: application/octet-stream; name=\"" . basename($file) . "\"\n" . "Content-Description: " . basename($file) . "\n" . "Content-Disposition: attachment;\n" . " filename=\"" . basename($file) . "\"; size=" . filesize($file) . ";\n" . "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n"; } } $message .= "--{$mime_boundary}--"; $returnpath = "-f" . $from; // Send email $mail = @mail($to, $subject, $message, $headers, $returnpath); // Email sending status echo $mail ? "<h1>Email Sent Successfully!</h1>" : "<h1>Email sending failed.</h1>"; }
I am quite new to PHP but managed to put something together that actually works. If you can point out my mistakes (which I do know there would be), or guide me to more simple techniques, I would really appreciate it and it will help me progress in my PHP learning path.