如何使用php中smtp发送支持附件的邮件
这篇文章主要介绍了php使用smtp发送支持附件的邮件示例,需要有smtp服务器,代码经过多次实战使用,需要的朋友可以参考下
轻量级PHP邮件发送,需要有smtp服务器,代码经过多次实战使用,现在把代码分享给大家
<?php /* 邮件发送smtp服务 联结smtp服务器,进行邮件发送,版权所有,不能复制 @author:jackbrown; @qq: 610269963 @time:2011-8-20; @version:1.0.3; */ class smtp{ /*邮件用户名*/ public $mailUser = MAIL_USER; /*邮件密码*/ public $mailPwd = MAIL_PWD; /*邮件服务器地址*/ public $server = MAIL_SMTP_HOST; /*邮件端口*/ public $port = MAIL_SMTP_PORT; public $timeout = MAIL_TIMEOUT; /*邮件编码*/ public $charset = MAIL_CHARSET; /*邮件发送者email,用于显示给接收者*/ public $senderMail = MAIL_SENDER; /*发用者名称*/ public $senderName = MAIL_SENDER_NAME; /*是否使用ssl安全操作*/ public $useSSL = IN_SSL; /*是否显示错误信息*/ public $showError = MAIL_SHOW_ERR; public $needLogin = MAIL_NEED_LOGIN; /*附件数组*/ public $attachMent = array(); public $failed = false; private static $smtpCon; private $stop ="\r\n"; private $status = 0; public function __construct(){ if(self::$smtpCon){ return; } if($this->mailUser==''){ $this->error('请配置好邮件登录用户名!'); return false; } if($this->mailPwd==''){ $this->error('请配置好邮件登录密码!'); return false; } if($this->server==''){ $this->error('请配置好邮服务器地址!'); return false; } if(!is_numeric($this->port)){ $this->error('请配置好邮服务器端口!'); return false; } /*ssl使用**/ $server = $this->server; if($this->useSSL == true){ $server = "ssl://".$this->server; } self::$smtpCon = @fsockopen($server, $this->port, $errno, $errstr,10);; if(!self::$smtpCon){ $this->error($errno.$errstr); return false; } socket_set_timeout(self::$smtpCon,0,250000); /*开始邮件指令*/ $this->getStatus(); $resp = true; $resp = $resp && $this->helo(); if($this->needLogin == '1'){ $resp = $resp && $this->login(); } if(!$resp){ $this->failed = true; } } /* 发送邮件 @param string $to 接收邮件地址 @param string $msg 邮件主要内容 @title string $title 邮件标题 */ public function sendMail($to,$msg,$title=''){ if($msg=='' ){ return false; } if(is_array($to)){ if($to!=null){ foreach($to as $k=>$e){ if(!preg_match('/^[a-z0-9A-Z_-]+@+([a-z0-9A-Z_-]+\.)+[a-z0-9A-Z]{2,3}$/',$e)){ unset($to[$k]); } } }else{ return false; } if($to == null){ return false; } }else{ if(!preg_match('/^[a-z0-9A-Z_-]+@+([a-z0-9A-Z_-]+\.)+[a-z0-9A-Z]{2,3}$/',$to)){ return false; } } if(!self::$smtpCon){ return false; } $this->sendSmtpMsg('MAIL FROM:<'.$this->senderMail.'>'); if(!is_array($to)){ $this->sendSmtpMsg('RCPT TO:<'.$to.'>'); }else{ foreach($to as $k=>$email){ $this->sendSmtpMsg('RCPT TO:<'.$email.'>'); } } $this->sendSmtpMsg("DATA"); if($this->status !='354'){ $this->error('请求发送邮件失败!'); $this->failed = true; return false; } $msg = base64_encode($msg); $msg = str_replace($this->stop . '.', $this->stop . '..', $msg); $msg = substr($msg, 0, 1) == '.' ? '.' . $msg : $msg; if($this->attachMent!=null){ $headers = $this->mimeHeader($msg,$to,$title); $this->sendSmtpMsg($headers,false); }else{ $headers = $this->mailHeader($to,$title); $this->sendSmtpMsg($headers,false); $this->sendSmtpMsg('',false); $this->sendSmtpMsg($msg,false); } $this->sendSmtpMsg('.');//发送结束标识符 if($this->status != '250'){ $this->failed = true; $this->error($this->readSmtpMsg()); return false; } return true; } /* 关闭邮件连接 */ public function close(){ $this->sendSmtpMsg('Quite'); @socket_close(self::$smtpCon); } /* 添加普通邮件头信息 */ protected function mailHeader($to,$title){ $headers = array(); $headers[] = 'Date: '.$this->gmtime('D j M Y H:i:s').' '.date('O'); if(!is_array($to)){ $headers[] = 'To: "'.'=?'.$this->charset.'?B?'.base64_encode($this->getMailUser($to)).'?="<'.$to.'>'; }else{ foreach($to as $k=>$e){ $headers[] = 'To: "'.'=?'.$this->charset.'?B?'.base64_encode($this->getMailUser($e)).'?="<'.$e.'>'; } } $headers[] = 'From: "=?'.$this->charset.'?B?'.base64_encode($this->senderName).'?="<'.$this->senderMail.'>'; $headers[] = 'Subject: =?'.$this->charset.'?B?'.base64_encode($title).'?='; $headers[] = 'Content-type: text/html; charset='.$this->charset.'; format=flowed'; $headers[] = 'Content-Transfer-Encoding: base64'; $headers = str_replace($this->stop . '.', $this->stop . '..', trim(implode($this->stop, $headers))); return $headers; } /* 带付件的头部信息 */ protected function mimeHeader($msg,$to,$title){ if($this->attachMent!=null){ $headers = array(); $boundary = '----='.uniqid(); $headers[] = 'Date: '.$this->gmtime('D j M Y H:i:s').' '.date('O'); if(!is_array($to)){ $headers[] = 'To: "'.'=?'.$this->charset.'?B?'.base64_encode($this->getMailUser($to)).'?="<'.$to.'>'; }else{ foreach($to as $k=>$e){ $headers[] = 'To: "'.'=?'.$this->charset.'?B?'.base64_encode($this->getMailUser($e)).'?="<'.$e.'>'; } } $headers[] = 'From: "=?'.$this->charset.'?B?'.base64_encode($this->senderName).'?="<'.$this->senderMail.'>'; $headers[] = 'Subject: =?'.$this->charset.'?B?'.base64_encode($title).'?='; $headers[] = 'Mime-Version: 1.0'; $headers[] = 'Content-Type: multipart/mixed;boundary="'.$boundary.'"'.$this->stop; $headers[]='--'.$boundary; $headers[]='Content-Type: text/html;charset="'.$this->charset.'"'; $headers[]='Content-Transfer-Encoding: base64'.$this->stop; $headers[] = ''; $headers[]= $msg.$this->stop; foreach($this->attachMent as $k=>$filename){ $f = @fopen($filename, 'r'); $mimetype = $this->getMimeType(realpath($filename)); $mimetype = $mimetype == '' ? 'application/octet-stream' : $mimetype; $attachment = @fread($f, filesize($filename)); $attachment = base64_encode($attachment); $attachment = chunk_split($attachment); $headers[] = "--" . $boundary; $headers[] = "Content-type: ".$mimetype.";name=\"=?".$this->charset."?B?". base64_encode(basename($filename)).'?="' ; $headers[] = "Content-disposition: attachment; name=\"=?".$this->charset."?B?". base64_encode(basename($filename)).'?="'; $headers[] = 'Content-Transfer-Encoding: base64'.$this->stop; $headers[] = $attachment.$this->stop; } $headers[] = "--" . $boundary . "--"; $headers = str_replace($this->stop . '.', $this->stop . '..', trim(implode($this->stop, $headers))); return $headers; } } /* 获取返回状态 */ protected function getStatus(){ $this->status = substr($this->readSmtpMsg(),0,3); } /* 获取邮件服务器返回的信息 @return string 信息字符串 */ protected function readSmtpMsg(){ if(!is_resource(self::$smtpCon)){ return false; } $return = ''; $line = ''; while (strpos($return, $this->stop)=== false OR $line{3}!== ' ') { $line = fgets(self::$smtpCon, 512); $return .= $line; } return trim($return); } /* 给邮件服务器发给指定命令消息 */ protected function sendSmtpMsg($cmd,$chStatus=true){ if (is_resource(self::$smtpCon)) { fwrite(self::$smtpCon, $cmd . $this->stop, strlen($cmd) + 2); } if($chStatus == true){ $this->getStatus(); } return true; } /* 邮件时间格式 */ protected function gmtime(){ return (time() - date('Z')); } /* 获取付件的mime类型 */ protected function getMimeType($file){ $mimes = array( 'chm'=>'application/octet-stream', 'ppt'=>'application/vnd.ms-powerpoint', 'xls'=>'application/vnd.ms-excel', 'doc'=>'application/msword', 'exe'=>'application/octet-stream', 'rar'=>'application/octet-stream', 'js'=>"javascrīpt/js", 'css'=>"text/css", 'hqx'=>"application/mac-binhex40", 'bin'=>"application/octet-stream", 'oda'=>"application/oda", 'pdf'=>"application/pdf", 'ai'=>"application/postsrcipt", 'eps'=>"application/postsrcipt", 'es'=>"application/postsrcipt", 'rtf'=>"application/rtf", 'mif'=>"application/x-mif", 'csh'=>"application/x-csh", 'dvi'=>"application/x-dvi", 'hdf'=>"application/x-hdf", 'nc'=>"application/x-netcdf", 'cdf'=>"application/x-netcdf", 'latex'=>"application/x-latex", 'ts'=>"application/x-troll-ts", 'src'=>"application/x-wais-source", 'zip'=>"application/zip", 'bcpio'=>"application/x-bcpio", 'cpio'=>"application/x-cpio", 'gtar'=>"application/x-gtar", 'shar'=>"application/x-shar", 'sv4cpio'=>"application/x-sv4cpio", 'sv4crc'=>"application/x-sv4crc", 'tar'=>"application/x-tar",'ustar'=>"application/x-ustar",'man'=>"application/x-troff-man", 'sh'=>"application/x-sh", 'tcl'=>"application/x-tcl", 'tex'=>"application/x-tex", 'texi'=>"application/x-texinfo",'texinfo'=>"application/x-texinfo", 't'=>"application/x-troff", 'tr'=>"application/x-troff", 'roff'=>"application/x-troff", 'shar'=>"application/x-shar", 'me'=>"application/x-troll-me", 'ts'=>"application/x-troll-ts", 'gif'=>"image/gif", 'jpeg'=>"image/pjpeg", 'jpg'=>"image/pjpeg", 'jpe'=>"image/pjpeg", 'ras'=>"image/x-cmu-raster", 'pbm'=>"image/x-portable-bitmap", 'ppm'=>"image/x-portable-pixmap", 'xbm'=>"image/x-xbitmap", 'xwd'=>"image/x-xwindowdump", 'ief'=>"image/ief", 'tif'=>"image/tiff", 'tiff'=>"image/tiff", 'pnm'=>"image/x-portable-anymap", 'pgm'=>"image/x-portable-graymap", 'rgb'=>"image/x-rgb", 'xpm'=>"image/x-xpixmap", 'txt'=>"text/plain", 'c'=>"text/plain", 'cc'=>"text/plain", 'h'=>"text/plain", 'html'=>"text/html", 'htm'=>"text/html", 'htl'=>"text/html", 'rtx'=>"text/richtext", 'etx'=>"text/x-setext", 'tsv'=>"text/tab-separated-values", 'mpeg'=>"video/mpeg", 'mpg'=>"video/mpeg", 'mpe'=>"video/mpeg", 'avi'=>"video/x-msvideo", 'qt'=>"video/quicktime", 'mov'=>"video/quicktime", 'moov'=>"video/quicktime", 'movie'=>"video/x-sgi-movie", 'au'=>"audio/basic", 'snd'=>"audio/basic", 'wav'=>"audio/x-wav", 'aif'=>"audio/x-aiff", 'aiff'=>"audio/x-aiff", 'aifc'=>"audio/x-aiff", 'swf'=>"application/x-shockwave-flash", 'myz'=>"application/myz" ); $ext = substr(strrchr($file,'.'),1); $type = $mimes[$ext]; unset($mimes); return $type; } /* 邮件helo命令 */ private function helo(){ if($this->status != '220'){ $this->error('连接服务器失败!'); return false; } return $this->sendSmtpMsg('HELO '.$this->server); } /* 登录 */ private function login(){ if($this->status!='250'){ $this->error('helo邮件指令失败!'); return false; } $this->sendSmtpMsg('AUTH LOGIN'); if($this->status!='334'){ $this->error('AUTH LOGIN 邮件指令失败!'); return false; } $this->sendSmtpMsg(base64_encode($this->mailUser)); if($this->status!='334'){ $this->error('邮件登录用户名可能不正确!'.$this->readSmtpMsg()); return false; } $this->sendSmtpMsg(base64_encode($this->mailPwd)); if($this->status !='235'){ $this->error('邮件登录密码可能不正确!'); return false; } return true; } private function getMailUser($to){ $temp = explode('@',$to); return $temp[0]; } /* 异常报告 */ private function error($exception){ if($this->showError == false){ file_put_contents('mail_log.txt',$exception,FILE_APPEND); return; } if(class_exists('error') && is_object($GLOBALS['error'])){ $GLOBALS['error']->showErrorStr($exception,'javascript:',false); }else{ throw new Exception($exception); } } } // 使用示例 ini_set('memory_limit','128M'); set_time_limit(120); define('MAIL_SENDER_NAME','楚贤'); define('MAIL_SMTP_HOST','smtp.ym.163.com'); define('MAIL_USER','admin@myxxxx.com'); define('MAIL_SENDER','admin@myxxxx.com'); define('MAIL_PWD','xxxx'); define('MAIL_SMTP_PORT',25); define('IN_SSL',false); define('MAIL_TIMEOUT',10); define('MAIL_CHARSET','utf-8'); date_default_timezone_set('PRC'); $m = new smtp(); $msg = "有用户登录服务器@".date('Y-m-d H:i:s'); 付件 //$m->attachMent = array('hehe.php','common.php'); if($m->sendMail(array('610269963@qq.com'),$msg,'88服务器登录提示')){ echo '发送成功!'; } $m->close(); ?>
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
如何解决PHP中Fatal error session_start()的错误
以上是如何使用php中smtp发送支持附件的邮件的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undress AI Tool
免费脱衣服图片

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

PHP变量作用域常见问题及解决方法包括:1.函数内部无法访问全局变量,需使用global关键字或参数传入;2.静态变量用static声明,只初始化一次并在多次调用间保持值;3.超全局变量如$_GET、$_POST可在任何作用域直接使用,但需注意安全过滤;4.匿名函数需通过use关键字引入父作用域变量,修改外部变量则需传递引用。掌握这些规则有助于避免错误并提升代码稳定性。

PHP注释代码常用方法有三种:1.单行注释用//或#屏蔽一行代码,推荐使用//;2.多行注释用/.../包裹代码块,不可嵌套但可跨行;3.组合技巧注释如用/if(){}/控制逻辑块,或配合编辑器快捷键提升效率,使用时需注意闭合符号和避免嵌套。

写好PHP注释的关键在于明确目的与规范,注释应解释“为什么”而非“做了什么”,避免冗余或过于简单。1.使用统一格式,如docblock(/*/)用于类、方法说明,提升可读性与工具兼容性;2.强调逻辑背后的原因,如说明为何需手动输出JS跳转;3.在复杂代码前添加总览性说明,分步骤描述流程,帮助理解整体思路;4.合理使用TODO和FIXME标记待办事项与问题,便于后续追踪与协作。好的注释能降低沟通成本,提升代码维护效率。

ToinstallPHPquickly,useXAMPPonWindowsorHomebrewonmacOS.1.OnWindows,downloadandinstallXAMPP,selectcomponents,startApache,andplacefilesinhtdocs.2.Alternatively,manuallyinstallPHPfromphp.netandsetupaserverlikeApache.3.OnmacOS,installHomebrew,thenrun'bre

易于效率,启动启动tingupalocalserverenverenvirestoolslikexamppandacodeeditorlikevscode.1)installxamppforapache,mysql,andphp.2)uscodeeditorforsyntaxssupport.3)

用户语音输入通过前端JavaScript的MediaRecorderAPI捕获并发送至PHP后端;2.PHP将音频保存为临时文件后调用STTAPI(如Google或百度语音识别)转换为文本;3.PHP将文本发送至AI服务(如OpenAIGPT)获取智能回复;4.PHP再调用TTSAPI(如百度或Google语音合成)将回复转为语音文件;5.PHP将语音文件流式返回前端播放,完成交互。整个流程由PHP主导数据流转与错误处理,确保各环节无缝衔接。

在PHP中搭建社交分享功能的核心方法是通过动态生成符合各平台要求的分享链接。1.首先获取当前页面或指定的URL及文章信息;2.使用urlencode对参数进行编码;3.根据各平台协议拼接生成分享链接;4.在前端展示链接供用户点击分享;5.动态生成页面OG标签优化分享内容展示;6.务必对用户输入进行转义以防止XSS攻击。该方法无需复杂认证,维护成本低,适用于大多数内容分享需求。

要实现PHP结合AI进行文本纠错与语法优化,需按以下步骤操作:1.选择适合的AI模型或API,如百度、腾讯API或开源NLP库;2.通过PHP的curl或Guzzle调用API并处理返回结果;3.在应用中展示纠错信息并允许用户选择是否采纳;4.使用php-l和PHP_CodeSniffer进行语法检测与代码优化;5.持续收集反馈并更新模型或规则以提升效果。选择AIAPI时应重点评估准确率、响应速度、价格及对PHP的支持。代码优化应遵循PSR规范、合理使用缓存、避免循环查询、定期审查代码,并借助X
