使用PHP调用Outlook发送邮件时如何添加附件
PHP调用Outlook COM组件发送带附件邮件实现方案
现有代码已经完成基础纯文本邮件发送能力,添加附件只需要调用Outlook邮件对象的Attachments->Add()方法即可,不需要引入其他依赖。
核心实现逻辑
Outlook的MailItem对象提供了Attachments集合用于管理邮件附件,调用Add方法即可追加附件,方法基础参数说明:
- 第一个参数:必填,附件文件的绝对本地物理路径,不支持相对路径、远程URL
- 第二个参数:可选,附件类型,普通内嵌附件传常量
olByValue(对应值1)即可,也是默认值 - 第三个参数:可选,附件在邮件正文内的插入位置,仅当发送HTML格式邮件嵌入图片等场景需要配置
- 第四个参数:可选,附件显示在邮件里的名称,不传则默认取文件本身的文件名
注意事项
- 附件添加代码必须放在
$oMsg->Save()、$oMsg->Send()调用之前 - PHP运行进程的系统身份(Web服务运行账户/CLI运行账户)必须对附件文件有读取权限,否则会抛出COM调用异常
- 需要添加多个附件时,重复调用
$oMsg->Attachments->Add()传入不同文件路径即可 - 确保php.ini中已开启COM相关配置:
com.allow_dcom = On,且运行环境为Windows系统、已安装并提前配置好桌面版Outlook客户端
修改后可直接运行的完整代码
$subject = "Hi from your city"; $message = "hello my darling"; $to = "example@gmail.com"; // 定义附件路径,替换为你自己的文件绝对路径 $attachmentPath = "C:\\Users\\xxx\\Documents\\test.pdf"; // 如需多个附件,追加路径到数组即可 $attachments = [ $attachmentPath, // "C:\\Users\\xxx\\Pictures\\demo.png" ]; // 初始化Outlook COM对象 com_load_typelib("outlook.application"); if (!defined("olMailItem")) { define("olMailItem", 0); } if (!defined("olByValue")) { define("olByValue", 1); // 普通附件类型常量 } $outlook_Obj = new COM("outlook.application") or die("Unable to start Outlook"); echo "Loaded MS Outlook, version {$outlook_Obj->Version}\n"; $oMsg = $outlook_Obj->CreateItem(olMailItem); $oMsg->Recipients->Add($to); $oMsg->Subject = $subject; $oMsg->Body = $message; // 循环添加所有附件 foreach ($attachments as $file) { if (file_exists($file) && is_readable($file)) { $oMsg->Attachments->Add($file, olByValue); } } $oMsg->Save(); $oMsg->Send();
小提示:如果需要发送HTML格式邮件,只需要把
$oMsg->Body = $message替换为$oMsg->HTMLBody = "<h1>邮件标题</h1><p>HTML内容</p>"即可,附件添加逻辑不受影响。
内容的提问来源于stack exchange,提问作者Hasan Yilmaz
相关产品推荐
相关产品推荐

