如何使用 PHP 发送带有内嵌附加图像的 HTML 电子邮件

2024-04-22

我有一个 PHP 脚本,它发送一封带有附加图像的 HTML 电子邮件。它工作得很好,但是,我无法让附件显示在<img>电子邮件正文中的标签。附件文件名为postcard.png服务器上的原始文件名是4e60348f83f2f.png。我尝试过以各种形式提供图像 URL:cid:postcard.png, cid:4e60348f83f2f.png, postcard.png, and 4e60348f83f2f.png。什么都不起作用。

我认为我做错的关键部分就在这里,因为这使它成为一个单独的附件,而不是我可以使用的内联附件:

Content-Transfer-Encoding: base64
Content-Disposition: attachment;
    filename="$fname" // i.e.: "postcard.png"

我尝试过将其更改为使用 CID,但我真的不知道该怎么做,而且这根本不起作用:

Content-Transfer-Encoding: base64
Content-ID: <$fname> // i.e.: postcard.png

这是完整的代码:(它基于这段代码 http://www.php.net/manual/en/function.mail.php#83491来自 php 中的评论mail() page.)

<?php
$to      = "[email protected] /cdn-cgi/l/email-protection";
$email   = "[email protected] /cdn-cgi/l/email-protection";
$name    = "Namename";
$subject = "An inline image!"; 
$comment = "Llookout <b>Llary</b> it's <br> the <b>Ll</b>andllord!<br><img src='cid:postcard.png'><br><img src='cid:4e60348f83f2f.png'><img src='postcard.png'><br><img src='4e60348f83f2f.png'>";

$To          = strip_tags($to);
$TextMessage =strip_tags(nl2br($comment),"<br>");
$HTMLMessage =nl2br($comment);
$FromName    =strip_tags($name);
$FromEmail   =strip_tags($email);
$Subject     =strip_tags($subject);

$boundary1   =rand(0,9)."-"
    .rand(10000000000,9999999999)."-"
    .rand(10000000000,9999999999)."=:"
    .rand(10000,99999);
$boundary2   =rand(0,9)."-".rand(10000000000,9999999999)."-"
    .rand(10000000000,9999999999)."=:"
    .rand(10000,99999);

$filename1 = "4e60348f83f2f.png"; //name of file on server with script
$handle      =fopen($filename1, 'rb'); 
$f_contents  =fread($handle, filesize($filename1)); 
$attachment=chunk_split(base64_encode($f_contents));
fclose($handle); 

$ftype       ="image/png";
$fname       ="postcard.png"; //what the file will be named


$attachments='';
$Headers     =<<<AKAM
From: $FromName <$FromEmail>
Reply-To: $FromEmail
MIME-Version: 1.0
Content-Type: multipart/mixed;
    boundary="$boundary1"
AKAM;

$attachments.=<<<ATTA
--$boundary1
Content-Type: $ftype;
    name="$fname"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
    filename="$fname"


$attachment

ATTA;


$Body        =<<<AKAM
This is a multi-part message in MIME format.

--$boundary1
Content-Type: multipart/alternative;
    boundary="$boundary2"

--$boundary2
Content-Type: text/plain;
    charset="windows-1256"
Content-Transfer-Encoding: quoted-printable

$TextMessage
--$boundary2
Content-Type: text/html;
    charset="windows-1256"
Content-Transfer-Encoding: quoted-printable

$HTMLMessage

--$boundary2--

$attachments
--$boundary1--
AKAM;

// Send email
$ok=mail($To, $Subject, $Body, $Headers);
echo $ok?"<h1> Mail sent!</h1>":"<h1> Mail not sent!</h1>";
?>

我终于找到了答案,事实证明答案非常简单。这一页 http://fil.ya1.ru/PHP_5_in_Practice/index.htm#page=0768667437/ch16lev1sec1.html是什么帮助我弄清楚了这一点,但我将在下面演示完成它所需的部分。

首先,创建边界字符串以及正确编码和分块的图像:

// Create a boundary string.  It needs to be unique (not in the text) so ...
// We are going to use the sha1 algorithm to generate a 40 character string:
$sep = sha1(date('r', time()));

// Also now prepare our inline image - Also read, encode, split:
$inline = chunk_split(base64_encode(file_get_contents('figure.gif')));

在电子邮件的 HTML 部分中,像这样引用图像(使用边界字符串):

<img src="cid:PHP-CID-{$sep}">

然后,您在 HTML 部分下方创建电子邮件的另一部分作为内联附件,如下所示:

--PHP-related-{$sep}
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-ID: <PHP-CID-{$sep}>
{$inline}

...就是这样!如果这就是您所做的一切,那么比实现 PHPmailer 或任何其他库更容易。毫无疑问,对于更复杂的任务,您会想要获得这些库之一。

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

如何使用 PHP 发送带有内嵌附加图像的 HTML 电子邮件 的相关文章

  • 在 ruby​​ 中使用 Blowfish 加密字符串返回的字符串比 php 中的相同过程要短

    这让我很困惑 当我尝试使用以下输入用 Blowfish 加密字符串时 key 某个键 输入 输入字符串 我得到以下结果 ruby 79af8c8ee9220bde php 79af8c8ee9220bdec2d1c9cfca7b13c6 我
  • C++ 相当于 PHP 的 pack()

    我的问题很简单 有没有类似 PHP 的pack and unpack C STL 中的函数 如果没有 是否有其他方法可以实现相同的目标 https www php net pack https www php net pack Thanks
  • Codeigniter:Base_url 似乎不起作用

    我开发了一个简单的网站 可以从 Twitter 公共时间线获取推文 将其缓存 60 秒等等 我最近将主机从 Hostgator 移至 Mediatemple 我的网站之前在 Hostgator 上运行良好 我的应用程序不使用数据库连接 也不
  • XP及PHP MYSQL 练级系统

    我已经查看了所有提出的问题和答案 但我似乎找不到最适合我的答案 我想做的是开发一个系统 当用户达到一定的 XP 限制时 系统会进入下一个级别 它显示了下一个 XP 之前需要多少 XP So lvl1 0 gt lvl2 256 gt lvl
  • 使用php在html页面中显示bbcode

    我已经有一个 bbcode 字符串 mybbcode b Hello word b 使用 php 我想在 html 页面中以 html 格式显示它 例如 div gt b hello word b div 基本上其他人已经对你说过了 但是如
  • PHP 中 file、file_get_contents 和 fopen 之间的区别

    我是 PHP 新手 我不太确定 两者之间有什么区别file file get contents and fopen 函数 什么时候应该使用其中一个而不是另一个 前两个 file http www php net manual en func
  • 如何使用 jquery ajax 将锚点的值发送到 php

    我正在尝试使用 jquery 将几个锚点的值发送到 php 文件 但我没有从 php 脚本中得到回调 div class result div a href value class star Star 5 a a href value cl
  • 在 PHP 中拆分 XML

    我有一个带有根元素和多个项目子元素的合并 xml 像这样的东西
  • 打印一个模式以显示最多 5 行 5 列的数字,例如 5 4 3 2 1 和下一行 4 3 2 1 5 直到第 5 行

    这是一个正方形图案 每行有 5 列 共有 5 行 图案如下所示 5 4 3 2 1 4 3 2 1 5 3 2 1 5 4 2 1 5 4 3 1 5 4 3 2 我的代码如下以获得模式 但当计数器达到 1 并显示在相应的列值中时 我无法重
  • PHP:如何发送电子邮件基础知识

    我想使用 PHP 从本地主机向其他人发送电子邮件 我需要做什么才能做到这一点 例如我需要安装邮件服务器吗 如果我没记错的话 有一种语言不需要邮件服务器来发送电子邮件 这样对吗 PHP ini里面有 邮件功能 如何配置这个 我在网上查了一下
  • 为什么使用闭包进行赋值而不是直接将值赋给键?

    我当时正在看在 7 10 他添加了一个数据库依赖项并使用闭包来分配值 我的问题是为什么不直接使用直接赋值 我的意思是不这样做 container db capsule 相当于这样做 container db function contain
  • 如何在 PHP 中运行 shell 脚本?

    我正在尝试使用 PHP 触发 shell 脚本的运行 本质上 当用户在我们用 PHP 编写的网站上完成一个操作时 我们希望触发一个 shell 脚本 该脚本本身调用一个 Java 文件 提前致谢 See shell exec http ph
  • 用PHP动态生成二维码[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试在我的网站上生成二维码 他们所要做的就是在其中包含一个 URL 我网站上的变量将提供该 URL
  • Laravel 类邮件程序不存在

    我将应用程序从 5 更新到 5 2 现在 当我调用 Mail send 时 它会返回一个异常 Class mailer 不存在 Mail send emails mail data gt content function m use to
  • 水豚可以与隐藏元素互动吗?

    我有一个文件字段opacity 0并且与一个假按钮重叠 这是一种常见的 CSS 技术 用于伪造一种在不同浏览器中一致显示的 上传按钮 水豚不允许我打电话attach file在该输入上 错误是Selenium WebDriver Error
  • 在 PHP 中使用数组来比较用户名/密码

    我有以下 php 脚本 其中有一个用户名和密码 Username user1 Password pass1 if isset POST submitform Clean up the input values foreach POST as
  • 如何使用xquery查找节点并向其添加子节点?

    是否可以使用xpath xquery查询特定的xml节点 然后向其导入 添加子节点 示例 代码取自http codepad org gJ1Y2LjM http codepad org gJ1Y2LjM 这是在类似的问题中提出的 但不相同 1
  • PHP:如何检查总数。 URL 中的参数?

    我正在使用 REQUEST 检索参数 有没有办法找到总数 URL 中的参数 而不是检索每个参数然后进行计数 这将为您提供总数 分隔的 URL 查询参数 count explode SERVER QUERY STRING 如果您只想要唯一的参
  • 通过复选框选择多行时出错错误未定义索引:复选框

    我想从中选择多行checkbox并想通过单击按钮立即更新它们 我尝试了多种方法 但不起作用 你能帮忙吗 它显示错误为Undefined index checkbox td td
  • 在 PHP 命令行上显示完整的堆栈跟踪

    Problem 我的 PHP 堆栈跟踪缩写为 Stack trace 0 www html table app create php 128 SoapClient gt call call Array 1 www html table ap

随机推荐

  • CSS3 具有两个方向的线性渐变

    我的网站中有一个标题 当前使用线性渐变从一种颜色移动到另一种颜色 这是CSS top header position absolute bottom 0 left 0 width 100 z index 99999 FF3 6 backgr
  • 我可以从类似于 jaxb 的 json 数据创建类吗

    因此 我的代码是 api 的客户端 数据以 xml 形式返回 我已经能够从该 xml 的一些示例创建有效的 xsd 文件 然后从模式生成一些 JAXB 类 以便我的代码现在可以加载并使用xml 数据 而无需直接使用 Xml 但不幸的是 在最
  • SignalR .NET Core 驼峰命名法 JSON 合约解析器

    使用 NET Core RC2 让 SignalR 工作 但试图让它返回 JSON 中的驼峰命名法属性 对于我正在使用的 API services AddMvc AddJsonOptions o gt o SerializerSetting
  • 如何获取 gmail api 的消费者密钥和消费者秘密?

    我正在尝试使用 Gmail php xoath php 示例 但是它需要输入消费者密钥和消费者秘密 我在 Gmail api 文档中找不到如何获取这些密钥和秘密 有谁知道如何获取它们或知道任何相关文档吗 Use anonymous anon
  • Bootstrap Carousel:删除自动滑动

    我正在使用 Bootstrap 轮播 我想要的是滑块仅在单击导航或分页时才会滑动 我尝试过删除 carousel carousel interval 6000 它工作正常 但我的问题是一旦我点击了导航或分页 它现在就会自动滑动 是否可以取消
  • 对“__divdi3”的未定义引用

    在链接一些对整数类型执行除法和模运算的代码时long long我收到以下两个错误 util c text 0x1af undefined reference to divdi3 util c text 0x1ef undefined ref
  • javascript在两个不同的索引处分割字符串

    我有一张 amex I E 信用卡 371449635398431我想分成三部分3714 496353 98431 是否有一种简单的方法可以通过预定义索引 在本例中为 4 和 10 分割字符串 可能使用简单的正则表达式函数 我真的不认为这里
  • 按天分组的 SQL 查询

    我想列出所有销售额 并按天对总和进行分组 Sales saleID INT amount INT created DATETIME 注意 我使用的是 SQL Server 2005 如果您使用的是 SQL Server dateadd DA
  • 预发送脚本如何检索参数化 Jenkins 作业的参数?

    我想根据参数化作业的布尔参数值取消电子邮件发送 该参数名为 skip email 我尝试编写包含以下内容的预发送脚本 但它不起作用 def env System getenv logger println Should I skip ema
  • 将 mvc-mini-profiler 与 EF 4.0 和 Ninject 结合使用

    我正在尝试将新的 mvc mini profiler 与基于 EF4 的应用程序一起使用 但我不知道如何正确连接到目标数据源 据我所知 Func
  • 如何在 Visual C++ 2008 中链接静态库?

    我的 VC 解决方案包括两个项目 一个应用程序 exe 和一个静态库 两者都编译良好 但无法链接 我使用的静态库中的每个函数都收到 无法解析的外部符号 错误 它们看起来像这样 MyApplication obj 错误 LNK2019 无法解
  • FileStream 添加“额外”字符到 TXT 文件

    无论我读取 TXT 文件还是 XML 文件 我总是会看到 额外 信息添加到保存到磁盘的文件中 我们首先执行以下操作 FileStream fs new FileStream fileMoverFile SourcePath FileMode
  • 为什么 C# 编译器对 double IEnumerable 和 foreach T 感到满意?

    我知道这段代码不起作用 并且以有效的方式编写它没有问题 我想知道编译器如何构建而不出现任何错误 如果您在哪里运行它 您会遇到运行时错误吗 假设数据不为空 using System using System Collections Gener
  • 是否有可能将一个 HMap '转换' 为另一个 HMap

    如果我有一个无形的 https github com milessabin shapeless HMap MappingA 为类型正确定义隐式MappingA K V 我可以安全地将其转换 映射到HMap MappingB class Ma
  • MediaRecorder.AudioSource.VOICE_CALL 不适用于 Android 4.1.2 中的通话录音

    https github com esnyder callrecorder https github com esnyder callrecorder我已应用此源代码来执行通话录音 但它不是录音通话 双向录音 经过大量搜索后 我发现 And
  • 在 C# 中通过 TCP 发送 C 结构体

    我正在编写一个程序 通过 TCP 与一台设备的管理界面进行交互 问题是 设备的文档是用C写的 而我写的程序是用C 写的 我的问题是 文档指定 通信基于基于C结构的API缓冲区 再多的谷歌搜索似乎也无法让我找到这个 API 或如何通过 TCP
  • 重写纯虚函数时使用“override”有什么意义吗?

    例如 class Base virtual void my function 0 class Derived Base void my function override 从我读到的来看 override关键字用于确保我们在重写的函数中具有
  • jQuery Mobile 将下一个输入集中在按键上

    我有一个 jquery 移动网站 其 html 表单由 4 个引脚输入框组成 我希望用户能够在每个输入字段中输入 pin 而不必按 iphone 键盘的 下一步 按钮 我尝试了以下操作 虽然它似乎将焦点设置到第二个输入并插入值 但键盘消失了
  • 在 C# 中重新抛出异常的正确方法是什么? [复制]

    这个问题在这里已经有答案了 这样做是否更好 try catch Exception ex throw Or this try catch Exception ex throw ex 他们做同样的事情吗 这个比那个好吗 您应该始终使用以下语法
  • 如何使用 PHP 发送带有内嵌附加图像的 HTML 电子邮件

    我有一个 PHP 脚本 它发送一封带有附加图像的 HTML 电子邮件 它工作得很好 但是 我无法让附件显示在 img 电子邮件正文中的标签 附件文件名为postcard png服务器上的原始文件名是4e60348f83f2f png 我尝试