包含空格的PHP变量导致电子邮件失败

时间:2014-01-10 21:59:55

标签: php email character-encoding

我正在尝试使用PHP邮件功能发送电子邮件,但是当它实际发送电子邮件时我遇到了问题。

由于某种原因,$to变量在每个字符之间有一个空格。因此,当它通过电子邮件发送时,空间就会被填充点。正在从我无法控制的远程系统生成的TSV文件中抓取$to电子邮件。

我已经看到人们有一条线在哪里搜索空白并删除它但我不想去那条路线。

CC功能完美运行。

有谁知道可能会发生什么?我已经看到了几个线程和错误,但它们并不完全匹配。

 <?php
 $Name= $_POST["Name"];
 //File Upload Script
 if ($_FILES["file"]["error"] > 0)
 {
 }
 else
 {
  echo "File name: " . $_FILES["file"]["name"] . "<br>";
  echo "Type: " . $_FILES["file"]["type"] . "<br>";
  echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
  echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";

move_uploaded_file($_FILES["file"]["tmp_name"], "C:/xampp/htdocs/Uploads/" . $_FILES["file"]["name"]);
  echo "http://php/Uploads/" . $_FILES["file"]["name"];
  }
 $URLLink = "C:/xampp/htdocs/Uploads/" . $_FILES["file"]["name"];
 //End File Upload Script

 //Reading TSV File
 $filename = $URLLink;

 //Deleting first line and last 5 lines
 $alines=file($filename);
 $dlines=array_slice($alines,1, -5);
 $fileContents=implode($dlines);
 $fp=fopen($filename,'w+');
 fwrite($fp,$fileContents);
 fclose($fp);  
 //END of Deleting first line and last 5 lines

$filename = $URLLink;
$file     = file($filename);

foreach($file as $line)
{
    list($start_time, $end_time, $instance, $status, $coordinator) = explode(" ", $line);

    $from = $SentFrom;
    $to   = $coordinator;
    $to = str_replace(' ', '', $coordinator);
    //$to = str_replace('.', '', $coordinator);
    $headers  = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
    $headers .= "From:" . $from . "\r\n" . "CC:" . $mailer . "," . $emailone. "," . $emailtwo;
    $subject = "Test";

    include_once("EmailBody.php");

    mail($to, $subject, $message, $headers);
}
?>

之前的页面是一个表单。            

 <head>
 <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
 <title>Impact Notification</title>
  <link rel="stylesheet" href="../style/style.css" type="text/css" media="screen" />
 <link rel="stylesheet" href="../style/menustyle.css" type="text/css" media="screen" />
 <style type="text/css">
 .auto-style1 {
font-family: "Lucida Calligraphy";
 }
</style>
</head>
<body style="color: #black; background-color: #0000FF;">

<div align="center"id="MainWrapper" style="width: 70%">
<div id="container" style="width:100%">

<div id="PageHeader">
<?php include_once("../template/template_header.php");?>
</div>

 <div id="leftcolumn" style="height:auto;width:11%;float:left;padding:15px 15px 15px 15px;">
 <?php include_once("../template/menu.php"); ?>
</div>


<div id="content" style="background-color:#EEEEEE;height:auto;width:80%;float:left;">
<h2 class="auto-style1">Email Notification</h2>
 <form action="sendemail.php" method="post" name="emails" enctype="multipart/form-data">
 <table style="width: 100%">
                    <tr>
                            <td>Enter Your Name</td>
                            <td><input name="Name" type="text" style="width: 300px; height: 24px;" /></td>
        <tr>
            <td style="width: 180px"><strong>File Upload:</strong></td>
            <td><input type="file" name="file" id="file" /></td>
        </tr>
    </table>
    <br />
    <input name="Submit" type="submit" value="Submit" /><input name="Clear" type="reset" value="Reset" /><br />
    <br />
</form>
</div>

</div>
</div>

3 个答案:

答案 0 :(得分:0)

查看文件的十六进制转储,您的数据被编码为UTF-16,对于ASCII数据,每个数据字符之间包含一个nul字符。您可以使用iconv()

进行转换

注意:在尝试提取数据之前,需要在原始文件上运行它。

$str = file_get_contents('2.tsv');
$result = iconv($in_charset = 'UTF-16LE' , $out_charset = 'UTF-8' , $str);
if (false === $result)
{
    throw new Exception('Input string could not be converted.');
}
$result = substr($result, 3);      // Strip BOM
file_put_contents('3.tsv',$result);

echo $result;

或者你可以使用

$str = file_get_contents('2.tsv');
$result = mb_convert_encoding($str, 'ASCII', 'UTF-16LE'); //instead of iconv()
file_put_contents('3.tsv',$result);

我已在我的开发服务器上成功运行。

答案 1 :(得分:0)

修订答案:糟糕的数据处理!

虽然它可能仍然是UTF / Charset问题,但根据您提供的代码和示例数据,您的数据处理不正确。以下是一些提示(已将其纳入我建议的foreach循环中)。

您的文本文件标头包含许多您想要检索的字段。它们在一行中按顺序表示为以下字段,由制表符分隔:

Start Time End Time Instance Type Status Endpoint Organizer ....等

您似乎想要捕获许多这些字段,其中,$ coordinator值需要包含文本文件中列出的管理器字段中的数据(似乎始终是电子邮件地址) :

  1. 查看您的原始tsv文件,您的“列表”处理器正在处理错误的变量,因为您错过了端点字段!即使您不打算使用它,您也需要在其中放置一些东西,以便按照您设置的方式工作。在最好的情况下,你会将端点的值存储为$ coordinator,但我怀疑你不会因为爆炸的方式而变得那么远(参见下面的第2点)。

  2. 您提交的文件似乎被标签分隔,但您正在使用空格进行爆炸。将爆炸中的“”更改为“\ t”。目前,你可能在你的可变数据中得到垃圾(因为它在每行中的每个空格之后分裂) - 组织者的电子邮件地址永远不会成为$ coordinator - 也许你可以回应你的变量作为测试看看我的意思(并在测试时注释掉你的邮件功能)。

  3. 我修改了你的foreach循环:

    foreach($file as $line)
    {
        list($start_time, $end_time, $instance, $status, $endpoint, $coordinator) = explode("\t", $line); 
    
        $from = $SentFrom;
        $to   = $coordinator;
        $headers  = 'MIME-Version: 1.0' . "\r\n";
        $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
        $headers .= "From:" . $from . "\r\n" . "CC:" . $mailer . "," . $emailone. ","  .$emailtwo;
        $subject = "Test";
    
        include_once("EmailBody.php");   // Can' really comment on what's going on here - as I don't know what is in this file ! :)
    
        mail($to, $subject, $message, $headers);
    }
    
  4. 您正在从文件底部剥离5行,从顶部剥离一行,但我看到需要从示例文件的底部删除6行,从顶部删除1行。也许将-5改为-6。或者,您可以在foreach循环中执行类似这样的操作,以指示例程如果$ coordinator变量为“空白”则不发送电子邮件,因此如果它读取空行等则不会失败:

    备用ForEach循环 - 停止文件中的空行导致失败:

    foreach($file as $line)
    {
        list($start_time, $end_time, $instance, $status, $endpoint, $coordinator) = explode("\t", $line); 
        if (trim($coordinator) !== '') 
        {
            $from = $SentFrom;
            $to   = $coordinator;
            $headers  = 'MIME-Version: 1.0' . "\r\n";
            $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
            $headers .= "From:" . $from . "\r\n" . "CC:" . $mailer . "," . $emailone. ","  .$emailtwo;
            $subject = "Test";
    
            include_once("EmailBody.php");   // Can' really comment on what's going on here - as I don't know what is in this file ! :)
    
            mail($to, $subject, $message, $headers);
        }
    }
    
  5. 您似乎正在使用PHP Mail的Windows实现。您当前的消息内容可能没有任何问题 - 请注意,任何以句点/句号开头的行都将被删除。如果您的任何消息行以“。”开头,则可能需要以下内容:

    $vardata = str_replace("\n.", "\n..", $vardata);
    

答案 2 :(得分:0)

您可以使用trim(),仅在字符串的开头和结尾处去除所有种类的空白字符。我认为我还没有看到它的建议。

http://nl1.php.net/trim

  

此函数返回一个字符串,其中从str的开头和结尾剥去了空格。如果没有第二个参数,trim()将删除这些字符:

" " (ASCII 32 (0x20)), an ordinary space.
"\t" (ASCII 9 (0x09)), a tab.
"\n" (ASCII 10 (0x0A)), a new line (line feed).
"\r" (ASCII 13 (0x0D)), a carriage return.
"\0" (ASCII 0 (0x00)), the NUL-byte.
"\x0B" (ASCII 11 (0x0B)), a vertical tab.