来自目录的电子邮件附件并不总是最新的使用 PHPMailer
Email Attachment from directory is not always the latest using PHPMailer
更新 #2 - 最终答案
我想你会在下面的评论中看到我的比较符号需要更改。所以我采用了更新#1 中的代码并简单地更改了它:
return filemtime($a) < filemtime($b);
至:
return filemtime($a) > filemtime($b);
做到了!!!感谢大家的对话。
更新
我已经更新了我的代码。现在我正在发送附件,但又一次,它没有获取最新的附件。这是我的最新代码:
<?php
ini_set('display_errors',1);
ini_set('display_startup_errors',1);
error_reporting(-1);
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'php/PHPMailer2020/src/Exception.php';
require 'php/PHPMailer2020/src/PHPMailer.php';
$dir = "php/sketch-drawings/";
$pics = scandir($dir);
$files = glob($dir . "*.*");
usort($files, function($a, $b){
return filemtime($a) < filemtime($b);
});
foreach ($files as $pics) {
echo '<img src="'. $pics . '">';
}
// SEND EMAIL W/ ATTACHMENT OF LATEST IMAGE
$mail = new PHPMailer();
$mail->Sender = "hello@myemail.com";
$mail->From = "mail@myemail.com";
$mail->FromName = "My Company";
$mail->AddReplyTo( "mail@mycompany.com", "DO NOT REPLY" );
//$mail->AddAddress("info@mycompany.com");
$mail->AddAddress("myemail@gmail.com");
$mail->isHTML(true);
$mail->Subject = "Latest Sketch Image";
$mail->Body = "Latest Image Attached! \n\n Thanks - XYZ Digital.";
$mail->AddAttachment($pics);
if(!$mail->Send()) {
echo 'Email Failed To Send.';
}
else {
echo 'Email Was Successfully Sent.';
echo "</p>";
echo '<script language="javascript">';
echo 'alert("Thanks! Message Sent")';
echo '</script>';
}
$mail->ClearAddresses();
?>
本期:
AddAttachment($filepath) return 是一个附件,但它不是最新的——我需要它总是 return 目录中的最新图像。
这是我正在做的事情:
我创建了一个 Web 应用程序,它基本上是一个画板。当用户点击 "Save" 时,代码会捕捉元素的图片,将其保存到目录中,然后将电子邮件发送到预定义的地址,并将 canvas 的快照作为附件...问题在上面。
我做了什么:
我到处寻找解决方案——似乎唯一的发现是通过网络表单上传附件——这不是我的问题。我的工作流程不同,为什么我现在在这里问。 :)
什么不起作用:
除附件部分外,一切正常。我正在使用 PHPMailer,但由于某种原因,附件从来都不是最新的。其实怎么看都是一样的执着。
我试图获取数组中的第一个元素来执行此操作(我在代码底部回显了它 return 正确的图像:
$mail->addAttachment($sketches[0]);
这不起作用 -- 它发送了电子邮件,但没有附加任何内容。
我怎么能调整下面的代码来获取最新的附件呢?感谢任何帮助,因为 PHP 不是我的专业领域。
查看下面的代码...
<?php // NEW
// DEFINE ERRORS
ini_set('display_errors',1);
ini_set('display_startup_errors',1);
error_reporting(-1);
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'PHPMailer2020/src/Exception.php';
require 'PHPMailer2020/src/PHPMailer.php';
// GET LATEST UPLOAD -- AND HAVE IT STORED IN DOM (WHEN NEEDED)
$path = ('sketch-drawings');
// Sort in descending order
$sketches = scandir($path, 1);
$latest_ctime = 1;
$latest_filename = '';
$d = dir($path);
while (false !== ($entry = $d->read())) {
$filepath = "{$path}/{$entry}";
// could do also other checks than just checking whether the entry is a file
if (is_file($filepath) && filectime($filepath) > $latest_ctime) {
$latest_ctime = filectime($filepath);
$latest_filename = $entry;
}
// SEND EMAIL W/ ATTACHMENT OF LATEST IMAGE
$mail = new PHPMailer();
$mail->Sender = "hello@myemail.com";
$mail->From = "mail@myemail.com";
$mail->FromName = "My Company";
$mail->AddReplyTo( "mail@myemail.com", "DO NOT REPLY" );
//$mail->AddAddress("info@myemail.com");
$mail->AddAddress("myemail@gmail.com");
$mail->isHTML(true);
$mail->Subject = "Latest Sketch Image";
$mail->Body = "Latest Image Attached! \n\n Thanks - XYZ Digital.";
$mail->AddAttachment($filepath);
//$mail->addAttachment($sketches);
if(!$mail->Send()) {
echo 'Email Failed To Send.';
} else {
echo $filepath;
echo "<br><br>";
print $latest_filename;
echo "</p>";
echo "<p>";
print $sketches[0];
echo "</p>";
echo "<p>";
echo 'Email Was Successfully Sent.';
echo "</p>";
echo '<script language="javascript">';
echo 'alert("Thanks! Message Sent")';
echo '</script>';
}
$mail1->ClearAddresses();
}
?>
PHP 的 dir()
函数 returns indeterminate order. If you want to retrieve files ordered by date, see this answer 中的项目。
更新 #2 - 最终答案 我想你会在下面的评论中看到我的比较符号需要更改。所以我采用了更新#1 中的代码并简单地更改了它:
return filemtime($a) < filemtime($b);
至:
return filemtime($a) > filemtime($b);
做到了!!!感谢大家的对话。
更新 我已经更新了我的代码。现在我正在发送附件,但又一次,它没有获取最新的附件。这是我的最新代码:
<?php
ini_set('display_errors',1);
ini_set('display_startup_errors',1);
error_reporting(-1);
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'php/PHPMailer2020/src/Exception.php';
require 'php/PHPMailer2020/src/PHPMailer.php';
$dir = "php/sketch-drawings/";
$pics = scandir($dir);
$files = glob($dir . "*.*");
usort($files, function($a, $b){
return filemtime($a) < filemtime($b);
});
foreach ($files as $pics) {
echo '<img src="'. $pics . '">';
}
// SEND EMAIL W/ ATTACHMENT OF LATEST IMAGE
$mail = new PHPMailer();
$mail->Sender = "hello@myemail.com";
$mail->From = "mail@myemail.com";
$mail->FromName = "My Company";
$mail->AddReplyTo( "mail@mycompany.com", "DO NOT REPLY" );
//$mail->AddAddress("info@mycompany.com");
$mail->AddAddress("myemail@gmail.com");
$mail->isHTML(true);
$mail->Subject = "Latest Sketch Image";
$mail->Body = "Latest Image Attached! \n\n Thanks - XYZ Digital.";
$mail->AddAttachment($pics);
if(!$mail->Send()) {
echo 'Email Failed To Send.';
}
else {
echo 'Email Was Successfully Sent.';
echo "</p>";
echo '<script language="javascript">';
echo 'alert("Thanks! Message Sent")';
echo '</script>';
}
$mail->ClearAddresses();
?>
本期: AddAttachment($filepath) return 是一个附件,但它不是最新的——我需要它总是 return 目录中的最新图像。
这是我正在做的事情: 我创建了一个 Web 应用程序,它基本上是一个画板。当用户点击 "Save" 时,代码会捕捉元素的图片,将其保存到目录中,然后将电子邮件发送到预定义的地址,并将 canvas 的快照作为附件...问题在上面。
我做了什么: 我到处寻找解决方案——似乎唯一的发现是通过网络表单上传附件——这不是我的问题。我的工作流程不同,为什么我现在在这里问。 :)
什么不起作用: 除附件部分外,一切正常。我正在使用 PHPMailer,但由于某种原因,附件从来都不是最新的。其实怎么看都是一样的执着。
我试图获取数组中的第一个元素来执行此操作(我在代码底部回显了它 return 正确的图像:
$mail->addAttachment($sketches[0]);
这不起作用 -- 它发送了电子邮件,但没有附加任何内容。
我怎么能调整下面的代码来获取最新的附件呢?感谢任何帮助,因为 PHP 不是我的专业领域。
查看下面的代码...
<?php // NEW
// DEFINE ERRORS
ini_set('display_errors',1);
ini_set('display_startup_errors',1);
error_reporting(-1);
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'PHPMailer2020/src/Exception.php';
require 'PHPMailer2020/src/PHPMailer.php';
// GET LATEST UPLOAD -- AND HAVE IT STORED IN DOM (WHEN NEEDED)
$path = ('sketch-drawings');
// Sort in descending order
$sketches = scandir($path, 1);
$latest_ctime = 1;
$latest_filename = '';
$d = dir($path);
while (false !== ($entry = $d->read())) {
$filepath = "{$path}/{$entry}";
// could do also other checks than just checking whether the entry is a file
if (is_file($filepath) && filectime($filepath) > $latest_ctime) {
$latest_ctime = filectime($filepath);
$latest_filename = $entry;
}
// SEND EMAIL W/ ATTACHMENT OF LATEST IMAGE
$mail = new PHPMailer();
$mail->Sender = "hello@myemail.com";
$mail->From = "mail@myemail.com";
$mail->FromName = "My Company";
$mail->AddReplyTo( "mail@myemail.com", "DO NOT REPLY" );
//$mail->AddAddress("info@myemail.com");
$mail->AddAddress("myemail@gmail.com");
$mail->isHTML(true);
$mail->Subject = "Latest Sketch Image";
$mail->Body = "Latest Image Attached! \n\n Thanks - XYZ Digital.";
$mail->AddAttachment($filepath);
//$mail->addAttachment($sketches);
if(!$mail->Send()) {
echo 'Email Failed To Send.';
} else {
echo $filepath;
echo "<br><br>";
print $latest_filename;
echo "</p>";
echo "<p>";
print $sketches[0];
echo "</p>";
echo "<p>";
echo 'Email Was Successfully Sent.';
echo "</p>";
echo '<script language="javascript">';
echo 'alert("Thanks! Message Sent")';
echo '</script>';
}
$mail1->ClearAddresses();
}
?>
PHP 的 dir()
函数 returns indeterminate order. If you want to retrieve files ordered by date, see this answer 中的项目。