利用php中mail函数发送带有附件的邮件
来源:程序员人生 发布时间:2014-06-02 22:00:39 阅读次数:4276次
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系统):
- [mail function]
- ; For Win32 only.
- SMTP =smtp.sohu.com
- mtp_port=25
- ; For Win32 only.
- sendmail_from = 填上你的电子邮件全称。
此处为以sohu的邮件服务器设置,如果你用163的邮箱,则设置为:smtp.163.com
2.在C盘搜索php.ini,选择不是快捷方式的那一个php.ini,应该在C/WINDOWS里面的,打开它,如上面一样修改它,保存,设置完后,记得重启Apache服务器,然后mail()函数就可以用了,示例代码如下:
- <?php
-
- $headers = "MIME-Version: 1.0" . "rn";
- $headers .= "Content-type:text/html; charset=utf-8";
- mail($to,$subject,$message,$headers);
- ?>
上面函数不可以带附件了,下面我们升级一下,代码如下:
- <?php
- class Mail {
- private $topic;
- private $toaddr;
- private $fromaddr;
- private $cc;
- private $content;
- private $attach;
- private $header;
- private $domain;
- private $msg;
- private $filename;
- private $filemime;
- private $filestr;
- private $boundary;
- private $uniqid;
- private $eol;
-
- function __construct(){
- $this->getEOT();
- $this->getUniq_id();
- $this->header='';
- $this->attach='';
- $this->cc='';
- $this->msg='';
-
- }
-
- public function getFromaddr() {
- return $this->fromaddr;
- }
- public function setFromaddr($fromaddr) {
- $this->fromaddr = $fromaddr;
- }
- public function getTopic() {
- return $this->topic;
- }
-
- public function getToaddr() {
- return $this->toaddr;
- }
-
- public function getCc() {
- return $this->cc;
- }
- public function getContent() {
- return $this->content;
- }
-
- public function getAttach() {
- return $this->attach;
- }
-
- public function setTopic($topic) {
- $this->topic = mb_convert_encoding(trim($topic),'UTF-8','auto');
- }
- public function setToaddr($toaddr) {
- $this->toaddr = trim($toaddr);
- }
-
- public function setCc($cc) {
- $this->cc = trim($cc);
- }
-
- public function setContent($content) {
- $this->content = mb_convert_encoding(trim($content),'UTF-8','auto');
- }
-
- public function setAttach($attach) {
- $this->attach = trim($attach);
- }
- public function getDomain() {
- return $this->domain;
- }
- public function setDomain($domain) {
- $this->domain = $domain;
- }
-
-
-
-
- private function getEOT() {
- if (strtoupper ( substr ( PHP_OS, 0, 3 ) == 'WIN' )) {
- $this->eol = "rn";
- } elseif (strtoupper ( substr ( PHP_OS, 0, 3 ) == 'MAC' )) {
- $this->eol= "r";
- } else {
- $this->eol = "n";
- }
- }
-
- private function getBoundary(){
- $this->boundary= '--'.substr(md5(time().rand(1000,2000)),0,16);
- }
- private function getUniq_id(){
- $this->uniqid= md5(microtime().time().rand(1,100));
- }
- private function outputCommonHeader(){
- $this->header .= 'From: '.$this->fromaddr.$this->eol;
-
-
- $this->header .= 'Message-ID: <'.$this->uniqid.$this->domain.'>'.$this->eol;
- $this->header .= 'MIME-Version: 1.0'.$this->eol;
- $this->header .= 'Reply-To: '.$this->fromaddr.$this->eol;
- $this->header .= 'Return-Path: '.$this->fromaddr.$this->eol;
- $this->header .= 'X-Mailer: Xmail System'.$this->eol;
- $this->header .= 'Content-Disposition: inline'.$this->eol;
- }
- private function mime_content_type ( $f )
- {
- $temp = trim ( exec ('file -bi ' . escapeshellarg ( $f ) ) ) ;
- $temp = preg_replace('/s+/',' ',$temp);
- $temp = explode(' ',$temp);
- return $temp[0];
- }
-
-
-
-
- private function mailWithCC(){
- $this->header .= 'Cc: '.$this->cc.$this->eol;
- $this->header .= 'Content-type: text/html; charset=UTF-8'.$this->eol;
- $this->header .= 'Content-Transfer-Encoding: 8bit'.$this->eol;
- $this->msg = $this->content;
- if(mail($this->toaddr,$this->topic,$this->msg,$this->header)){
- return 1;
- }else{
- return 0;
- }
- }
-
-
-
- private function attachmentToBase64($filedir){
- $this->filename = basename($filedir);
- @$fopen = fopen($filedir,'r');
- $str = fread($fopen,filesize($filedir));
- $str = base64_encode($str);
- $this->filestr = $str;
- }
-
-
-
-
- private function mailWithAttach(){
- $this->attachmentToBase64($this->attach);
- $this->header .= 'Content-type: multipart/mixed; boundary="'.str_replace('--','',$this->boundary).'"'.$this->eol;
- $this->msg .= $this->eol.$this->boundary.$this->eol;
- $this->msg .= 'Content-Type: text/html; charset=utf-8'.$this->eol;
- $this->msg .= 'Content-Disposition: inline'.$this->eol;
- $this->msg .= $this->eol.$this->content.$this->eol;
- $this->msg .= $this->boundary.$this->eol;
- $this->msg .= 'Content-Type: '.$this->mime_content_type($this->attach).$this->eol;
- $this->msg .= 'Content-Disposition: attachment; filename="'.$this->filename.'"'.$this->eol;
- $this->msg .= 'Content-Transfer-Encoding: base64'.$this->eol;
- $this->msg .= $this->eol.$this->filestr.$this->eol;
- $this->msg .= $this->eol.$this->boundary.'--';
- if(mail($this->toaddr,$this->topic,$this->msg,$this->header)){
- return 1;
- }else{
- return 0;
- }
- }
-
-
-
- private function mailAll(){
- $this->attachmentToBase64($this->attach);
- $this->header .= 'Cc: '.$this->cc.$this->eol;
- $this->header .= 'Content-type: multipart/mixed; boundary="'.str_replace('--','',$this->boundary).'"'.$this->eol;
- $this->msg .= $this->eol.$this->boundary.$this->eol;
- $this->msg .= 'Content-Type: text/html; charset=utf-8'.$this->eol;
- $this->msg .= 'Content-Disposition: inline'.$this->eol;
- $this->msg .= $this->eol.$this->content.$this->eol;
- $this->msg .= $this->boundary.$this->eol;
- $this->msg .= 'Content-Type: '.$this->mime_content_type($this->attach).$this->eol;
- $this->msg .= 'Content-Disposition: attachment; filename="'.$this->filename.'"'.$this->eol;
- $this->msg .= 'Content-Transfer-Encoding: base64'.$this->eol;
- $this->msg .= $this->eol.$this->filestr.$this->eol;
- $this->msg .= $this->eol.$this->boundary.'--';
- if(mail($this->toaddr,$this->topic,$this->msg,$this->header)){
- return 1;
- }else{
- return 0;
- }
- }
-
-
-
- private function mailSimple(){
- $this->header .= 'Content-type: text/html; charset=UTF-8'.$this->eol;
- $this->header .= 'Content-Transfer-Encoding: 8bit'.$this->eol;
- $this->msg = $this->content;
- if(mail($this->toaddr,$this->topic,$this->msg,$this->header)){
- return 1;
- }else{
- return 0;
- }
- }
- public function send(){
- if(emptyempty($this->attach)&&emptyempty($this->cc)){
- $this->outputCommonHeader();
- return $this->mailSimple();
- }else if(emptyempty($this->attach)){
- $this->outputCommonHeader();
- return $this->mailWithCC();
- }else if(emptyempty($this->cc)){
- $this->outputCommonHeader();
- $this->getBoundary();
- return $this->mailWithAttach();
- }else if(!emptyempty($this->toaddr)&&!emptyempty($this->topic)&&!emptyempty($this->cc)&&!emptyempty($this->content)&&!emptyempty($this->attach)){
- $this->outputCommonHeader();
- $this->getBoundary();
- return $this->mailAll();
- }
- }
- }
示例代码,有些变量需要上下文环境,代码如下:
- $m = new Mail();
- $m->setToaddr($this->temp['receipt_address']);
- $m->setTopic($this->temp['mail_title']);
- $m->setContent($this->temp['mail_content']);
- $m->setFromaddr($_SESSION['user']['name'].' <'.$_SESSION['user']['name'].'@'.SystemDomain.'>');
- $m->setDomain('@'.SystemDomain);
- $m->setCc($this->temp['cc_address']);
- $m->setAttach(PATH.'/temp/'.$this->temp['attachment_file']);
- $m->send();
优点:使用方便就一个简单的函数
缺点:需要php.ini支持该函数,如果某些服务器不支持而又不能改环境那就不行了而且总是不稳定,发的有时能收到有时不能.
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠