发送电子邮件,从邮件头错误()

时间:2013-09-22 16:49:09

标签: php email

我有一个商业系统,可以从添加它们的代理商那里向客户发送电子邮件。

添加新代理后,会自动创建agent@domain.com。所以我希望我的电子邮件来自CompanyName - 代理邮件。这就是我试图解决的问题:

$headers = "From:".$companyname." ".$Agentmail."\r\n";
$headers =  "Reply-To:".$Agentmail."\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";

但是,我收到来自“user”(user @ servername)的电子邮件,而reply-to是正确的,如上所列。如果我删除了reply-to,它的工作完美,收件箱中的电子邮件将显示为来自CompanyName,并且在打开时,它将是CompanyName(Agentmail),但是,此类电子邮件不会被发送到@hotmail地址这是一个很大的问题。

在你建议我完全将我的邮件方法切换到PHPMailer的方法之前,请考虑我在下面发送电子邮件的方式,它可能不符合你的建议。谢谢!

完整的电子邮件代码:

ob_start();
include("./email/mailtemplate.php");
$message = ob_get_clean();
$body = strtr($content, $replaceWord);
$headers = "From:".$companyname." ".$Agentmail."\r\n";
$headers =  "Reply-To:".$Agentmail."\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
mail($email, $subject, $message, $headers);

我在mailtemplate.php中回显$body,因为它需要一些解析等.Mailtemplate.php只是html电子邮件模板。

由于

1 个答案:

答案 0 :(得分:0)

好的,正如所承诺的,这是一种通过使用PHPMailer来避免错误的方法。如果您不知道PHPMAiler是否适合您,相信我有同样的问题,但它非常容易使用。

这是代码

    $mail = new PHPMailer;
    $mail->isSMTP();
    $mail->Host = "localhost"; 
    $mail->SMTPAuth = true;                             
    $mail->Username = $Agentmail;                         
    $mail->Password = $smptpass;
    $mail->From = $Agentmail;
    $mail->FromName = $companyname;
    $mail->addAddress($email, $CustomerFullName);
    $mail->addReplyTo($Agentmail, $fullname);
    $mail->isHTML(true);
    $mail->Subject = $subject;
    $mail->Body    = $body;
    $mail->altBody = $altBody;
    if(!$mail->send()) {
    header("location:errorpage.php");
    }

好的,所以这些都是变数。它完美无缺。有一件事,如果你正在制作一个商业系统,并且你担心将密码以纯文本形式存储在数据库中,那么你也没有!在存储它们之前加密它们并在将它们用于PHP Mailer之前解密它们。

对于上面的代码,我首先解密密码:

 $cipher = new Cipher('encrypt');
 $smptpass = $cipher->decrypt($cipheredpass);

为此,PHPMailer工作,您需要两个文件:

require_once "./PHPMailer/class.phpmailer.php";
require_once "functions.php";

PHPMailer存储在与我同名的文件夹中,因此请将路径更改为您放置的位置。至于functions.php,这里是如何处理加密/解密:

<?php
class Cipher {
    private $securekey;
    function __construct($textkey) {
        $this->securekey = md5($_SERVER['SERVER_ADDR']);
    }
    function encrypt($input) {
        return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->securekey, $input, MCRYPT_MODE_ECB));
    }
    function decrypt($input) {
        return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->securekey, base64_decode($input), MCRYPT_MODE_ECB));
    }
}
?>

正如您所看到的,我正在使用$_SERVER来获取环境变量,因为系统将托管在各种计算机上,所以我需要一些始终存在的东西。在那之后,我md5()它,只是为了额外的安全性。你可以把任何你想要的东西作为你的钥匙,这无所谓,我试图避免在多个系统上使用相同的密钥。您无需将密钥存储在任何位置。如果你有这样的functions.php文件,这里是如何进一步使用它:

$cipher = new Cipher('encrypt'); 
$variable = $cipher->encrypt($input); // For encrypting

$cipher = new Cipher('decrypt');
$variable = $cipher->decrypt($input); // For decrypting