将电子邮件传送到解析器脚本时获取 "Error in argument 1, char 3: option not found"
Getting an "Error in argument 1, char 3: option not found" when piping emails to a parser script
当我尝试发送符合条件的电子邮件以将电子邮件传送到我的 php 脚本时,我遇到了错误。错误是:
pipe to |/home/**********/**********/script.php
generated by f1c8f287-02ea81a3-11a218b30839@**********.com
The following text was generated during the delivery attempt:
------ pipe to |/home/**********/**********/script.php
generated by f1c8f287-02ea81a3-11a218b30839@*********.com ------
Error in argument 1, char 3: option not found
Usage: php-cgi [-q] [-h] [-s] [-v] [-i] [-f <file>]
php-cgi <file> [args...]
-a Run interactively
-b <address:port>|<port> Bind Path for external FASTCGI Server mode
-C Do not chdir to the script's directory
-c <path>|<file> Look for php.ini file in this directory
-n No php.ini file will be used
-d foo[=bar] Define INI entry foo with value 'bar'
-e Generate extended information for debugger/profiler
-f <file> Parse <file>. Implies `-q'
-h This help
-i PHP information
-l Syntax check only (lint)
-m Show compiled in modules
-q Quiet-mode. Suppress HTTP Header output.
-s Display colour syntax highlighted source.
-v Version number
-w Display source with stripped comments and whitespace.
-z <file> Load Zend extension <file>.
-T <count> Measure execution time of script repeated <count> times.
Reporting-MTA: dns; srv28.hostserv.com
Action: failed
Final-Recipient: rfc822;|/home/**********/**********/script.php
Status: 5.0.0
我不想让这个问题不必要地冗长...
这是我的完整 script.php 代码以防万一:
#!/usr/bin/php -q
<?php
// config
$dbHost = "********";
$dbUser = "********";
$dbPass = "********";
$dbName = "********";
//$conn = mysqli_connect($dbHost, $dbUser, $dbPass, $dbName) or die(mysqli_error($conn));
$notify= 'admin@*********.com'; // an email address required in case of errors
function mailRead($iKlimit = "")
{
// Purpose:
// Reads piped mail from STDIN
//
// Arguments:
// $iKlimit (integer, optional): specifies after how many kilobytes reading of mail should stop
// Defaults to 1024k if no value is specified
// A value of -1 will cause reading to continue until the entire message has been read
//
// Return value:
// A string containing the entire email, headers, body and all.
// Variable perparation
// Set default limit of 1024k if no limit has been specified
if ($iKlimit == "") {
$iKlimit = 1024;
}
// Error strings
$sErrorSTDINFail = "Error - failed to read mail from STDIN!";
// Attempt to connect to STDIN
$fp = fopen("php://stdin", "r");
// Failed to connect to STDIN? (shouldn't really happen)
if (!$fp) {
echo $sErrorSTDINFail;
exit();
}
// Create empty string for storing message
$sEmail = "";
// Read message up until limit (if any)
if ($iKlimit == -1) {
while (!feof($fp)) {
$sEmail .= fread($fp, 1024);
}
} else {
while (!feof($fp) && $i_limit < $iKlimit) {
$sEmail .= fread($fp, 1024);
$i_limit++;
}
}
// Close connection to STDIN
fclose($fp);
// Return message
return $sEmail;
}
// call function
$email = mailRead();
// handle email
$lines = explode("\n", $email);
// empty vars
$from = "";
$subject = "";
$headers = "";
$message = "";
$splittingheaders = true;
for ($i=0; $i < count($lines); $i++) {
if ($splittingheaders) {
// this is a header
$headers .= $lines[$i]."\n";
// look out for special headers
if (preg_match("/^Subject: (.*)/", $lines[$i], $matches)) {
$subject = $matches[1];
}
if (preg_match("/^From: (.*)/", $lines[$i], $matches)) {
$from = $matches[1];
}
if (preg_match("/^To: (.*)/", $lines[$i], $matches)) {
$to = $matches[1];
}
} else {
// not a header, but message
$message .= $lines[$i]."\n";
}
if (trim($lines[$i])=="") {
// empty line, header section has ended
$splittingheaders = false;
}
}
if ($conn = mysqli_connect($dbHost,$dbUser,$dbPass)) {
if(!mysqli_select_db($dbName,$conn))
mail($email,'Email Logger Error',"There was an error selecting the email logger database.\n\n".mysqli_error());
$from = mysqli_real_escape_string($from);
$to = mysqli_real_escape_string($to);
$subject = mysqli_real_escape_string($subject);
$headers = mysqli_real_escape_string($headers);
$message = mysqli_real_escape_string($message);
$email = mysqli_real_escape_string($email);
$result = mysqli_query("INSERT INTO email_log (`to`,`from`,`subject`,`headers`,`message`,`source`) VALUES('$to','$from','$subject','$headers','$message','$email')");
if (mysqli_affected_rows() == 0)
mail($notify,'Email Logger Error',"There was an error inserting into the email logger database.\n\n".mysqli_error());
} else {
mail($notify,'Email Logger Error',"There was an error connecting the email logger database.\n\n".mysqli_error());
}
?>
我遵守了这些规则,它们正在检查中:
文件权限(及其目录)设置为 0755
通过 cPanel 上传。该文件应该是 ascii 格式而不是二进制格式(我不知道如何检查)
没有whitespaces/newlinesbefore/afterphp标签和hashbang
我查看并尝试了这些问题的答案,这些问题很相似,但没有解决我遇到的错误:
PHP email piping error
Email Piping - working but emails return errors
来自 cPanel 论坛和其他资源。
此问题的解决方案是确保为 Unix 保存脚本的行尾。如果您使用的是 Windows,请检查您的文本编辑器用于保存行尾的默认设置。相关问题证明对处理此问题很有用,
对于 Sublime Text 3,我只是更改了行尾格式(菜单 > 视图 > 行尾 > Unix)并保存了文件。电子邮件解析器现在可以正常工作。
这个出色的解决方案归功于 Triplee。对于未来的读者,一般故障排除论坛提到无关的回车 returns 但没有任何关于将文本格式化为 Unix 行结尾的内容,以防您是 Windows 用户。
当我尝试发送符合条件的电子邮件以将电子邮件传送到我的 php 脚本时,我遇到了错误。错误是:
pipe to |/home/**********/**********/script.php
generated by f1c8f287-02ea81a3-11a218b30839@**********.com
The following text was generated during the delivery attempt:
------ pipe to |/home/**********/**********/script.php
generated by f1c8f287-02ea81a3-11a218b30839@*********.com ------
Error in argument 1, char 3: option not found
Usage: php-cgi [-q] [-h] [-s] [-v] [-i] [-f <file>]
php-cgi <file> [args...]
-a Run interactively
-b <address:port>|<port> Bind Path for external FASTCGI Server mode
-C Do not chdir to the script's directory
-c <path>|<file> Look for php.ini file in this directory
-n No php.ini file will be used
-d foo[=bar] Define INI entry foo with value 'bar'
-e Generate extended information for debugger/profiler
-f <file> Parse <file>. Implies `-q'
-h This help
-i PHP information
-l Syntax check only (lint)
-m Show compiled in modules
-q Quiet-mode. Suppress HTTP Header output.
-s Display colour syntax highlighted source.
-v Version number
-w Display source with stripped comments and whitespace.
-z <file> Load Zend extension <file>.
-T <count> Measure execution time of script repeated <count> times.
Reporting-MTA: dns; srv28.hostserv.com
Action: failed
Final-Recipient: rfc822;|/home/**********/**********/script.php
Status: 5.0.0
我不想让这个问题不必要地冗长...
这是我的完整 script.php 代码以防万一:
#!/usr/bin/php -q
<?php
// config
$dbHost = "********";
$dbUser = "********";
$dbPass = "********";
$dbName = "********";
//$conn = mysqli_connect($dbHost, $dbUser, $dbPass, $dbName) or die(mysqli_error($conn));
$notify= 'admin@*********.com'; // an email address required in case of errors
function mailRead($iKlimit = "")
{
// Purpose:
// Reads piped mail from STDIN
//
// Arguments:
// $iKlimit (integer, optional): specifies after how many kilobytes reading of mail should stop
// Defaults to 1024k if no value is specified
// A value of -1 will cause reading to continue until the entire message has been read
//
// Return value:
// A string containing the entire email, headers, body and all.
// Variable perparation
// Set default limit of 1024k if no limit has been specified
if ($iKlimit == "") {
$iKlimit = 1024;
}
// Error strings
$sErrorSTDINFail = "Error - failed to read mail from STDIN!";
// Attempt to connect to STDIN
$fp = fopen("php://stdin", "r");
// Failed to connect to STDIN? (shouldn't really happen)
if (!$fp) {
echo $sErrorSTDINFail;
exit();
}
// Create empty string for storing message
$sEmail = "";
// Read message up until limit (if any)
if ($iKlimit == -1) {
while (!feof($fp)) {
$sEmail .= fread($fp, 1024);
}
} else {
while (!feof($fp) && $i_limit < $iKlimit) {
$sEmail .= fread($fp, 1024);
$i_limit++;
}
}
// Close connection to STDIN
fclose($fp);
// Return message
return $sEmail;
}
// call function
$email = mailRead();
// handle email
$lines = explode("\n", $email);
// empty vars
$from = "";
$subject = "";
$headers = "";
$message = "";
$splittingheaders = true;
for ($i=0; $i < count($lines); $i++) {
if ($splittingheaders) {
// this is a header
$headers .= $lines[$i]."\n";
// look out for special headers
if (preg_match("/^Subject: (.*)/", $lines[$i], $matches)) {
$subject = $matches[1];
}
if (preg_match("/^From: (.*)/", $lines[$i], $matches)) {
$from = $matches[1];
}
if (preg_match("/^To: (.*)/", $lines[$i], $matches)) {
$to = $matches[1];
}
} else {
// not a header, but message
$message .= $lines[$i]."\n";
}
if (trim($lines[$i])=="") {
// empty line, header section has ended
$splittingheaders = false;
}
}
if ($conn = mysqli_connect($dbHost,$dbUser,$dbPass)) {
if(!mysqli_select_db($dbName,$conn))
mail($email,'Email Logger Error',"There was an error selecting the email logger database.\n\n".mysqli_error());
$from = mysqli_real_escape_string($from);
$to = mysqli_real_escape_string($to);
$subject = mysqli_real_escape_string($subject);
$headers = mysqli_real_escape_string($headers);
$message = mysqli_real_escape_string($message);
$email = mysqli_real_escape_string($email);
$result = mysqli_query("INSERT INTO email_log (`to`,`from`,`subject`,`headers`,`message`,`source`) VALUES('$to','$from','$subject','$headers','$message','$email')");
if (mysqli_affected_rows() == 0)
mail($notify,'Email Logger Error',"There was an error inserting into the email logger database.\n\n".mysqli_error());
} else {
mail($notify,'Email Logger Error',"There was an error connecting the email logger database.\n\n".mysqli_error());
}
?>
我遵守了这些规则,它们正在检查中:
文件权限(及其目录)设置为 0755
通过 cPanel 上传。该文件应该是 ascii 格式而不是二进制格式(我不知道如何检查)
没有whitespaces/newlinesbefore/afterphp标签和hashbang
我查看并尝试了这些问题的答案,这些问题很相似,但没有解决我遇到的错误:
PHP email piping error
Email Piping - working but emails return errors
来自 cPanel 论坛和其他资源。
此问题的解决方案是确保为 Unix 保存脚本的行尾。如果您使用的是 Windows,请检查您的文本编辑器用于保存行尾的默认设置。相关问题证明对处理此问题很有用,
对于 Sublime Text 3,我只是更改了行尾格式(菜单 > 视图 > 行尾 > Unix)并保存了文件。电子邮件解析器现在可以正常工作。
这个出色的解决方案归功于 Triplee。对于未来的读者,一般故障排除论坛提到无关的回车 returns 但没有任何关于将文本格式化为 Unix 行结尾的内容,以防您是 Windows 用户。