PHP Mail() 中的 Base 64 附件不起作用

2024-02-05

我有一个脚本,当函数运行时,它会发送一封自动电子邮件。我希望能够发送 HTML 电子邮件以及 PDF 附件。我知道我需要将文件编码为 Base64,但是我只是将 Base64 代码附加到我的电子邮件底部。我认为这与哑剧有关。有人看到这个问题吗?

    $to = '[email protected] /cdn-cgi/l/email-protection';

    $subject = 'test!';

    $file = file_get_contents("files/CAPS-Standing-Order.pdf");
    $encoded_file = chunk_split(base64_encode($file));

    // message
    $boundary = md5("sanwebe");

    $message = 'Hello';

    // To send HTML mail, the Content-type header must be set
    $headers  = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

    // Additional headers
    $headers .= 'From: CAPS Consortium <[email protected] /cdn-cgi/l/email-protection>' . "\r\n";

    $message .= "--$boundary\r\n";
    $message .="Content-Type: pdf; name=\"CAPS-Standing-Order.pdf\"\r\n";
    $message .="Content-Disposition: attachment; filename=\"CAPS-Standing-Order.pdf\"\r\n";
    $message .="Content-Transfer-Encoding: base64\r\n";
    $message .="X-Attachment-Id: ".rand(1000,99999)."\r\n\r\n";
    $message .= $encoded_file; 

    // Mail it
    mail($to, $subject, $message, $headers);

<?php

$file = file_get_contents("files/CAPS-Standing-Order.pdf");
$encoded_file = chunk_split(base64_encode($file));

$attachments[] = array(
    'name' => 'CAPS-Standing-Order.pdf', // Set File Name
    'data' => $encoded_file, // File Data
    'type' => 'application/pdf', // Type
    'encoding' => 'base64' // Content-Transfer-Encoding
);

$this->sendMail("[email protected] /cdn-cgi/l/email-protection", "Hello", "test!", $attachments); 
// Send the actual mail and include the attachments

我用来发送更干净的邮件的功能

<?php
function sendMail($email = "", $text = "", $subject = "", $attachments = array()) {
    if(!$email || !$text) {
        return false;
    }

    $headers   = array();
    $headers[] = "To: {$email}";
    $headers[] = "From: CAPS Consortium <[email protected] /cdn-cgi/l/email-protection>";
    $headers[] = "Reply-To: CAPS Consortium <[email protected] /cdn-cgi/l/email-protection>";
    $headers[] = "Subject: {$subject}";
    $headers[] = "X-Mailer: PHP/".phpversion();

    $headers[] = "MIME-Version: 1.0";

    if(!empty($attachments)) {
        $boundary = md5(time());
        $headers[] = "Content-type: multipart/mixed;boundary=\"".$boundary."\"";
        // Have attachment, different content type and boundary required.
    } else {
        $headers[] = "Content-type: text/html; charset=UTF-8";
    }

    $html = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
            <title>CAPS Consortium</title>
            <style>table { border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt; }</style>
        </head>
        <body style="font-family: arial;" width="100%">
            [text]
        </body>
    </html>';

    $generated = date('jS M Y H:i:s');
    $subject = ($subject ? $subject : 'Default Subject');
    $message = $html;

    $message = str_replace("[text]", $text, $message);

    if(!empty($attachments)) {
        $output   = array();
        $output[] = "--".$boundary;
        $output[] = "Content-type: text/html; charset=\"utf-8\"";
        $output[] = "Content-Transfer-Encoding: 8bit";
        $output[] = "";
        $output[] = $message;
        $output[] = "";
        foreach($attachments as $attachment) {
            $output[] = "--".$boundary;
            $output[] = "Content-Type: ".$attachment['type']."; name=\"".$attachment['name']."\";";
            if(isset($attachment['encoding'])) {
                $output[] = "Content-Transfer-Encoding: " . $attachment['encoding'];
            }
            $output[] = "Content-Disposition: attachment;";
            $output[] = "";
            $output[] = $attachment['data'];
            $output[] = "";
        }
        return mail($email, $subject, implode("\r\n", $output), implode("\r\n", $headers));
    } else {
        return mail($email, $subject, $message, implode("\r\n", $headers));
    }

}

希望这有帮助。不应该需要太多的解释,因为它几乎就是你所拥有的,只是更干净、更容易维护。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP Mail() 中的 Base 64 附件不起作用 的相关文章

  • 通过 Ajax 加载内容时,WORDPRESS 音频播放器未加载,MediaElement.js 未应用

    我正在创建一个 WordPress 主题 当我使用 ajax 加载内容时 它不会将 MediaElements js 应用于我的音频播放器 因此不会显示音频 我认为这是因为 MediaElement js 加载了 wp footer 并且此
  • 删除PHP字符串中所有不匹配的字符?

    我有一个文本 我想从中删除所有不属于以下字符的字符 所需字符 0123456789 abcdefghijklmnopqrstuvwxyz n 最后一个是我确实想保留的 n 换行符 要匹配除列出的字符之外的所有字符 请使用反转字符集 http
  • 优雅地处理没有数据的 amcharts

    我想知道我的 dataProvider 是否为空 amCharts绘制时默认为null 我怎样才能动态地处理它 var chart AmCharts makeChart chartdiv theme none type serial dat
  • 如何使用 phpunit 运行单个测试方法?

    我正在努力运行一个名为testSaveAndDrop在文件中escalation EscalationGroupTest php with phpunit 我尝试了以下组合 phpunit EscalationGroupTest escal
  • FPDI/FPDF:水印和打印多页

    我修改了这个堆栈问题 当用户尝试下载文件时在 pdf 文件上应用水印 https stackoverflow com questions 3983432 applying watermarks on pdf files when users
  • 检查 PHP 中“@”字符后面的单词

    我现在正在制作一个新闻和评论系统 但是我已经在一个部分上停留了一段时间了 我希望用户能够在 Twitter 上引用其他玩家的风格 例如 用户名 该脚本看起来像这样 不是真正的 PHP 只是想象脚本 3 string I loved the
  • Woocommerce 让产品显示在存档页面中

    我正在尝试让所有产品显示在我商店的存档页面中 我想知道他们的id我正在使用我的一个钩子 它在 wp head 上运行并检查 if is product category 我想以某种方式访问 产品的查询并获取它们的 ID if is prod
  • Apache 访问 Linux 中的 NTFS 链接文件夹

    在 Debian jessie 中使用 Apache2 PHP 当我想在 Apache 的文档文件夹 var www 中创建一个新的小节时 我只需创建一个指向我的 php 文件所在的外部文件夹的链接 然后只需更改该文件夹的所有者和权限文件夹
  • 如何使用 php 发送服务器错误响应?

    一旦用户点击删除按钮我的 jQuery 脚本要求服务器删除所选项目 现在我想要我的php发送成功或错误响应的脚本 是否有可能触发错误回调万一该项目无法删除 Thanks 我的 jQuery 代码 ajax type post url myA
  • PHP严格标准:声明应该兼容

    我有以下类层次结构 class O Base class O extends O Base abstract class A Abstract public function save O Base obj class A extends
  • 蛋糕控制台 2.2.1:烘焙错误

    运行 MAMP 的 OSX 机器 CakePHP 2 2 1 已正确安装和配置 这意味着当我浏览到 Index php 文件时 所有绿色条都显示出来 我已经完成了博客教程 并且正在开发我的第二个应用程序 其中脚手架已启动并运行 现在我第一次
  • “使用未定义常量”注意,但该常量应该被定义

    共有三个文件 common php controller php 和 user php 文件 common php 如下所示 文件controller php看起来像 文件 user php 如下所示 执行脚本时 会给出通知 注意 使用未定
  • PHP 在输入流中使用 fwrite 和 fread

    我正在寻找将 PHP 输入流的内容写入磁盘的最有效方法 而不使用授予 PHP 脚本的大量内存 例如 如果可以上传的最大文件大小为 1 GB 但 PHP 只有 32 MB 内存 define MAX FILE LEN 1073741824 1
  • 在 PHP 中撤销 Google 访问令牌

    正如标题所示 我想以编程方式撤销授予的访问令牌 即在 PHP 中 我发现这个他们的网站 https developers google com identity protocols OAuth2WebServer tokenrevoke 但
  • PHP 脚本可以在终端中运行,但不能在浏览器中运行

    我正在尝试执行exec命令 但我遇到了问题 当我运行以下代码时 当我通过浏览器运行它时它不起作用 但如果我把输出 str将其复制并粘贴到终端中 它工作得很好 造成这种情况的原因是什么 我该如何解决 目前我正在运行localhost php
  • 在 apache docker 容器中运行虚拟主机

    我在同一个 apache 容器中有两个 php 应用程序 我试图在端口上运行其中一个应用程序 因为它需要通过根域而不是子文件夹进行访问 我想在端口 8060 上运行应用程序 我尝试使用 apache 虚拟主机执行此操作 但它不会加载页面 h
  • PHP 中只保留数组的前 N ​​个元素? [复制]

    这个问题在这里已经有答案了 有没有办法只保留数组的前 N 个 例如 10 个 元素 我知道有array pop 但是有没有更好 更优雅的方法呢 您可以使用array slice http php net array slice or arr
  • ini_set 'session.gc_maxlifetime' 为 1 天

    If I do ini set session gc maxlifetime 86400 这是否意味着用户可以将浏览器留在同一页面 非活动状态 最多 1 天 而不必担心会话被垃圾收集并被注销 如果服务器配置不支持此功能会发生什么 它会给我一
  • post php mysql 的拆分关键字

    我有一个表存储帖子 ID 它的标签如下 Post id Tags 1 keyword1 keyword2 keyword3 我想循环遍历该表中的每一行并执行以下操作 将关键字1 关键字2 关键字3放入新表中 word id word val
  • 无法显示 Laravel 欢迎页面

    我的服务器位于 DigitalOcean 云上 我正在使用 Ubuntu 和 Apache Web 服务器 我的家用计算机运行的是 Windows 7 我使用 putty 作为终端 遵循所有指示https laracasts com ser

随机推荐

  • 生成HMAC SHA256签名Python

    尝试为 3Commas 生成 HMAC SHA256 签名 我使用与官方示例 https github com 3commas io 3commas official api docs blob master rest api md exa
  • PHP Lucene - 索引 - 在 Linux 中经过 2.000.000 个系统块后失败

    我一直致力于使用 Zend Framework 最新版本创建索引 界面工作正常 其他一切都正常 我现在遇到的问题是 重新索引 或创建索引 我已经检查了其他所有内容 清理了数据并仔细检查了数据的质量 该进程总是在最有可能的记录 15 000
  • 如何通过网络发送类

    我有以下问题 我想通过线路发送类型 java lang Class 并在另一端 定义 该类 我这样尝试过 ByteArrayOutputStream bos new ByteArrayOutputStream ObjectOutputStr
  • 如何在android中的sdcard中创建文件夹

    我想在我的 SD 卡中创建文件夹 我使用了下面的代码 public class Screen extends Activity Override protected void onCreate Bundle savedInstanceSta
  • 通用 Windows 平台中未找到文件异常

    请帮助我 我在某个异步方法内有以下 C 代码行 并且我使用通用 Windows 平台 Windows 10 SDK 10 0 14393 var file await StorageFile GetFileFromApplicationUr
  • 检测锁定的表(由 LOCK TABLE 锁定)

    有没有办法检测 MySQL 中锁定的表 我的意思是表被锁定LOCK TABLE table WRITE READ命令 Note that readers interested in detecting named locks acquire
  • 如何在没有填充区域的情况下设置 div 背景

    我在 CSS 上有这样的课程 mgmtError width 716px float left background color FF0000 padding 10px text align center 我想为背景着色而不是在填充区域 我
  • 如何在 webpack 中使用快捷路径“@”?

    我用我的 package json 执行了 npm run build 我收到了这条消息 如何在 webpack 中使用 错误于 node modules babel loader lib node modules vue loader l
  • 如何在实际的 Apple Watch(而不是模拟器中)上强制退出单个应用程序?

    开发应用程序时 有时强制退出应用程序很有用 而无需重新启动整个设备 在我的 iPhone 上 我可以通过双击主页按钮并将应用程序滑动到顶部来强制退出活动应用程序 对于实际的 Apple Watch 不是模拟器 强制退出应用程序特别有用 因为
  • Android - 位图缓存占用大量内存

    我对所有内存管理主题都是新手 所以有很多东西我不明白 我正在尝试在我的应用程序中缓存图像 但我遇到了内存消耗问题 所有位图 Chaching 代码几乎都是从这里复制粘贴的 http developer android com trainin
  • 通过管道id杀死linux进程

    我想杀死一个进程并通过以下方式获取它的 id pgrep f python myscript py 我想打电话 kill s SIGINT 对此 但我找不到任何方法来做到这一点 该命令需要在一行中 尝试使用反引号运算符来评估子命令 kill
  • BizTalk Server 有哪些可行的替代方案? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在评估不同的系统集成策略时 我听到了一些关于 BizTalk Server 的鼓励的话 但也听到了一些
  • 如何在不停止站点的情况下更新 ASP.Net 站点 dll

    是否可以在不停止 IIS 的情况下更新预编译站点的站点 dll 目前 如果我尝试复制新文件来覆盖当前文件 则所有用户在复制文件时都会收到运行时错误 有办法避免这种情况吗 即使您不停止 对 web config 文件 BIN 文件夹 App
  • 如何使用选择文件浏览器的意图来选择文件

    如何使用意图提示用户选择 完成操作 来选择应用程序来选择文件 假设设备中有几个应用程序来浏览文件 我想使用扩展名过滤文件 例如 sav props 先感谢您 你可以使用这样的东西 Intent intent new Intent Inten
  • Mongoid 查找器不工作?

    我已经设置了一个 Rails3 mongoid 应用程序 当我打开 Rails 控制台时 所有查找器似乎都不起作用 http d pr FNzC http d pr FNzC User all User find all condition
  • Channel ManagedChannelImpl 未正确关闭

    如果我运行这两个测试 我会收到错误 1st test Rule public GrpcCleanupRule grpcCleanup new GrpcCleanupRule Test public void findAll throws E
  • 没有名为“ASP.NET 4.6.81.0”的事件日志源。该模块需要.NET Framework 2.0

    我刚刚安装了 VS 2015 Community 并在尝试访问 IIS 中托管的 ASP NET 应用程序 使用 ASP NET v4 0 应用程序池 时 收到了该错误消息 我刚刚下载了 NET Framework 4 6 离线安装程序 它
  • 查找谁在调用该方法

    我想以某种方式找出哪个 CFC 正在调用我的方法 我有一个记录 CFC 它被许多不同的 CFC 调用 在此日志记录 CFC 上 需要存储哪个 CFC 调用日志 虽然我可以简单地将 CFC 名称作为参数传递给 log cfc 但我发现这是一项
  • 从 DataReader 访问 DateTime 字段时出现 MySqlConversionException

    我有一个基于 MySql 的 C 应用程序 使用MySQL 连接器 http www mysql com 我正在尝试做一个 DataReader 请求 查询执行正常 但是 当尝试访问 DateTime 字段时 我收到 MySqlConver
  • PHP Mail() 中的 Base 64 附件不起作用

    我有一个脚本 当函数运行时 它会发送一封自动电子邮件 我希望能够发送 HTML 电子邮件以及 PDF 附件 我知道我需要将文件编码为 Base64 但是我只是将 Base64 代码附加到我的电子邮件底部 我认为这与哑剧有关 有人看到这个问题