【问题标题】:PHPMailer AddAttachment does not workPHPMailer AddAttachment 不起作用
【发布时间】:2015-06-20 20:28:20
【问题描述】:

所以我有以下内容...发送的邮件没有附件,我似乎找不到原因。任何帮助将不胜感激:)

$mail = new PHPMailer();

$mail->Host     = "localhost"; // SMTP server
$mail->From     = $dwwp_email;
$mail->FromName = "Bla bla title";
$mail->addReplyTo($dwwp_email);
$mail->IsHTML('true');

$mail->Username = "some dorky username";
$mail->Password = "letmeinMan";
$mail->AddAddress($to);

$mail->Subject  = $subject; 
$mail->AddAttachment('../attach/tnc.pdf', 'TnC.pdf');
$mail->Body     = $message;

if (!$mail->Send()) {
    echo 'Message was not sent.';
    echo 'Mailer error: ' . $mail->ErrorInfo;
} else {
    echo 'Message has been sent.';
}

【问题讨论】:

  • 尝试附件的完整路径
  • 不,先生,它不起作用

标签: php phpmailer


【解决方案1】:

我要做的第一件事是检查addAttachment() 的返回值。根据documentation

“如果无法找到或读取文件,则返回 false。”

假设您的文件实际存在于您引用的位置,请检查并确保您(或执行此代码的任何进程)具有读取权限。如上所述,使用完整路径(可能)是个好主意。

此外,这无关紧要,但通常最好的做法是调用函数的大小写与它们在声明中出现的大小写相同。在两种情况下,类声明与您编写它的方式不同(以小写开头):

$mail->addAttachment('/full/path/to/attach/tnc.pdf', 'TnC.pdf');
$mail->addAddress($to);

【讨论】:

  • 我自己说得再好不过了!为同一事物生成的文档是here。案例匹配的事情表明 OP 将他们的代码基于一个旧示例——为了更好地遵守 PSR-2 而改变了各种函数的案例——并且可能也在使用旧版本的 PHPMailer。
【解决方案2】:

这是我为自己写的,对任何类型的依恋都非常有效。

发布参数:

1. from       -- from email id
2. subject    -- subject of email
3. message    -- message content of email
4. secret     -- UPqHPVAA7RV3eGZ1CySqAj1OM1eiurgbh8e7rgbergre87ge9rb
5. filename   -- name of file
6. path       -- path of the file

如果你可以用普通的 PHP 变量替换 post 参数,或者可以通过 POST 调用简单地发布这些参数


以下是我的邮件文件的代码

$result = array();
if(isset($_POST['from']) && isset($_POST['subject']) && isset($_POST['message']) && isset($_POST['secret']) && isset($_POST['filename']) && isset($_POST['path']))
{
    if(isset($_POST['to'])){
            $to = $_POST['to'];
    }else{
            $to = "my_email@live.com"; 
}
$path=$_POST['path'];
$filename=$_POST['filename'];
$file = $path.$filename;

$content = file_get_contents($file);

$content = chunk_split(base64_encode($content));
$uid = md5(uniqid(time()));
$name = basename($file);

$subject = $_POST['subject'];
$message = $_POST['message'];
$secret = "UPqHPVAA7RV3eGZ1CySqAj1OM1eiurgbh8e7rgbergre87ge9rb"; //This is required to use this script. It ensures that only we can use this script.
$from = $_POST['from'];
$headers = "From:" . $from."\r\n";
$headers.="MIME-Version: 1.0\r\n";    
$headers.= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n";
$headers.= "This is a multi-part message in MIME format.\r\n";
$headers.= "--".$uid."\r\n";
$headers.= "Content-type:text/html; charset=ISO-8859-1\r\n";
$headers.= "Content-Transfer-Encoding: 7bit\r\n\r\n";
$headers.= $message."\r\n\r\n";
$headers.= "--".$uid."\r\n";
$headers.= "Content-Type: application/octet-stream; name=\"".$filename."\"\r\n"; // use different content types here
$headers.= "Content-Transfer-Encoding: base64\r\n";
$headers.= "Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n";
$headers.= $content."\r\n\r\n";
$headers.= "--".$uid."--";


if(strlen($_POST['secret'])!=100)
{
    $result['sent'] = FALSE;
    $result['error'] = "whatsmyname";//Malicious Script Use Attempt Thwarted.
    echo json_encode($result);
    exit();
}
if($secret == $_POST['secret'])
{
    if(mail($to,$subject,$message,$headers))
    {
        $result['sent'] = TRUE;
        echo json_encode($result);
        exit();
    }
    else
    {
        $result['sent'] = FALSE;
        $result['error'] = "mailserver";//Mail Server Down.
        echo json_encode($result);
        exit();
    }
}
else
{
    $result['sent'] = FALSE;
    $result['error'] = "whatsmyname";//Malicious Script Use Attempt Thwarted.
    echo json_encode($result);
    exit();
}

}

您可以创建 HTML 格式的消息内容。意味着您可以将图像添加到消息内容,对您的内容进行颜色编码以及您可以使用 html 执行的所有其他操作。 以下是消息正文的示例:

$message='<html>                            
          <body>
            <font size="3">Name : '. $name.' </font><br /><br />
            <font size="3">Email : '. $email.' </font><br /><br />
            <font size="3">Contact Number : '.$phonenumber.' </font><br /><br />
            <font size="3">Registration Date: '.$signupdate.' </font><br /><br />       
            <br />
            Thanks, <br />
        </body>
        </html>';

干杯!!!!

【讨论】:

  • 这是一个典型的例子,说明为什么你不应该滚动自己的电子邮件代码。它容易受到标头注入攻击,不适用于 UTF-8 数据,缺少主题标头,未正确编码标头,从地址伪造(因此将无法通过 SPF 检查),并充当垃圾邮件网关等。使用图书馆。
  • 如果你知道这么多,那么我通过你会足够聪明地接受它。这里的重点是使用一个有效的邮件脚本,而不是指出您可能拥有哪些漏洞。除此之外,如果你正确地完成它,我已经提到了主题标题
  • 为什么您认为建议任何人使用不安全代码是个好主意?编写没有这些问题的代码很困难;图书馆存在,所以你不必。 OP 已经足够聪明,已经想通了。
  • @RiteshKumar - 恕我直言,&lt;font&gt; 标签已被弃用,在 HTML 5 中不受支持,而且 imo 不应在 2015 年使用。
猜你喜欢
  • 2014-02-06
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-23
相关资源
最近更新 更多