I’ve been trying to set up a program that uses Linkchecker with PHPMailer to check a list of websites and send me an email with the results. I wrote a bash script that uses linkchecker to create a folder named “errors.” This folder contains a folder for each website, which then contains the .html files that are the result of checking the site’s links. I named these HTML files based on the date and time the site was checked, so that when I use PHPMailer I can attach the most recent check of each site to the email. However, I’ve been having some issues with actually sending the mail. It appears to be an issue with the attachments, because in certain numbers and configurations of attachments the email sends fine. Other times though, the program “sends” the email without any issues but I never receive it. The file that sends the mail is below:
<?php
require 'vendor/autoload.php';
use PHPMailerPHPMailerPHPMailer;
use PHPMailerPHPMailerException;
function getMostRecentFile($dir)
{
$files = glob($dir . '/*.html');
if (empty($files)) {
return null;
}
usort($files, function ($a, $b) {
return filemtime($b) - filemtime($a);
});
return $files[0];
}
function getSiteFolders($dir)
{
$folders = glob($dir . '/*', GLOB_ONLYDIR);
return $folders;
}
function sendEmailWithAttachments($recipient, $subject, $body, $errorsDir)
{
$mail = new PHPMailer(true);
try {
$mail->addAddress($recipient);
$siteFolders = getSiteFolders($errorsDir);
foreach ($siteFolders as $siteFolder) {
$mostRecentFile = getMostRecentFile($siteFolder);
if ($mostRecentFile !== null) {
$mail->addAttachment($mostRecentFile);
}
}
$mail->addAttachment('output.html');
$mail->isHTML(true);
$mail->Subject = $subject;
$mail->Body = $body;
$mail->send();
echo 'Email has been sent successfully!';
} catch (Exception $e) {
echo "Email could not be sent. Error: {$mail->ErrorInfo}";
}
}
// Usage example
sendEmailWithAttachments('[email protected]', 'Linkchecker Report', 'Please find the linkchecker error report attached.', 'errors');
?>
Running this program with $mail->getAttachments()
after attaching every file properly returns a list of all of the appropriate files.
Any ideas?
I’ve tried sending the email with different numbers and configurations of attachments. It sends just fine when there are 1 or 2 attachments, I haven’t tested it so far as to know the exact number of attachments to make it fail.
Initially I though it was an issue with the naming of the attachment files which had some unrecognized characters in them, but now they have the naming convention “YY-MM-DD HH-MM-SS”, and all the characters are recognized.
Eli Robinson is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.