使用phpmailer将smtp添加到php邮件功能

时间:2015-06-08 21:36:00

标签: php smtp phpmailer

我试图使用phpmailer添加smtp身份验证。我是php的新手,我正在努力实现这一目标。 我有这个代码:

<?php
if( isset($_POST['name']) )
{
    $to = $_POST['budget'].',test@test.ro';
    $subject = 'Programare servicii'; 
    $message = 'Nume: ' . $_POST['name'] . "\n" .
                         'Prenume: ' . $_POST['company']. "\n" .
                         'E-mail: ' . $_POST['email']. "\n" .
                         'Telefon: ' . $_POST['phone']. "\n\n" .
                         'Doresc: ' . $_POST['interested']. "\n" .
                         'Magazin: ' . $_POST['budget']. "\n" .
                         'Incepand cu: ' . $_POST['start']. "\n" .
                         'Pana la: ' . $_POST['finish']. "\n" .
                         'Observatii: ' . $_POST['comment']. "\n\n\n";



  $num = md5(time());
  $headers = 'From:' . $_POST['name'] . "\r\n";
  $headers .= 'Reply-To:' . $_POST['email'] . "\r\n";
  $headers .= "MIME-Version: 1.0\r\n";
  $headers .= "Content-Type: multipart/mixed; ";
  $headers .= "boundary=$num\r\n";
  $headers .= "--$num\r\n";$headers .= "Content-Type: text/plain\r\n";
  $headers .= "Content-Transfer-Encoding:8bit\r\n\n";
  $headers .= "$message\r\n";
  $headers .= "--$num\r\n";

    if( isset($_FILES['file']['tmp_name']) )
    {

        $file = fopen($_FILES['file']['tmp_name'], 'r');
      $size = $_FILES['file']['size'];
      $content = fread($file, $size);
      $encoded_content = chunk_split(base64_encode($content));      

        $headers .= "Content-Type: ". $_FILES['file']['type'] ."; ";
        $headers .= 'name="' . $_FILES['file']['name'] . '"' . "\r\n";
        $headers .= "Content-Transfer-Encoding: base64\r\n";
        $headers .= "Content-Disposition: attachment; ";
        $headers .= 'filename="' . $_FILES['file']['name'] . '"' . "\r\n\n";
        $headers .= "$encoded_content\r\n";
        $headers .= "--$num--";
    }
    mail($to, $subject, '', $headers);
}
?>

id如何添加身份验证?有任何想法吗?我阅读了phpmailer示例,我能够使用phpmailer发送经过身份验证的电子邮件。问题是我无法获得上面的代码来使用smtp身份验证。我的表单中有一个下拉列表,用户可以从中选择商店,脚本将向该商店发送电子邮件。当我将$ _POST [&#39; email&#39;]添加到$ mail-&gt; addAddress时,没有任何反应。 谢谢你的时间,

的Bogdan

更新1: 我想这样做:

<?php
require 'PHPMailerAutoload.php';
$mail = new PHPMailer;
$mail->isSMTP();                               
$mail->Host = 'localhost';  
$mail->SMTPAuth = true;                          
$mail->Username = 'test@test.ro';           
$mail->Password = 'pass';     
$mail->SMTPSecure = 'tls';  
$mail->Port = 587;           
$mail->From = $_POST['email'];
$mail->FromName = $_POST['name'];
$mail->addAddress('need to get data from form', 'iohan test');   
$mail->addReplyTo('test@test.ro', 'Information');
$mail->addCC('test@test.ro');
$mail->isHTML(true);                                
$mail->Subject = 'test iohan';
$mail->Body    = 'bla bla bla';
$mail->AltBody = 'bla bla';

if(!$mail->send()) {
    echo 'Message could not be sent.';
    echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
    echo 'Message has been sent';
}

问题是如何使其发挥作用。我有一个包含多封电子邮件的下拉菜单,我需要向用户选择的电子邮件发送电子邮件。

1 个答案:

答案 0 :(得分:1)

这里有一个非常简单的问题。您没有使用PHPMailer;您正在使用PHP的mail()功能,这根本不是同一个功能,并且不支持身份验证,因为它不使用SMTP。我真的建议你不要自己尝试这样做;让PHPMailer为你做。自述文件中的示例应足以让您前进。

您不需要使用标题,创建邮件正文,编码附件等所有内容。您的代码也容易受到标头注入攻击,并且标头编码可能不正确。您还没有安全地处理文件上传 - 请阅读上面的PHP文档,或者查看“发送文件上传文件”。 PHPMailer提供的示例。

假设您的表单看起来像这样(您不应该直接从表单中获取目标电子邮件,因为它会将其作为垃圾邮件网关滥用):

<select name="to">
    <option value="0">sales@example.com</option>
    <option value="1" selected>support@example.com</option>
    <option value="2">billing@example.com</option>
</select>

您可以像这样处理:

$to = [
    0 => 'sales@example.com',
    1 => 'support@example.com',
    2 => 'billing@example.com',
];
$mail->addAddress($to[$_POST['to']]);

虽然你也应该做一些验证。

在您发布的代码中,您使用表单中的数据设置$mail->From - 您不应该这样做,因为它会导致邮件无法通过SPF检查;使用固定的地址并将发件人的地址粘贴到回复中。