【问题标题】:I cannot send pdf attachment with my phpmailer我无法用我的 phpmailer 发送 pdf 附件
【发布时间】:2021-02-26 11:58:10
【问题描述】:

我的 php 邮件程序出现附件问题。所有信息(电子邮件、姓名、pdf_link 等)都是正确的,我可以收到电子邮件,但附件中没有 pdf。

能否请您检查我的代码并告诉我我的错误是什么,希望您能帮助我。

//mailing starts

  $mail = new PHPMailer();

  $mail->isSMTP();
  $mail->Timeout = 20;
  $mail->SMTPDebug = 0;
  //Set the hostname of the mail server
  $mail->Host = 'my-host-information';

  $mail->Port = 465;//587
  $mail->SMTPSecure = 'ssl';//tls
  $mail->SMTPAuth = true;
  $mail->Username = "myemail@mywebsite.com";
  
  $mail->Password = "****";
  //Set who the message is to be sent from
  $mail->setFrom('myemail@mywebsite.com', 'Name here');
  $mail->addAddress($member_email, '');
  $mail->AddAttachment($pdf_link, $name = $image_name, $encoding = 'base64', $type = 'application/pdf');

        $message_it = 'Grazie per il tuo interesse. La tua fattura proforma è stata predisposta e la trovi in allegato. Puoi visualizzarlo sul nostro sistema .<br><br>Cordiali Saluti,<br>My Company';

        $message_en = 'Thanks for your interest. Your proforma invoice has been prepared and you can find it attached. You can view it on our system. <br> <br> Best Regards, <br> My Company ';

        $combined_name_it = 'Caro ' .$member_name.' '. $member_company;
        $combined_email = $email;
        $combined_message_it = $message_it;

        $combined_name_en = 'Dear ' .$member_name.' '. $member_company;
        $combined_email = $email;
        $combined_message_en = $message_en;

  if($email_lang == 'it'){
  $mail->isHTML(true);
      $mail->Subject = 'La tua proforma è pronta ';         // Email subject
      $mail->Body    = "$combined_name_it,$combined_email<br /><br />$combine_message_it";              // Mail Content
    $mail->CharSet = 'utf-8';
  }else{
    $mail->isHTML(true);
        $mail->Subject = 'Your proforma is ready.';         
        $mail->Body    = "$combined_name_en<br />$combined_email<br /><br />$combined_message_en";  
      $mail->CharSet = 'utf-8';
  }


  $result = $mail->send();

  if($result){
    $session = \Config\Services::session();
    $session->setFlashdata('success', 'Proforma updated');
    return redirect()->to($_SERVER['HTTP_REFERER']);
  }else{
      $data['validation'] = $this->validator;
      $data['title'] = 'Proforma Update';
      echo view('admin/assets/header', $data);
      return redirect()->to($_SERVER['HTTP_REFERER']);
      }


  //mailing ends

【问题讨论】:

    标签: php codeigniter email phpmailer


    【解决方案1】:

    我不知道你用的是什么语言,但这是奇怪的 PHP:

    $mail->AddAttachment($pdf_link, $name = $image_name, $encoding = 'base64', $type = 'application/pdf');
    

    尝试将其重写为:

    $mail->addAttachment($pdf_link, $image_name, 'base64', 'application/pdf');
    

    接下来,你不检查那个调用的返回值,所以你不知道它是否成功,所以这样做:

    if (!$mail->addAttachment($pdf_link, $image_name, 'base64', 'application/pdf')) {
        echo 'Attachment failed';
    }
    

    如果确实失败了,您需要找出原因。通常的原因是:

    • 文件不存在
    • 文件路径不正确
    • 您没有读取权限
    • 文件的所有权错误

    您需要检查它是哪一个。

    总体而言,您的代码中几乎没有错误检查或异常处理,所以如果出现问题,它就会中断,您不知道为什么。查看 PHPMailer 提供的示例,并确保您使用的是最新版本。

    【讨论】:

    • 嗯,首先谢谢。我用你的方式改变了我的行,还添加了 if (!$mail->addAttachment ..) 部分,但似乎没有错。我仍然收到电子邮件,但没有附件。该文件存在(我可以在我的文件夹中看到它),路径是正确的(我将它粘贴在正文中并获得了链接),权限是 644..
    • 我也使用了 try - catch 但没有。我没有收到任何错误。
    • 如果您想要异常,您必须通过将true 传递给构造函数来启用它们 - 请参阅文档和示例。使用$mail-&gt;SMTPDebug = 2; 启用调试输出,这样您就可以看到实际发送到服务器的内容。
    • 好吧,当我调试时,引起我注意的是:无法访问文件:my-folder-address-1-proforma.pdf(确实存在)和 2021-02-26 18 :20:51 SERVER -> CLIENT: 220-srv12.my-server-company.net ESMTP Exim 4.93 #2 Fri, date-hour etc 220-我们不授权使用该系统传输未经请求的 220 和/或批量电子邮件。 220 是否意味着我的托管服务提供商不允许我发送附件?
    • 这说明我的第二个建议是正确的:你的文件路径不正确; URL 不是文件路径,无论如何您都不应该使用外部 HTTP 请求来加载本地资源,因为它非常低效且容易出错。
    【解决方案2】:

    解决问题后,我可以说问题是 PhpMailer 期望看到 url 的文件夹部分,而不是基础部分。当我包含包含 http://mywebsites.com 等部分的 base_url() 时,它会继续发送没有附件的电子邮件。但是,当我用文件夹部分替换它时,假设“uploads/invoices/invoice-1.pdf”它起作用了。

    感谢@Synchro

    【讨论】:

    • PHPMailer 的 addAttachment 函数故意不支持使用 URL 来定位文件。 PHPMailer 主动避免成为 HTTP 客户端。如文档所述,该函数需要本地文件路径,而不是 URL。
    猜你喜欢
    • 1970-01-01
    • 2017-12-05
    • 2014-08-14
    • 2023-03-15
    • 1970-01-01
    • 2016-03-30
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    相关资源
    最近更新 更多