ThinkPHP郵件發送S(Smtp + Mail + phpmailer)

 

  三種郵件發送介紹:(Smtp,Mail以及phpmailer)ThinkPhp 框架下開發。php

  郵件發送配置先前準備(用該帳號作測試用):(這裏用新浪郵箱服務器)將本身的新浪郵箱開通 POP3/SMTP服務:html

新浪郵箱中  :設置->帳戶下面的 POP3/SMTP服務 選擇開通(而後一步一步完成開通)。ajax

 客戶端html代碼:thinkphp

 1 <body>
 2     <!--<h1>發送信息測試</h1>-->
 3     <div>請輸入發送地址(1):<input id="adds" type="text" style="width:180px;" /></div>
 4     <div>主題:<input id="title" type="text" style="width:100px;" /></div>
 5     <div style="width:600px;vertical-align:top;">
 6         發送信息:
 7         <textarea id="msgbody" property="請輸入須要發送的信息..." style="width:180px;height:100px;"></textarea>
 8     </div>
 9     <div>
10         <input type="button" value="發送1" onclick="sendmsg()" />
11     </div>
12 <body>
View Code

  js:json

 1  <script>
 2         function sendmsg() {
 3             var id = document.getElementById("adds").value;
 4             var msg = document.getElementById("msgbody").value;
 5             var title = document.getElementById("title").value;
 6             var par = /^[a-zA-Z0-9_+.-]+\@([a-zA-Z0-9-]+\.)+[a-zA-Z0-9]{2,4}$/;
 7 
 8             if (id == "") {
 9                 alert("輸入發送地址");
10                 return;
11             } else if (!par.exec(id)) {
12                 alert("填寫地址錯誤!");
13                 return;
14             }
15             showloading();
16             $.post('__ROOT__/Home/SendEmail/sendMails', { email: id,title:title, msg: msg }, function (data) {
17                 if (data.status == 1) {
18                     hideloading();
19                    // try {
20                         alert("信息發送成功!");
21                         alert(data.data);
22                    // } catch (e) {
23                      //   alert(e.message);
24                    // }
25                 } else {
26                     hideloading();
27                     alert("未知錯誤!");
28                 }
29             }, 'json');
30         }
31 </script>
View Code

 

 第一種:Smtp(PHP)安全

  1:在ThinkPHP/LibraryLibrary文件夾下新建一個文件夾  HomeClass,在HomeClass 文件夾下新建一個類 命名爲:smtp.class.php。(網上能找到的)服務器

  1 <?php
  2 class smtp
  3 {
  4     /* Public Variables */
  5     var $smtp_port;
  6     var $time_out;
  7     var $host_name;
  8     var $log_file;
  9     var $relay_host;
 10     var $debug;
 11     var $auth;
 12     var $user;
 13     var $pass;
 14 
 15     /* Private Variables */ 
 16     var $sock;
 17 
 18     /* Constractor */
 19 
 20     function smtp($relay_host = "", $smtp_port = 25,$auth = false,$user,$pass)
 21     {
 22         $this->debug = FALSE;
 23         $this->smtp_port = $smtp_port;
 24         $this->relay_host = $relay_host;
 25         $this->time_out = 30; //is used in fsockopen() 
 26         
 27         #
 28 
 29         $this->auth = $auth;//auth
 30         $this->user = $user;
 31         $this->pass = $pass;
 32         
 33         #
 34 
 35         $this->host_name = "localhost"; //is used in HELO command 
 36         $this->log_file = "";
 37         $this->sock = FALSE;
 38     }
 39     /* Main Function */
 40 
 41     function sendmail($to, $from, $subject = "", $body = "", $mailtype, $cc = "", $bcc = "", $additional_headers = "")
 42     {
 43         $mail_from = $this->get_address($this->strip_comment($from));
 44         $body = ereg_replace("(^|(\r\n))(\.)", "\1.\3", $body);
 45         $header = "MIME-Version:1.0\r\n";
 46 
 47         if($mailtype=="HTML"){
 48             $header .= "Content-Type:text/html\r\n";
 49         }
 50 
 51         $header .= "To: ".$to."\r\n";
 52 
 53         if ($cc != "") {
 54             $header .= "Cc: ".$cc."\r\n";
 55         }
 56 
 57         $header .= "From: 報名郵件.<".$from.">\r\n";
 58         $header .= "Subject: ".$subject."\r\n";
 59         $header .= $additional_headers;
 60         $header .= "Date: ".date("r")."\r\n";
 61         $header .= "X-Mailer:By Redhat (PHP/".phpversion().")\r\n";
 62         $utfheader=iconv("UTF-8","GB2312",$header);
 63         list($msec, $sec) = explode(" ", microtime());
 64 
 65         $header .= "Message-ID: <".date("YmdHis", $sec).".".($msec*1000000).".".$mail_from.">\r\n";
 66 
 67         $TO = explode(",", $this->strip_comment($to));
 68 
 69         if ($cc != "") {
 70             $TO = array_merge($TO, explode(",", $this->strip_comment($cc)));
 71         }
 72 
 73 
 74         if ($bcc != "") {
 75             $TO = array_merge($TO, explode(",", $this->strip_comment($bcc)));
 76         }
 77 
 78         $sent = TRUE;
 79 
 80         foreach ($TO as $rcpt_to) {
 81             $rcpt_to = $this->get_address($rcpt_to);
 82             
 83             if (!$this->smtp_sockopen($rcpt_to)) {
 84                 $this->log_write("Error: Cannot send email to ".$rcpt_to."\n");
 85                 $sent = FALSE;
 86                 continue;
 87             }
 88 
 89             if ($this->smtp_send($this->host_name, $mail_from, $rcpt_to, $utfheader, $body)) {
 90                 $this->log_write("E-mail has been sent to <".$rcpt_to.">\n");
 91             } else {
 92                 $this->log_write("Error: Cannot send email to <".$rcpt_to.">\n");
 93                 $sent = FALSE;
 94             }
 95 
 96             fclose($this->sock);
 97 
 98             $this->log_write("Disconnected from remote host\n");
 99         }
100         return $sent;
101     }
102 /* Private Functions */
103     function smtp_send($helo, $from, $to, $header, $body = "")
104     {
105         if (!$this->smtp_putcmd("HELO", $helo)) {
106 
107             return $this->smtp_error("sending HELO command");
108         }
109 
110         #auth
111 
112         if($this->auth){
113             if (!$this->smtp_putcmd("AUTH LOGIN", base64_encode($this->user))) {
114                 return $this->smtp_error("sending HELO command");
115             }
116 
117             if (!$this->smtp_putcmd("", base64_encode($this->pass))) {
118                 return $this->smtp_error("sending HELO command");
119             }
120         }
121 
122         #
123 
124         if (!$this->smtp_putcmd("MAIL", "FROM:<".$from.">")) {
125             return $this->smtp_error("sending MAIL FROM command");
126         }
127 
128         if (!$this->smtp_putcmd("RCPT", "TO:<".$to.">")) {
129             return $this->smtp_error("sending RCPT TO command");
130         }
131 
132         if (!$this->smtp_putcmd("DATA")) {
133             return $this->smtp_error("sending DATA command");
134         }
135         if (!$this->smtp_message($header, $body)) {
136             return $this->smtp_error("sending message");
137         }
138         if (!$this->smtp_eom()) {
139             return $this->smtp_error("sending <CR><LF>.<CR><LF> [EOM]");
140         }
141         if (!$this->smtp_putcmd("QUIT")) {
142             return $this->smtp_error("sending QUIT command");
143         }
144         return TRUE;
145     }
146 
147     function smtp_sockopen($address)
148     {
149         if ($this->relay_host == "") {
150             return $this->smtp_sockopen_mx($address);
151         } else {
152             return $this->smtp_sockopen_relay();
153         }
154     }
155     function smtp_sockopen_relay()
156     {
157         $this->log_write("Trying to ".$this->relay_host.":".$this->smtp_port."\n");
158         $this->sock = @fsockopen($this->relay_host, $this->smtp_port, $errno, $errstr, $this->time_out);
159         if (!($this->sock && $this->smtp_ok())) {
160             $this->log_write("Error: Cannot connenct to relay host ".$this->relay_host."\n");
161             $this->log_write("Error: ".$errstr." (".$errno.")\n");
162             return FALSE;
163         }
164         $this->log_write("Connected to relay host ".$this->relay_host."\n");
165         return TRUE;
166     }
167 
168     function smtp_sockopen_mx($address)
169     {
170         $domain = ereg_replace("^.+@([^@]+)$", "\1", $address);
171         if (!@getmxrr($domain, $MXHOSTS)) {
172             $this->log_write("Error: Cannot resolve MX \"".$domain."\"\n");
173             return FALSE;
174         }
175         foreach ($MXHOSTS as $host) {
176             $this->log_write("Trying to ".$host.":".$this->smtp_port."\n");
177             $this->sock = @fsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out);
178             if (!($this->sock && $this->smtp_ok())) {
179                 $this->log_write("Warning: Cannot connect to mx host ".$host."\n");
180                 $this->log_write("Error: ".$errstr." (".$errno.")\n");
181                 continue;
182             }
183             $this->log_write("Connected to mx host ".$host."\n");
184             return TRUE;
185         }
186         $this->log_write("Error: Cannot connect to any mx hosts (".implode(", ", $MXHOSTS).")\n");
187         return FALSE;
188     }
189 
190     function smtp_message($header, $body)
191     {
192         fputs($this->sock, $header."\r\n".$body);
193         $this->smtp_debug("> ".str_replace("\r\n", "\n"."> ", $header."\n> ".$body."\n> "));
194         return TRUE;
195     }
196 
197     function smtp_eom()
198     {
199         fputs($this->sock, "\r\n.\r\n");
200         $this->smtp_debug(". [EOM]\n");
201         return $this->smtp_ok();
202     }
203 
204     function smtp_ok()
205     {
206         $response = str_replace("\r\n", "", fgets($this->sock, 512));
207         $this->smtp_debug($response."\n");
208         if (!ereg("^[23]", $response)) {
209             fputs($this->sock, "QUIT\r\n");
210             fgets($this->sock, 512);
211             $this->log_write("Error: Remote host returned \"".$response."\"\n");
212             return FALSE;
213         }
214         return TRUE;
215     }
216 
217     function smtp_putcmd($cmd, $arg = "")
218     {
219         if ($arg != "") {
220             if($cmd=="") $cmd = $arg;
221             else $cmd = $cmd." ".$arg;
222         }
223         fputs($this->sock, $cmd."\r\n");
224         $this->smtp_debug("> ".$cmd."\n");
225         return $this->smtp_ok();
226     }
227 
228     function smtp_error($string)
229     {
230         $this->log_write("Error: Error occurred while ".$string.".\n");
231         return FALSE;
232     }
233     
234     function log_write($message)
235     {
236         $this->smtp_debug($message);
237         if ($this->log_file == "") {
238             return TRUE;
239         }
240         $message = date("M d H:i:s ").get_current_user()."[".getmypid()."]: ".$message;
241         if (!@file_exists($this->log_file) || !($fp = @fopen($this->log_file, "a"))) {
242             $this->smtp_debug("Warning: Cannot open log file \"".$this->log_file."\"\n");
243             return FALSE;;
244         }
245         flock($fp, LOCK_EX);
246         fputs($fp, $message);
247         fclose($fp);
248         return TRUE;
249     }
250     
251     function strip_comment($address)
252     {
253         $comment = "\([^()]*\)";
254         while (ereg($comment, $address)) {
255             $address = ereg_replace($comment, "", $address);
256         }
257         return $address;
258     }
259 
260     function get_address($address)
261     {
262         $address = ereg_replace("([ \t\r\n])+", "", $address);
263         $address = ereg_replace("^.*<(.+)>.*$", "\1", $address);
264         return $address;
265     }
266     function smtp_debug($message)
267     {
268         if ($this->debug) {
269         echo $message;
270         }
271     }
272 }
273 ?>
View Code

  2:提交到的後臺控制器  SendEmailController.class.php 框架

 1 public function sendmsg(){
 2         $email = I ( 'post.email' );
 3         $msgs = I('post.msg');
 4         $title=I('post.title');
 5         
 6         import("HomeClass.smtp");//引用發送郵件類
 7         
 8         $smtpserver     =     "smtp.sina.cn";//SMTP服務器
 9         $smtpserverport =    25;//SMTP服務器端口
10         $smtpusermail     =     "******@sina.cn";//SMTP服務器的用戶郵箱
11         $smtpuser         =     "****";//SMTP服務器的用戶賬號
12         $smtppass         =     "*****";//SMTP服務器的用戶密碼
13         
14         $smtpemailto     =     $email;//發送給誰
15         $mailsubject     =     $title;//郵件主題
16         $mailtime        =    date("Y-m-d H:i:s");
17         $mailbody         =     $msgs;//郵件內容
18             
19         $utfmailbody    =    iconv("UTF-8","GB2312",$mailbody);//轉換郵件編碼
20         $mailtype         =     "TXT";//郵件格式(HTML/TXT),TXT爲文本郵件
21             
22         $smtp = new \smtp($smtpserver,$smtpserverport,true,$smtpuser,$smtppass);//這裏面的一個true是表示使用身份驗證,不然不使用身份驗證.
23         $smtp->debug = FALSE;//是否顯示發送的調試信息 FALSE or TRUE
24         
25         $datas = $smtp->sendmail($smtpemailto, $smtpusermail, $mailsubject, $utfmailbody, $mailtype);
26         
27         $this->ajaxReturn ( array (
28                 'data' => $datas,
29                 'status' => 1
30         ) );
31     }
View Code

     其中:$smtpusermail 爲你的新浪郵箱帳號,$smtpuser 爲你新浪郵箱帳號(郵箱去掉@sina.com),$smtppass  爲你的郵箱密碼。第一種郵件發送搞定,你能夠發送郵件去另外一個郵箱了!!!dom

 

    第二種:Mail(ThinkPHP)。ide

    1:配置服務器郵箱:在 Application/conf/config.php 文件中添加郵箱配置:

 1 'THINK_EMAIL' => array (
 2                 
 3                 'SMTP_HOST' => 'smtp.sina.cn',
 4                 'SMTP_PORT' => '25',
 5                 'SMTP_USER' => '******@sina.cn', // SMTP服務器用戶名
 6                 'SMTP_PASS' => '******', // SMTP服務器密碼
 7                 'FROM_EMAIL' => '******@sina.cn', // 發件人EMAIL
 8                 'FROM_NAME' => '****', // 發件人名稱
 9                 'REPLY_EMAIL' => '', // 回覆EMAIL(留空則爲發件人EMAIL)
10 
11                 'REPLY_NAME' => '' 
12         ),
View Code

     SMTP_USER  與 FROM_EMAIL 可爲同一 郵箱地址。

    2:在 HomeClass  文件夾下 新建一個類:Mail.class.php:(網上能找到)

 1 <?php
 2 
 3 namespace HomeClass;
 4 
 5 class Mail {
 6     /**
 7      * 系統郵件發送函數
 8      *
 9      * @param string $to
10      *            接收郵件者郵箱
11      * @param string $name
12      *            接收郵件者名稱
13      * @param string $subject
14      *            郵件主題
15      * @param string $body
16      *            郵件內容
17      * @param string $attachment
18      *            附件列表
19      * @return boolean
20      */
21     function sendMail($to, $name, $subject = '', $body = '', $attachment = null) {
22         $config = C ( 'THINK_EMAIL' );
23         vendor ( 'PHPMailer.class#phpmailer' ); // 從PHPMailer目錄導class.phpmailer.php類文件
24         $mail = new \PHPMailer (); // PHPMailer對象
25         $mail->CharSet = 'UTF-8'; // 設定郵件編碼,默認ISO-8859-1,若是發中文此項必須設置,不然亂碼
26         
27         //$mail->AddAddress($address);//添加聯繫人
28         
29         $mail->IsSMTP (); // 設定使用SMTP服務
30         $mail->SMTPDebug = 0; // 關閉SMTP調試功能
31                               // 1 = errors and messages
32                               // 2 = messages only
33         $mail->SMTPAuth = true; // 啓用 SMTP 驗證功能
34         //$mail->SMTPSecure = 'ssl'; // 使用安全協議
35         $mail->Host = $config ['SMTP_HOST']; // SMTP 服務器
36         $mail->Port = $config ['SMTP_PORT']; // SMTP服務器的端口號
37         $mail->Username = $config ['SMTP_USER']; // SMTP服務器用戶名
38         $mail->Password = $config ['SMTP_PASS']; // SMTP服務器密碼
39         $mail->SetFrom ( $config ['FROM_EMAIL'], $config ['FROM_NAME'] );
40         $replyEmail = $config ['REPLY_EMAIL'] ? $config ['REPLY_EMAIL'] : $config ['FROM_EMAIL'];
41         $replyName = $config ['REPLY_NAME'] ? $config ['REPLY_NAME'] : $config ['FROM_NAME'];
42         $mail->AddReplyTo ( $replyEmail, $replyName );
43         $mail->Subject = $subject;
44         
45         $mail->MsgHTML ( $body );
46         $mail->AddAddress ( $to, '親' );
47         if (is_array ( $attachment )) { // 添加附件
48             foreach ( $attachment as $file ) {
49                 is_file ( $file ) && $mail->AddAttachment ( $file );
50             }
51         }
52         return $mail->Send () ? true : $mail->ErrorInfo;
53     }
54 }
View Code

     3:將前面JS代碼的post提交連接改成 __ROOT__/Home/SendEmail/sendMails2,在剛纔的控制器 SendEmailController.class.php 中添加一個方法: sendMail2().

 1 public function sendMails2(){
 2         $email = I ( 'post.email' );
 3         $msgs = I('post.msg');
 4         $title=I('post.title');
 5         
 6         $msg = \HomeClass\Mail::sendMail ( $email, $email, $title, $msgs );
 7         
 8         $this->ajaxReturn ( array (
 9                 'data' => $msg,
10                 'status' => 1
11         ) );
12     }
View Code

    第三種:PHPMailer(ThinkPHP)

  1:看看ThinkPHP框架的 Library/Vendor 文件夾下是否存在 文件夾  PHPMailer,若是不存在,則在網上找個加入在該文件夾下。

  2:將前面的JS提交連接改成 __ROOT__/Home/SendEmail/sendMails3 ,在控制器裏添加方法 sendMail3():

 1 public function sendmsg3($sendto_email, $user_name='', $subject, $bodyurl)
 2     {    
 3 
 4         $email = I ( 'post.email' );
 5         $title=I('post.title');
 6         $msgs = I('post.msg');
 7 
 8         vendor ( 'PHPMailer.class#phpmailer' );
 9         $mail = new \PHPMailer();
10         $mail->IsSMTP();                  // send via SMTP
11          
12         $mail->Host = "smtp.sina.cn"; // SMTP 服務器
13         $mail->Port = 25; // SMTP服務器的端口號
14         $mail->SMTPAuth = true;           // turn on SMTP authentication
15         $mail->Username = "*****@sina.cn"; // SMTP服務器用戶名
16         $mail->Password = "******"; // SMTP服務器密碼
17     
18         $mail->From = "*******@sina.cn";      // 發件人郵箱
19         //$mail->FromName = "****";;  // 發件人
20     
21         $mail->CharSet = "utf-8";   // 這裏指定字符集!
22         $mail->Encoding = "base64";
23         
24         if($user_name == '')
25         {
26             $user_name=$sendto_email;
27         }
28         $mail->AddAddress($sendto_email,$sendto_email);  // 收件人郵箱和姓名
29     
30         //$mail->WordWrap = 50; // set word wrap 換行字數
31         //$mail->AddAttachment("/var/tmp/file.tar.gz"); // attachment 附件
32         //$mail->AddAttachment("/tmp/image.jpg", "new.jpg");
33         
34         $mail->IsHTML(true);  // send as HTML
35         // 郵件主題
36         $mail->Subject = $subject;
37 
38         //$urls=urlencode($bodyurl);
39         $mail->Body="Hi,歡迎註冊!";
40         $mail->AltBody = "text/html";
41     
42         if (!$mail->Send())
43         {
44             $mail->ClearAddresses();
45             return "郵件錯誤信息: " . $mail->ErrorInfo;
46             exit;
47         }
48         else
49         {
50             $mail->ClearAddresses();
51             // $this->assign('waitSecond', 6);
52             //            $this->success("註冊成功,系統已經向您的郵箱:{$sendto_email}發送了一封激活郵件!請您儘快激活~~<br />");
53             //$this->redirect('sendhtml', array('send' => 5,'email'=>$sendto_email));
54             return "親!已經向您的郵箱:{$sendto_email}發送了一封激活郵件!請您儘快激活~~";
55         }
56     }
View Code

 

  如今能夠給另外一個郵箱發送郵件了!!!

             發送郵件頁面:

        

    接收到的郵件:

      

 

注:以上配置我只在給新浪郵箱發送郵件時成功,給QQ郵箱發送郵件時都已失敗而了結,還搞不懂是爲啥??

 

     ThinkPHP官網郵件發送:  http://www.thinkphp.cn/code/32.html

  PHP郵件發送: http://www.oschina.net/code/snippet_1182150_25127

相關文章
相關標籤/搜索