首页 > 趣闻 > 正文内容

PHP实现带附件邮件发送的完整步骤与注意事项,新手必看的防踩雷手册,为什么你的附件总被拒收

趣闻2025-05-27 13:23:34

哎我说兄弟们,你们有没有遇到过这种情况?好不容易写好了邮件发送代码,一加附件要么发送失败,要么对方收到个破损文件。今天咱们就掰开了揉碎了讲讲这个事,保证你看完就能把简历、报表稳稳当当地发出去!


一、准备工作比写代码更重要

??说人话版本??:发带附件的邮件就像寄快递,你得先准备好包裹和快递单!

必须检查的三件事

  1. ??文件权限??:PHP要有读取服务器文件的权限(别用root权限!危险!)
  2. ??文件路径??:绝对路径比相对路径靠谱(/var/www/uploads/../files/强)
  3. ??文件大小??:别超过邮箱服务商限制(QQ邮箱附件≤50MB)

常见邮箱附件限制表

服务商单附件上限总大小上限
网易系邮箱50MB2GB
腾讯企业邮箱100MB10GB
Gmail25MB25MB

??亲身踩坑??:上次我用QQ邮箱发了个60MB的视频,结果系统自动转成云附件。客户压根找不到下载链接,差点耽误项目进度!


二、手把手教你用PHPMailer发附件

基础版代码模板

php复制
require 'vendor/autoload.php';

$mail = new PHPMailer\PHPMailer\PHPMailer();
$mail->addAttachment('/var/www/report.pdf', '月度报告.pdf'); 

// 其他配置参考之前的SMTP设置...

高级操作三连击

  1. ??多个附件??:连续调用addAttachment就行
php复制
$mail->addAttachment('/path/to/file1.zip');
$mail->addAttachment('/path/to/file2.jpg');
  1. ??重命名附件??:第二个参数就是显示名
php复制
$mail->addAttachment('/temp/123.txt', '重要说明.txt');
  1. ??网络文件直传??:不用下载到服务器
php复制
$mail->addStringAttachment(file_get_contents('https://example.com/file.xls'), '数据报表.xls');

??特别注意??:遇到过有人把addAttachment写在send()方法后面的,那肯定添加不上啊!顺序应该是先加附件再发送,跟做饭先放菜再放盐一个道理嘛~


三、五大常见翻车现场

1. 附件名称乱码

??解决方案??:

php复制
$mail->addAttachment(
    '/data/合同.docx',
    mb_convert_encoding('2024年合同.docx', 'ISO-8859-1', 'UTF-8')
);

2. 超大附件处理

超过25MB建议改用云存储链接,或者用分卷压缩:

php复制
// 自动分割压缩包
exec('zip -s 20m /var/www/bigfile.zip /var/www/source.file');

3. 特殊格式报错

??Excel/Word文件??:保存时选择兼容模式(.xls代替.xlsx)
??图片文件??:用JPG代替WEBP格式

4. 附件被判定为病毒

  • 上传前用clamscan扫描病毒
  • 避免使用.exe/.bat等危险扩展名

5. 内存溢出

发送100MB以上文件时记得改配置:

php复制
ini_set('memory_limit', '512M');
set_time_limit(300); // 超时时间设5分钟

四、这些细节决定成败

附件命名四不要

  1. 不要用中文(某些国外邮箱不支持)
  2. 不要带特殊符号(&、#、空格)
  3. 不要超过60个字符
  4. 不要用连续日期(20240601→改用240601)

安全防护三板斧

  1. 限制上传类型:
php复制
$allowed = ['pdf','docx','xlsx'];
if(!in_array(pathinfo($file,PATHINFO_EXTENSION), $allowed)){
    die('文件类型不允许!');
}
  1. 随机重命名:
php复制
$newName = md5(uniqid()).'.'.$ext;
move_uploaded_file($_FILES['file']['tmp_name'], '/uploads/'.$newName);
  1. 记录操作日志:
php复制
file_put_contents('mail.log', date('Y-m-d H:i:s').' 发送附件给'.$email."\n", FILE_APPEND);

个人血泪经验

说句掏心窝子的话,现在真不建议自己造轮子处理附件邮件。像我们团队现在直接用阿里云的邮件推送服务,API调用简单不说,还能自动处理超大附件和格式转换。特别是遇到海外客户时,自建邮件服务器十有八九会被当成垃圾邮件,用大厂服务省心太多。

最后给个忠告:测试附件邮件时,千万别用自己的工作邮箱瞎搞!我见过新手把测试邮件群发给全公司同事的惨剧。建议专门申请个测试邮箱,或者用临时邮箱服务,毕竟社死只有零次和无数次啊!

搜索