电子邮件没有保存到mysql

时间:2012-01-09 05:28:10

标签: php mysql email insert

嗨,我想知道是否有人可以查看我的代码,看看有什么错误,因为我看不到任何错误。发生的事情是它没有保存我发送给mysql的电子邮件,而是我收到了退回的电子邮件。

当我运行PHP测试以查看它是否保存到mysql表时,它没有。

我已经取出了连接代码,因为它有我的用户名和密码。

#!/usr/bin/php -q
<?php
mysql_connect("123.123.123.2", "abc_ard", "5555") or die(mysql_error());
mysql_select_db("55_servermail") or die(mysql_error());

chdir(dirname(__FILE__));
$fd = fopen("php://stdin", "r");
$email = "";
while (!feof($fd)) {
    $email .= fread($fd, 1024);
}
fclose($fd);

if(strlen($email)<1) {
    die(); 
}

// handle email
$lines = explode("\n", $email);

// empty vars
$from = "";
$to="";
$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;
    }
}


mysql_query("INSERT INTO mail
(`to`,`from`,`header`,`subject`,`msg`,`original`)
VALUES
('{$to}','{$from}', '{$headers}','{$subject}','{$message}','{$email}')") or die(mysql_error());;


?>

2 个答案:

答案 0 :(得分:0)

我在当前代码中可能看到的唯一错误是输入像撇号(')这样的字符的可能性请验证如果您希望它包含在邮件正文或其他字段中,请确保使用反斜杠( )例如(\')以便mysql将其分析为charater而不是关闭撇号,但确实有一个安全措施来避免sql注入。 :)

答案 1 :(得分:0)

向mysql添加信息时,您必须考虑mysql和PHP使用的字符并解决它们,因为它们可能导致代码失败,甚至允许人们在您的网站上插入和/或执行代码。我使用的最简单的方法是让PHP“转义”字符,以允许它们正确插入到mysql中,如下所示:

$email = "This isn't my first time 'round here"; 

这应该按原样插入,但是假设你的SQL是这样的:

$query = "INSERT INTO table (timestamp,email) VALUES (time(),'$email')";

MySQL查询中的单引号将被数据中的单引号加载。为了避免这种情况,请将您的电子邮件变量设置为转义:

$email = "This isn't my first time 'round here"; 
$email = mysql_escape_string($email);

使用它的caviat是现在你的数据库在你的数据中有额外的转义字符(通常是反斜杠“/”),所以当你想从数据库中使用它们时你必须删除它们并且PHP有一个方便正是为此起作用:

    $query = "SELECT * FROM table WHERE id='the id you want'"; 
    $result = mysql_query($query) or die(mysql_error());
    while ($data = mysql_fetch_array($result)) {
        $email = stripslashes($data['email']);
    }

    echo "This is your email text from the database: <br>\n".$email."<br>\n";

希望这有助于澄清一种可能的解决方案(如果这确实是电子邮件未按预期插入数据库的原因)。