程序员人生 网站导航

利用php中mail函数发送带有附件的邮件

栏目:php教程时间:2014-06-02 22:00:39

mail函数,发送邮件

语法: mail(to,subject,message,headers,parameters)

to 规定邮件的接收者 

subject 规定邮件的主题。该参数不能包含任何换行字符 

message 规定要发送的消息 

headers 规定额外的报头,比如 From, Cc 以及 Bcc 

parameters 规定 sendmail 程序的额外参数。 

碰到的主要问题是乱码问题,刚开始是某些客户端接收邮件时好(比如QQ邮箱,估计带自动那个识别编码)的有些不foxmail、ipad显示乱码,解决方式正确的设置这个mail的headers就行了,下面是我使用的完美的无乱码的例子。

在PHP中配置php.ini文件过程分为两个步骤:

1.先找到你放置所有PHP,Apache,MySQL文件的地方,在PHP文件夹里你可以发现有一个文件:php.ini,打开后,找到mail function地方,将原来的配置代码改为如下(仅对windows系统):

  1. [mail function] 
  2. ; For Win32 only. 
  3. SMTP =smtp.sohu.com     
  4. mtp_port=25 
  5. ; For Win32 only. 
  6. sendmail_from = 填上你的电子邮件全称。 

此处为以sohu的邮件服务器设置,如果你用163的邮箱,则设置为:smtp.163.com

2.在C盘搜索php.ini,选择不是快捷方式的那一个php.ini,应该在C/WINDOWS里面的,打开它,如上面一样修改它,保存,设置完后,记得重启Apache服务器,然后mail()函数就可以用了,示例代码如下:

  1. <?php 
  2. // 当发送 HTML 电子邮件时,请始终设置 content-type 
  3. $headers = "MIME-Version: 1.0" . "rn"
  4. $headers .= "Content-type:text/html; charset=utf-8"
  5. mail($to,$subject,$message,$headers); 
  6. ?> 

上面函数不可以带附件了,下面我们升级一下,代码如下:

  1. <?php 
  2. class Mail { 
  3. private $topic
  4. private $toaddr
  5. private $fromaddr
  6. private $cc
  7. private $content
  8. private $attach
  9. private $header
  10. private $domain;//邮箱域 
  11. private $msg
  12. private $filename
  13. private $filemime
  14. private $filestr
  15. private $boundary
  16. private $uniqid
  17. private $eol//每行末尾所加的换行符类型 
  18.  
  19. function __construct(){ 
  20. $this->getEOT();//生成结尾换行符 
  21. $this->getUniq_id(); 
  22. $this->header=''
  23. $this->attach=''
  24. $this->cc=''
  25. $this->msg=''
  26.  
  27.  
  28. public function getFromaddr() { 
  29. return $this->fromaddr; 
  30. public function setFromaddr($fromaddr) { 
  31. $this->fromaddr = $fromaddr
  32. public function getTopic() { 
  33. return $this->topic; 
  34.  
  35. public function getToaddr() { 
  36. return $this->toaddr; 
  37.  
  38. public function getCc() { 
  39. return $this->cc; 
  40. public function getContent() { 
  41. return $this->content; 
  42.  
  43. public function getAttach() { 
  44. return $this->attach; 
  45.  
  46. public function setTopic($topic) { 
  47. $this->topic = mb_convert_encoding(trim($topic),'UTF-8','auto'); 
  48. public function setToaddr($toaddr) { 
  49. $this->toaddr = trim($toaddr); 
  50.  
  51. public function setCc($cc) { 
  52. $this->cc = trim($cc); 
  53.  
  54. public function setContent($content) { 
  55. $this->content = mb_convert_encoding(trim($content),'UTF-8','auto'); 
  56.  
  57. public function setAttach($attach) { 
  58. $this->attach = trim($attach); 
  59. public function getDomain() { 
  60. return $this->domain; 
  61. public function setDomain($domain) { 
  62. $this->domain = $domain;//输入的值为'@domain.com' 
  63.  
  64. /* 
  65. * 根据系统类型设置换行符 
  66. */ 
  67. private function getEOT() { 
  68. if (strtoupper ( substr ( PHP_OS, 0, 3 ) == 'WIN' )) { 
  69. $this->eol = "rn"
  70. elseif (strtoupper ( substr ( PHP_OS, 0, 3 ) == 'MAC' )) { 
  71. $this->eol= "r"
  72. else { 
  73. $this->eol = "n"
  74.  
  75. private function getBoundary(){ 
  76. $this->boundary= '--'.substr(md5(time().rand(1000,2000)),0,16); 
  77. private function getUniq_id(){ 
  78. $this->uniqid= md5(microtime().time().rand(1,100)); 
  79. private function outputCommonHeader(){ 
  80. $this->header .= 'From: '.$this->fromaddr.$this->eol; 
  81. //$this->header .= 'To: '.$this->toaddr.$this->eol; 
  82. //$this->header .= 'Subject: '.$this->topic.$this->eol; 
  83. $this->header .= 'Message-ID: <'.$this->uniqid.$this->domain.'>'.$this->eol; 
  84. $this->header .= 'MIME-Version: 1.0'.$this->eol; 
  85. $this->header .= 'Reply-To: '.$this->fromaddr.$this->eol; 
  86. $this->header .= 'Return-Path: '.$this->fromaddr.$this->eol; 
  87. $this->header .= 'X-Mailer: Xmail System'.$this->eol; 
  88. $this->header .= 'Content-Disposition: inline'.$this->eol; 
  89. private function mime_content_type ( $f )  
  90. {  
  91. $temp = trim ( exec ('file -bi ' . escapeshellarg ( $f ) ) ) ; 
  92. $temp = preg_replace('/s+/',' ',$temp); 
  93. $temp = explode(' ',$temp); 
  94. return $temp[0]; 
  95. }//判断文件的mime类型 
  96.  
  97. /* 
  98. * 只带有抄送 
  99. */ 
  100. private function mailWithCC(){ 
  101. $this->header .= 'Cc: '.$this->cc.$this->eol; 
  102. $this->header .= 'Content-type: text/html; charset=UTF-8'.$this->eol; 
  103. $this->header .= 'Content-Transfer-Encoding: 8bit'.$this->eol; 
  104. $this->msg = $this->content; 
  105. if(mail($this->toaddr,$this->topic,$this->msg,$this->header)){ 
  106. return 1; 
  107. }else
  108. return 0; 
  109. /* 
  110. * $filedir需要是绝对地址 
  111. */ 
  112. private function attachmentToBase64($filedir){ 
  113. $this->filename = basename($filedir); 
  114. @$fopen = fopen($filedir,'r'); 
  115. $str = fread($fopen,filesize($filedir)); 
  116. $str = base64_encode($str); 
  117. $this->filestr = $str
  118.  
  119. /* 
  120. * 只带有附件 
  121. */ 
  122. private function mailWithAttach(){ 
  123. $this->attachmentToBase64($this->attach); 
  124. $this->header .= 'Content-type: multipart/mixed; boundary="'.str_replace('--','',$this->boundary).'"'.$this->eol; 
  125. $this->msg .= $this->eol.$this->boundary.$this->eol; 
  126. $this->msg .= 'Content-Type: text/html; charset=utf-8'.$this->eol; 
  127. $this->msg .= 'Content-Disposition: inline'.$this->eol; 
  128. $this->msg .= $this->eol.$this->content.$this->eol; 
  129. $this->msg .= $this->boundary.$this->eol; 
  130. $this->msg .= 'Content-Type: '.$this->mime_content_type($this->attach).$this->eol; 
  131. $this->msg .= 'Content-Disposition: attachment; filename="'.$this->filename.'"'.$this->eol; 
  132. $this->msg .= 'Content-Transfer-Encoding: base64'.$this->eol; 
  133. $this->msg .= $this->eol.$this->filestr.$this->eol; 
  134. $this->msg .= $this->eol.$this->boundary.'--'
  135. if(mail($this->toaddr,$this->topic,$this->msg,$this->header)){ 
  136. return 1; 
  137. }else
  138. return 0; 
  139. /* 
  140. * 带有附件和抄送 
  141. */ 
  142. private function mailAll(){ 
  143. $this->attachmentToBase64($this->attach); 
  144. $this->header .= 'Cc: '.$this->cc.$this->eol; 
  145. $this->header .= 'Content-type: multipart/mixed; boundary="'.str_replace('--','',$this->boundary).'"'.$this->eol; 
  146. $this->msg .= $this->eol.$this->boundary.$this->eol; 
  147. $this->msg .= 'Content-Type: text/html; charset=utf-8'.$this->eol; 
  148. $this->msg .= 'Content-Disposition: inline'.$this->eol; 
  149. $this->msg .= $this->eol.$this->content.$this->eol; 
  150. $this->msg .= $this->boundary.$this->eol; 
  151. $this->msg .= 'Content-Type: '.$this->mime_content_type($this->attach).$this->eol; 
  152. $this->msg .= 'Content-Disposition: attachment; filename="'.$this->filename.'"'.$this->eol; 
  153. $this->msg .= 'Content-Transfer-Encoding: base64'.$this->eol; 
  154. $this->msg .= $this->eol.$this->filestr.$this->eol; 
  155. $this->msg .= $this->eol.$this->boundary.'--'
  156. if(mail($this->toaddr,$this->topic,$this->msg,$this->header)){ 
  157. return 1; 
  158. }else
  159. return 0; 
  160. /* 
  161. * 不带抄送和附件 
  162. */ 
  163. private function mailSimple(){ 
  164. $this->header .= 'Content-type: text/html; charset=UTF-8'.$this->eol; 
  165. $this->header .= 'Content-Transfer-Encoding: 8bit'.$this->eol; 
  166. $this->msg = $this->content; 
  167. if(mail($this->toaddr,$this->topic,$this->msg,$this->header)){ 
  168. return 1; 
  169. }else
  170. return 0; 
  171. public function send(){ 
  172. if(emptyempty($this->attach)&&emptyempty($this->cc)){ 
  173. $this->outputCommonHeader(); 
  174. return $this->mailSimple(); 
  175. }else if(emptyempty($this->attach)){ 
  176. $this->outputCommonHeader(); 
  177. return $this->mailWithCC(); 
  178. }else if(emptyempty($this->cc)){ 
  179. $this->outputCommonHeader(); 
  180. $this->getBoundary(); //有附件就生成boundary 
  181. return $this->mailWithAttach(); 
  182. }else if(!emptyempty($this->toaddr)&&!emptyempty($this->topic)&&!emptyempty($this->cc)&&!emptyempty($this->content)&&!emptyempty($this->attach)){ 
  183. $this->outputCommonHeader(); 
  184. $this->getBoundary(); //有附件就生成boundary 
  185. return $this->mailAll(); 

示例代码,有些变量需要上下文环境,代码如下:

  1. $m = new Mail(); 
  2. $m->setToaddr($this->temp['receipt_address']); 
  3. $m->setTopic($this->temp['mail_title']); 
  4. $m->setContent($this->temp['mail_content']); 
  5. $m->setFromaddr($_SESSION['user']['name'].' <'.$_SESSION['user']['name'].'@'.SystemDomain.'>'); 
  6. $m->setDomain('@'.SystemDomain); 
  7. $m->setCc($this->temp['cc_address']); 
  8. $m->setAttach(PATH.'/temp/'.$this->temp['attachment_file']); 
  9. $m->send(); 

优点:使用方便就一个简单的函数

缺点:需要php.ini支持该函数,如果某些服务器不支持而又不能改环境那就不行了而且总是不稳定,发的有时能收到有时不能.

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐