PHP脚本将电子邮件文件作为STDIN传递给另一个PHP解析器,导致间歇性错误
我有一个电子邮件脚本,可以解析被退回的电子邮件。现在我已经编写了另一个脚本来读取来自特定用户帐户的所有电子邮件,并将每个电子邮件文件传递给我的解析脚本。它可以处理我传递给解析器的大约50%的电子邮件……另50%的错误就好像STDIN内容被处理为PHP代码或PHP命令一样。我不明白为什么它会这样做: 读取文件并传递给解析器的脚本:PHP脚本将电子邮件文件作为STDIN传递给另一个PHP解析器,导致间歇性错误,php,email,parsing,stdin,Php,Email,Parsing,Stdin,我有一个电子邮件脚本,可以解析被退回的电子邮件。现在我已经编写了另一个脚本来读取来自特定用户帐户的所有电子邮件,并将每个电子邮件文件传递给我的解析脚本。它可以处理我传递给解析器的大约50%的电子邮件……另50%的错误就好像STDIN内容被处理为PHP代码或PHP命令一样。我不明白为什么它会这样做: 读取文件并传递给解析器的脚本: <?php $extScript = "php -f /home/myUser/dev/scripts/email/bouncedEmail.php&q
<?php
$extScript = "php -f /home/myUser/dev/scripts/email/bouncedEmail.php" ;
$dir = "/home/myUser/mail/myDomain.com/register/cur/" ;
$emails = scandir($dir) ;
echo "\n" ;
foreach ($emails as $email) {
if (!preg_match("/^\./", $email) && !preg_match("/^\.\./", $email)) {
echo "Processing: $email\n" ;
$emailContent = file_get_contents($dir.$email) ;
passthru("{$extScript} <<< '{$emailContent}'") ;
}
}
?>
或
然后,我将脚本foreach循环更改为:
foreach ($emails as $email) {
if (!preg_match("/^\./", $email) && !preg_match("/^\.\./", $email)) {
echo "Processing: $email\n" ;
$dirFile = $dir.$email ;
passthru("{$extScript} < {$dirFilel}");
}
}
foreach($email作为$email){
如果(!preg_match(“/^\./”,$email)和(&!preg_match(“/^\.\./”,$email)){
echo“处理:$email\n”;
$dirFile=$dir.$email;
passthru(“{$extScript}<{$dirFilel}”);
}
}
现在,每个文件都会出现以下错误:
sh: -c: line 0: syntax error near unexpected token `newline'
sh: -c: line 0: `php -f /home/myUser/dev/scripts/email/bouncedEmail.php <<< '
sh:-c:第0行:意外标记“newline”附近的语法错误
sh:-c:第0行:`php-f/home/myUser/dev/scripts/email/bouncedmail.php我会在第一个示例中使用base64。你在这里搞乱了shell:
<?php
$extScript = "php -f /home/myUser/dev/scripts/email/bouncedEmail.php" ;
$dir = "/home/myUser/mail/myDomain.com/register/cur/" ;
$emails = scandir($dir) ;
echo "\n" ;
foreach ($emails as $email) {
if (!preg_match("/^\./", $email) && !preg_match("/^\.\./", $email)) {
echo "Processing: $email\n" ;
$emailContent = base64_encode(file_get_contents($dir.$email));
passthru("{$extScript} <<< '{$emailContent}'") ;
}
}
发现我的主脚本(将电子邮件文件传递给解析器脚本的脚本)中有一个打字错误。我一定看了100遍,只有当我试图向特定变量添加代码时,我才看到该变量添加了1
foreach ($emails as $email) {
if (!preg_match("/^\./", $email) && !preg_match("/^\.\./", $email)) {
echo "Processing: $email\n" ;
$dirFile = $dir.$email ;
passthru("{$extScript} < {$dirFilel}");
}
}
foreach($email作为$email){
如果(!preg_match(“/^\./”,$email)和(&!preg_match(“/^\.\./”,$email)){
echo“处理:$email\n”;
$dirFile=$dir.$email;
passthru(“{$extScript}<{$dirFilel}”);
}
}
$dirFile1
是打字错误,删除了1,效果很好
grrrrrrrrrrrrrrrrr 我很兴奋,认为它起作用了。我认为这是有效的,因为没有错误,但是脚本在日志文件中捕获了零到电子邮件地址。通过执行base64\u encode
电子邮件被管道传输到解析器脚本中,但是解析器脚本不再能够将STDIN分解为单独的行。大多数电子邮件大约有200多行长(爆炸后),但当我在foreach循环中计算正在处理的行数时,它只计算两行,然后结束,包装器脚本移动到下一个要处理的文件。您可以这样简单地读取stdin:$lines=base64_decode(stream_get_contents(stdin));并继续使用旧脚本
sh: -c: line 0: syntax error near unexpected token `newline'
sh: -c: line 0: `php -f /home/myUser/dev/scripts/email/bouncedEmail.php <<< '
<?php
$extScript = "php -f /home/myUser/dev/scripts/email/bouncedEmail.php" ;
$dir = "/home/myUser/mail/myDomain.com/register/cur/" ;
$emails = scandir($dir) ;
echo "\n" ;
foreach ($emails as $email) {
if (!preg_match("/^\./", $email) && !preg_match("/^\.\./", $email)) {
echo "Processing: $email\n" ;
$emailContent = base64_encode(file_get_contents($dir.$email));
passthru("{$extScript} <<< '{$emailContent}'") ;
}
}
foreach ($emails as $email) {
if (!preg_match("/^\./", $email) && !preg_match("/^\.\./", $email)) {
echo "Processing: $email\n" ;
$dirFile = $dir.$email ;
passthru("{$extScript} < {$dirFilel}");
}
}