首頁  >  文章  >  後端開發  >  php socket使用smtp發送附附件的郵件

php socket使用smtp發送附附件的郵件

WBOY
WBOY原創
2016-07-25 08:54:431020瀏覽
  1. /**

  2. * php socket smtp寄信
  3. * edit: bbs.it-home.org
  4. */
  5. //define(" SOL", "n");

  6. define("EOL", "rn");
  7. define("SMTP_HOST", "smtp.163.com");//SMTP伺服器
  8. define(" SMTP_PORT", "25");//SMTP伺服器連接埠
  9. define("SMTP_USER", "");//SMTP伺服器的使用者帳號
  10. define("SMTP_PASS", "");//SMTP伺服器的使用者密碼
  11. $from = "";//SMTP伺服器的使用者信箱

  12. $to = "";//傳送給誰可用逗號隔開多個信箱
  13. $cc = "";
  14. $bcc = "";
  15. $subject="這是一個由PHP發送的帶附件的郵件";//郵件主題很多客戶端會有亂碼,所以轉一下碼

  16. $body = "這個是一個帶附件的郵件發送程式
    看到沒,這裡顯示了HTM標籤哦;請點開連結 ".date('Y-m-d H:i:s');//郵件內容
  17. $smtp = new smtp(SMTP_HOST,SMTP_PORT,SMTP_USER,SMTP_PASS, true);//這裡面的一個true是表示使用身份驗證,否則不使用身份驗證.
  18. $smtp->addAttachment("mail .zip");
  19. $smtp->sendmail($to, $from, $subject, $body, $cc, $bcc);
  20. class smtp {

  21. /* Public Variables */

  22. public $attachments = array();
  23. /* Private Variables */
  24. private $smtp_host;
  25. private $smprivate privated $time_out;
  26. private $host_name;
  27. private $auth;
  28. private $user;
  29. private $pass;
  30. private $sock;
  31. /* Constractor */

  32. public function smtp($smtp_host = null, $smtp_port = null, $user = null, $pass = null, $auth = true) {
  33. $this->smtp_host = (!empty($host = (!empty($host =d smtp_host)) ? $smtp_host : SMTP_HOST;
  34. $this->smtp_port = (!empty($smtp_port)) ? $smtp_port : SMTP_PORT;
  35. $this->user = (!empty($user)) ? $user : SMTP_PORT;
  36. $this->pass = (!empty($pass)) ? $pass : SMTP_PORT;
  37. $this->auth = $auth;
  38. $this->time_out = 15 ;
  39. #
  40. $this->host_name = "localhost";
  41. $this->sock = FALSE;
  42. }
  43. /* Main Function */

  44. public function sendmail($to, $from, $subject = "", $body = "", $cc = "", $bcc = "") {
  45. $bndp = md5(uniqid("") ) . rand(1000, 9999);
  46. $bnd = md5(uniqid("")) . rand(1000, 9999);
  47. list ($msec, $sec) = explode(" ", microtime( ));
  48. $mail_from = $this->strip_line_breaks($from);

  49. $mail_to = explode(",", $to);
  50. $body = preg_replace( "/(^|(rn))(\.)/", "", $body);
  51. if ($cc != "") $mail_to = array_merge($mail_to, explode(",", $ cc));
  52. if ($bcc != "") $mail_to = array_merge($mail_to, explode(",", $bcc));
  53. $headers = "MIME -Version:1.0" . EOL;

  54. $headers .= "To: " . $to . EOL;
  55. if ($cc != "") {
  56. $headers .= "Cc: " . $cc . EOL;
  57. }
  58. $headers .= "來自: $from” 。 EOL;
  59. $headers .= "主題:" . $主題。 EOL;
  60. $headers .= "日期: " .日期(“r”)。 EOL;
  61. $headers .= "X-Mailer: Webmail 版本 1.0 (PHP 版本/" . phpversion() . ")" . EOL;
  62. $headers .= "訊息 ID: ” 。 EOL;
  63. if (count($this->attachments) > 0) {
  64. $headers .= "內容類型:多部分/混合;" 。停產。 chr(9) 。 “邊界=”“。$bndp。”“”。停產。 EOL;
  65. $headers .= '--'.$bndp 。 EOL;
  66. $headers .= '內容類型:多部分/替代;邊界=“'。$bnd。'”'。停產。 EOL;
  67. $headers .= '--' 。 $bnd 。 EOL;
  68. $headers .= '內容類型:文字/純文字;字元集=utf-8' 。 EOL;
  69. $headers .= "內容傳輸編碼:8位元" .停產。 EOL;
  70. $headers .= $body . EOL;
  71. $headers .= '--' 。 $bnd 。 EOL;
  72. $headers .= '內容類型:text/html;字元集=utf-8' 。 EOL;
  73. $headers .= "內容傳輸編碼:8位元" .停產。 EOL;
  74. $headers .= $body . EOL;
  75. $headers .= '--' 。 $bnd 。 '--'。停產;
  76. foreach ($this->attachments as $att) {

  77. $headers .= "--" . $bndp .停產。 $att;
  78. }
  79. $headers .= '--' 。 $bndp . '--'。 EOL;
  80. $this->clear_attachments();
  81. } else {
  82. $headers .= 'Content-Type : multipart/alternative;boundary="'.$bnd.'"' 。停產。 EOL;
  83. $headers .= '--'.$bnd 。 EOL;
  84. $headers .= '內容類型:文字/純文字;字元集=utf-8' 。 EOL;
  85. $headers .= "內容傳輸編碼:8位元" .停產。 EOL;
  86. $headers .= $body . EOL;
  87. $headers .= '--'.$bnd 。 EOL;
  88. $headers .= '內容類型:text/html;字元集=utf-8' 。 EOL;
  89. $headers .= "內容傳輸編碼:8位元" .停產。 EOL;
  90. $headers .= $body . EOL;
  91. $headers .= '--'.$bnd.'--' 。停產;
  92. }
  93. $sent = TRUE;

  94. foreach ($mail_to as $rcpt_to) {
  95. $rcpt_to = $this->strip_line_breaks($rcpt_to);
  96. if (!$this->smtp_sockopen($rcpt_to) ) {
  97. $this->log_write("錯誤:無法傳送電子郵件至" . $rcpt_to);
  98. $sent = FALSE;
  99. 繼續;
  100. }
  101. if ($this- >smtp_send($this->host_name, $mail_from, $rcpt_to, $headers, $body)) {
  102. $this->log_write("電子郵件已寄至");
  103. } else {
  104. $this->log_write("錯誤:無法傳送電子郵件至");
  105. $sent = FALSE;
  106. }
  107. fclose($this->sock);
  108. }
  109. $this->log_write("{$mail_to} 寄過來;");
  110. return $ sent;
  111. }
  112. 公用函數addAttachment($file, $dispo = "附件") {

  113. $file_data = (file_exists($file)) ?file_get_contents($file) : "";
  114. if ($file_data != "") {
  115. $filename = basename($file);
  116. $ext = pathinfo($filename, PATHINFO_EXTENSION);
  117. $chunks = chunk_split (base64_encode($file_data));
  118. $parts = "Content-Type: application/$ext; name="" . $filename . """ . EOL;
  119. $parts .= "內容傳輸編碼: base64" . EOL;
  120. $parts .= "內容處置:" . $dispo . "; filename="" .$filename .""" .停產。 EOL;
  121. $parts .= $chunks .停產。 EOL;
  122. $this->attachments[] = $parts;
  123. }
  124. }
  125. private functionclear_attachments() {

  126. unset($this->attachments) ;
  127. $this->attachments = array();
  128. }
  129. /* 私有函數*/

  130. 私有函數smtp_send($helo, $from, $to, $header, $body = "") {
  131. if (!$this->smtp_putcmd("HELO", $ helo)) {
  132. //$this->log_write("錯誤:傳送HELO 指令時發生錯誤。 ($this->user))) {
  133. //$this->log_write("錯誤:傳送HELO 指令時發生錯誤。");
  134. return FALSE;
  135. }
  136. if (! $this->smtp_putcmd("", base64_encode($this->pass))) {
  137. //$this->log_write("錯誤:傳送HELO 指令時發生錯誤。");
  138. return FALSE;
  139. }
  140. }
  141. if (!$this-> smtp_putcmd("MAIL", "FROM:")) {
  142. //$this->log_write( "錯誤:傳送MAIL FROM 指令時發生錯誤。");
  143. 回傳FALSE;
  144. }
  145. if (!$this->smtp_putcmd("RCPT", "TO:")) {
  146. //$this->log_write("錯誤:錯誤傳送RCPT TO 指令時發生。指令時發生錯誤。錯誤:傳送訊息時發生錯誤。發送 時發生錯誤。 ) {
  147. //$this->log_write("錯誤:發送QUIT 指令時發生錯誤。");
  148. return FALSE;
  149. }
  150. return TRUE;
  151. }
  152. private function smtp_sockopen($address) {
  153. if ($this->smtp_host == "") {
  154. return $this->smtp_sockopen_mx ($address);
  155. } else { // bbs.open_mx ($address);
  156. } else { // bbs.itit-home .org
  157. return $this->smtp_sockopen_relay();
  158. }
  159. }
  160. private function smtp_sockopen_relay() {
  161. $this->log_write("tp_sockopen_relay() {
  162. $this->log_write(""tp" . 。 ->time_out);
  163. if (!($this->sock && $this->smtp_ok​​())) {
  164. $this->log_write("錯誤:連接錯誤" . $errstr . " (" . $errno . ")");
  165. return FALSE;
  166. }
  167. $this->log_write("已連接成功");
  168. return TRUE;
  169. }
  170. private function smtp_sockopen_mx($address ) {
  171. $domain = preg_replace("/^.@([^@] )$/", "1", $address);
  172. if (!@getmxrr($domain , $MXHOSTS)) {
  173. $this->log_write("錯誤:無法解析MX "" . $domain . """);
  174. return FALSE;
  175. }
  176. foreach ($MXHOSTS as $host) {
  177. $this->log_write("嘗試" . $host . ":" . $this->smtp_port);
  178. $this->sock = @fsockopen($host, $this-> ; smtp_port, $errno, $errstr, $this->time_out);
  179. if (!($this->sock && $this->smtp_ok​​())) {
  180. $this->log_write ( "連線錯誤," . $errstr . " (" . $errno . ")");
  181. continue;
  182. }
  183. $this->log_write("已連線至mx 主機" . $host) ;
  184. return TRUE;
  185. }
  186. $this->log_write("錯誤:無法連接到任何mx 主機(" . implode(", ", $MXHOSTS) . ")") ;
  187. return FALSE;
  188. }
  189. private function smtp_message($header, $body) {
  190. fputs($this->sock, $header . "rn" . $body);
  191. return TRUEUE;
  192. }
  193. private function smtp_eom() {
  194. fputs($this->sock, "rn.rn");
  195. return $this->smtp_ok​​();
  196. }
  197. private function smtp_ok​​() {
  198. $response = str_replace("rn", "", fgets($this->sock, 512));
  199. if (!preg_match("/ ^[23] /", $response)) {
  200. fputs($this->sock, "QUITrn");
  201. fgets($this->sock, 512);
  202. $this- >log_write("錯誤:遠端主機回傳"" . $response . """);
  203. return FALSE;
  204. }
  205. return TRUE;
  206. }
  207. private function smtp_putcmd($cmd , $
  208. private function smtp_putcmd($cmd , $arg = "") {
  209. if ($arg != "") $cmd = ($cmd == "") ? $arg : ($cmd . " " . $arg);
  210. fputs($this->sock, $cmd . "rn");
  211. return $this->smtp_ok​​();
  212. }
  213. private function strip_line_breaks($address) {
  214. $address = preg_replace("/([trn ]) /", "", $address);
  215. $address = preg_replace("/^.* .*$/", "", $address);
  216. return $address;
  217. }
  218. public function log_write($message) {
  219. $message = date( “M d H:i:s”)。 get_current_user() 。 “[”。 getmypid() 。 ”]:“。 $message;
  220. file_put_contents(dirname(__FILE__) . '/mail.log', $message . PHP_EOL, FILE_APPEND | LOCK_EX);
  221. }
  222. }
  223. 複製程式碼
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn