文件未通过 cron 作业发送(PHP 脚本)
File not sending via cron job (PHP script)
我正在尝试创建一个每天发送一次带有文件附件的电子邮件的 cron 作业。
我正在使用一个简单的 PHP 脚本来测试它 当我转到 URL 和 运行 它时它工作正常.但是,当 运行 通过 cron 作业启用它时,将发送电子邮件而不是文件附件。
这是我的 PHP 脚本
请注意我已经更改了信息以保护我的客户,所以我使用真实的电子邮件,而不是 test@example.com
只是为了让您不会认为这就是它不起作用的原因。
<?php
// Recipient
$to = 'test@example.com';
// Sender
$from = 'noreply@example.com';
$fromName = 'Server';
// Email subject
$subject = 'Test Subject';
// Attachment file
$file = "../test/file.csv";
// Email body content
$htmlContent = '
<h3>Test Email</h3>
<p>Please find the attached file.</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);
?>
提前致谢。
如果您发布 CRON 命令会很有用,但我猜它的开头类似于:
php path/to/your/script.php
如果是这样,我认为问题出在这一行:
$file = "../test/file.csv";
文件路径是相对路径。可能 CRON 不在脚本所在的目录中运行,因此它试图从其当前工作目录上方的目录中查找该文件,但该目录不存在。
选项 1:将路径更改为绝对路径。
选项 2:如果您的 PHP 脚本存在于 Web 目录中,您可以将 CRON 命令更改为使用 WGET,例如
wget -O /dev/null -o /dev/null 'https://example.com/yourScript.php'
我正在尝试创建一个每天发送一次带有文件附件的电子邮件的 cron 作业。
我正在使用一个简单的 PHP 脚本来测试它 当我转到 URL 和 运行 它时它工作正常.但是,当 运行 通过 cron 作业启用它时,将发送电子邮件而不是文件附件。
这是我的 PHP 脚本
请注意我已经更改了信息以保护我的客户,所以我使用真实的电子邮件,而不是 test@example.com
只是为了让您不会认为这就是它不起作用的原因。
<?php
// Recipient
$to = 'test@example.com';
// Sender
$from = 'noreply@example.com';
$fromName = 'Server';
// Email subject
$subject = 'Test Subject';
// Attachment file
$file = "../test/file.csv";
// Email body content
$htmlContent = '
<h3>Test Email</h3>
<p>Please find the attached file.</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);
?>
提前致谢。
如果您发布 CRON 命令会很有用,但我猜它的开头类似于:
php path/to/your/script.php
如果是这样,我认为问题出在这一行:
$file = "../test/file.csv";
文件路径是相对路径。可能 CRON 不在脚本所在的目录中运行,因此它试图从其当前工作目录上方的目录中查找该文件,但该目录不存在。
选项 1:将路径更改为绝对路径。
选项 2:如果您的 PHP 脚本存在于 Web 目录中,您可以将 CRON 命令更改为使用 WGET,例如
wget -O /dev/null -o /dev/null 'https://example.com/yourScript.php'