【问题标题】:swiftmailer and email form with attachment - beginner带有附件的 swiftmailer 和电子邮件表单 - 初学者
【发布时间】:2012-07-03 22:06:57
【问题描述】:

和往常一样,这里是我学到很多东西的地方。我现在有新东西要学:

我有一个 html 表单:

<tr><td width="16%">File attachment</td><td width="2%">:</td><td><input type="file" name="fileatt" /></td></tr>

还有一个mail.php:

$attachfile=$_POST["fileatt"];

以及用于发送电子邮件的正确 swiftmailer 代码;

我在谷歌上搜索过,我发现了很多示例如何使用存储在网站上的文件发送附件,但我想即时进行。因此,当您提交按钮时,它会将其发送给人们,而不是上传文件。

// Create the Transport
$transport = Swift_SmtpTransport::newInstance('mail.server.co.uk', 25)
->setUsername('user')
->setPassword('pass')
;

// Create the Mailer using your created Transport
$mailer = Swift_Mailer::newInstance($transport);

// Create a message
$message = Swift_Message::newInstance($subject)
  ->setFrom(array('emai@emai.com' => 'name'))

   ->setBody($html, 'text/html')
  ;
// Add alternative parts with addPart()
$message->addPart(strip_tags($html), 'text/plain');

// Send the message
$result = $mailer->send($message);

谁能帮助我如何进行动态文件上传,好吗?提前谢谢!!!

【问题讨论】:

    标签: php swiftmailer


    【解决方案1】:

    有一个简单的方法可以做到这一点,你去吧:

    $message->attach(
    Swift_Attachment::fromPath('/path/to/image.jpg')->setFilename('myfilename.jpg')
    );
    

    这是 SwiftMail 可以做到这一点的一种方式,现在只是 /tmp 文件,并将上面的内容转换为以下内容:

    假设:fileatt 是 $_FILE 的变量,['tmp_name'] 实际上是 PHP 从表单上传创建的 tmp 文件。

    $message->attach(
    Swift_Attachment::fromPath($_FILES['fileatt']['tmp_name'])->setFilename($_FILES['fileatt']['name'])
    );
    

    有关 SwiftMail 附件的更多信息,请访问此 docs 页面

    关于 $_FILES 的更多信息可以在 w3schools 上找到,尽管我不喜欢 w3schools,但这个页面是可靠的。

    【讨论】:

    • 我正在使用 Swiftmailer 发送附件,但是当我尝试提交不带附件的表单时,我收到了 Swift_IoException: The path cannot be empty 错误。如何使用 SwiftMailer 允许附件是可选的?
    • 有没有办法从文件上传打开器一次添加一个附件?
    【解决方案2】:

    另一种方法是:仅使用一个变量作为路径和文件名:

    $message->attach(Swift_Attachment::fromPath('full-path-with-attachment-name'));
    

    【讨论】:

      【解决方案3】:

      单个附件

      我的回答与 André Catita 的回答类似。但是,在 Laravel 6 中,您可以使用 $request 代替 $_FILES。让我简化一下上面的代码:

      $path = $request->file('import')->getPathName();
      $fileName = $request->file('import')->getClientOriginalName();      
      
      $message->attach(
              Swift_Attachment::fromPath($path)->setFilename($fileName)
              );
      

      这里我假设你的文件标签的名字是import。例如:&lt;input type="file" name="import" /&gt;

      多个附件

      现在,假设您需要多个附件,而不是单个附件。然后需要更改代码。

      首先您的 html 代码将变为:&lt;input type="file" name="import[]" multiple /&gt;

      对于后端或 laravel;代码将是:

      $files = $request->file('import');
      foreach($files as $file){
      
              $path = $file->getPathName();
              $fileName = $file->getClientOriginalName();      
      
              $message->attach(
                  Swift_Attachment::fromPath($path)->setFilename($fileName)
                  );
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-23
        • 2018-07-24
        • 1970-01-01
        相关资源
        最近更新 更多