ホームページ  >  記事  >  バックエンド開発  >  PHP で書かれた SMTP 電子メール送信クラス

PHP で書かれた SMTP 電子メール送信クラス

WBOY
WBOYオリジナル
2016-07-25 08:54:40861ブラウズ
  1. $smtpserver = "*****";
  2. $smtpserverport = 25;
  3. $smtpuser = "******";
  4. $smtppass = "***** **";
  5. $smtp = new smtp($smtpserver, $smtpserverport, true, $smtpuser, $smtppass); //ここで true は認証が使用されることを意味し、それ以外の場合は認証は使用されません。
  6. $smtp-> ;debug = false;
  7. //$emailtype = "HTML";
  8. for ($i=0; $i<5; $i++) {
  9. $smtp->sendmail("*****", "* ** ***", "Hello world!","これは単なるテストです!");
  10. }
  11. echo "合計 $i のメールが送信されました。 ";
  12. ?>
コードをコピー

以下は特定のクラスの実装です。

  1. class smtp {

  2. /* パブリック変数 */
  3. var $smtp_port;
  4. var $time_out;
  5. var $host_name;
  6. var $log_file;
  7. var $relay_host;
  8. var $debug;
  9. var $auth;
  10. var $user;
  11. var $pass;
  12. /* プライベート変数 */
  13. var $sock;
  14. /* コンストラクター */
  15. function smtp($relay_host = "", $smtp_port = 25、$auth = false、$user、$pass)
  16. {
  17. $this->debug = false;
  18. $this->smtp_port = $smtp_port;
  19. $this->relay_host = $relay_host;
  20. $ this->time_out = 30; // fsockopen() で使用されます
  21. $this->auth = $auth; //auth
  22. $this->user = $user;
  23. $this->pass = $pass;
  24. $this->host_name = "localhost"; //HELO コマンドで使用されます
  25. $this->log_file = "";
  26. $this->sock = false;
  27. }
  28. /* Main Function */
  29. function sendmail($to, $from, $subject = "", $body = "", $mailtype= "", $cc = "", $bcc = "", $Additional_headers = "")
  30. {
  31. $mail_from = $this->get_address($this-> ;strip_comment($from));
  32. $body = ereg_replace("(^|( ))(.)", "1.3", $body);
  33. $header .= "MIME-Version:1.0 ";
  34. if ( $mailtype == "HTML") {
  35. $header .= "Content-Type:text/html ";
  36. }
  37. $header .= "To: " . $to 。 " ";
  38. if ($cc != "") {
  39. $header .= "Cc: " . $cc 。 " ";
  40. }
  41. $header .= "差出人: $from<" 。 $から。 ">; ";
  42. $header .= "件名: " . $subject 。 " ";
  43. $header .= $Additional_headers;
  44. $header .= "日付: " . date("r") . " ";
  45. $header .= "X-Mailer:By Redhat (PHP/" . phpversion() . ") ";
  46. list($msec, $sec) =explode(" ", microtime());
  47. $ header .= "メッセージID: $TO =explode(",", $this->strip_comment($to));
  48. if ($cc != "") {
  49. $TO = array_merge($TO,explode( ",", $this->strip_comment($cc)));
  50. }
  51. if ($bcc != "") {
  52. $TO = array_merge($TO,explode(",", $this->ストリップコメント($bcc)));
  53. }
  54. $sent = true;
  55. foreach ($TO as $rcpt_to) {
  56. $rcpt_to = $this->get_address($rcpt_to);
  57. if (!$this-> smtp_sockopen($rcpt_to)) {
  58. $this->log_write("エラー: " . $rcpt_to . " " にメールを送信できません);
  59. $sent = false;
  60. continue;
  61. }
  62. if ($this-> smtp_send($this->host_name, $mail_from, $rcpt_to, $header, $body)) {
  63. $this->log_write("電子メールが <" . $rcpt_to . ">; に送信されました。 ");
  64. } else {
  65. $this->log_write("エラー: <" . $rcpt_to . "> に電子メールを送信できません。");
  66. $sent = false;
  67. }
  68. fclose($this- >sock);
  69. $this->log_write("リモート ホストから切断されました ");
  70. }
  71. return $sent;
  72. }

  73. /* プライベート関数 */

  74. function smtp_send($helo, $from, $to, $header, $body = "")
  75. {
  76. if (!$this->smtp_putcmd("HELO", $helo)) {
  77. return $this->smtp_error("sending HELO command");
  78. }
  79. // auth
  80. if ($this->auth) {
  81. if (!$this->smtp_putcmd("AUTH LOGIN",base64_encode) ($this->user))) {
  82. return $this->smtp_error("HELO コマンドの送信中");
  83. }
  84. if (!$this->smtp_putcmd("", Base64_encode($this->gt; pass))) {
  85. return $this->smtp_error("HELO コマンドの送信");
  86. }
  87. }
  88. if (!$this->smtp_putcmd("MAIL", "FROM:<" . $from . ">;")) {
  89. return $this->smtp_error("sending MAIL FROM command");
  90. }
  91. if (!$this->smtp_putcmd("RCPT", "TO:<" . $に . ">;")) {
  92. return $this->smtp_error("RCPT TO コマンドを送信中");
  93. }
  94. if (!$this->smtp_putcmd("DATA")) {
  95. return $this->smtp_error("DATA コマンドの送信");
  96. }
  97. if (!$this->smtp_message($header, $ body)) {
  98. return $this->smtp_error("送信中メッセージ");
  99. }
  100. if (!$this->smtp_eom()) {
  101. return $this->smtp_error("送信中 ; ;;.;; [EOM]");
  102. }
  103. if (!$this->smtp_putcmd("QUIT")) {
  104. return $this->smtp_error ("QUIT コマンドを送信中");
  105. }
  106. return true;
  107. }
  108. function smtp_sockopen($address)
  109. {
  110. if ($this->relay_host == "") {
  111. return $this->smtp_sockopen_mx($ address);
  112. } else {
  113. return $this->smtp_sockopen_relay();
  114. }
  115. }
  116. function smtp_sockopen_relay()
  117. {
  118. $this->log_write(" . $this->relay_host . " を試行しています:" . $this->smtp_port . " ");
  119. $this->sock = @fsockopen($this->relay_host, $this->smtp_port, $errno, $errstr, $this-> time_out);
  120. if (!($this->sock && $this->smtp_ok​​())) {
  121. $this->log_write("エラー: リレー ホストに接続できません " . $this->relay_host 。 " ");
  122. $this->log_write("エラー: " . $errstr . " (" . $errno . ") ");
  123. return false;
  124. }
  125. $this->log_write("リレーに接続しましたhost " . $this->relay_host . " ");
  126. return true;;
  127. }
  128. function smtp_sockopen_mx($address)
  129. {
  130. $domain = ereg_replace("^.+@([^@]+)$" , "1", $address);
  131. if (!@getmxrr($domain, $MXHOSTS)) {
  132. $this->log_write("エラー: MX を解決できません "" . $domain . "" ");
  133. return false;
  134. }
  135. foreach ($MXHOSTS as $host) {
  136. $this->log_write("Trying to " . $host . ":" . $this->smtp_port . " ");
  137. $this- >sock = @fsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out);
  138. if (!($this->sock && $this->smtp_ok​​( ))) {
  139. $this->log_write("警告: mx ホストに接続できません " . $host . " ");
  140. $this->log_write("エラー: " . $errstr . " (" . $ errno . ") ");
  141. continue;
  142. }
  143. $this->log_write("mx ホストに接続しました " . $host 。 " ");
  144. return true;
  145. }
  146. $this->log_write("エラー: どの mx ホストにも接続できません (" . implode(", ", $MXHOSTS) . ") ");
  147. return false;
  148. }
  149. function smtp_message($header, $body)
  150. {
  151. fputs($this->sock, $header . " " . $body);
  152. $this->smtp_debug(">; " . str_replace(" ", " " . ">; ", $header . " >; " . $body . " >; "));
  153. 関数 smtp_eom()
  154. {
  155. fputs($this- >sock, " . ");
  156. $this->smtp_debug(". [EOM] ");
  157. return $this->smtp_ok​​();
  158. }
  159. function smtp_ok​​()
  160. {
  161. $response = str_replace (" ", "", fgets($this->sock, 512));
  162. $this->smtp_debug($response . " ");
  163. if (!ereg("^[23]", $response )) {
  164. fputs($this->sock, "QUIT ");
  165. fgets($this->sock, 512);
  166. $this->log_write("エラー: リモート ホストが "" を返しました。 $response . "" ");
  167. return false;
  168. }
  169. return true;
  170. }
  171. function smtp_putcmd($cmd, $arg = "")
  172. {
  173. if ($arg != "") {
  174. if ($cmd = = "") $cmd = $arg;
  175. else $cmd = $cmd 。 「」。 $arg;
  176. }
  177. fputs($this->sock, $cmd . " ");
  178. $this->smtp_debug(">gt;; " . $cmd . " ");
  179. return $this-> smtp_ok​​();
  180. }
  181. function smtp_error($string)
  182. {
  183. $this->log_write("Error: " . $string . ". " 中にエラーが発生しました。);
  184. return false;
  185. }
  186. function log_write($message)
  187. {
  188. $this->smtp_debug($message);
  189. if ($this->log_file == "") {
  190. return true;
  191. }
  192. $message = date("M d H:i:s ") 。 get_current_user() 。 「[」。 getmypid() 。 "]: " 。 $message;
  193. if (!@file_exists($this->log_file) || !($fp = @fopen($this->log_file, "a"))) {
  194. $this->smtp_debug("警告: ログ ファイル "" を開くことができません。 $this->log_file 。 "" ");
  195. return false;;
  196. }
  197. flock($fp, $message);
  198. fclose( $fp);
  199. return true;
  200. }
  201. function Stripe_comment($address)
  202. {
  203. $comment = "([^()]*)";
  204. while (ereg($comment, $address)) {
  205. $address = ereg_replace($comment, "", $address);
  206. }
  207. return $address;
  208. }
  209. function get_address($address)
  210. {
  211. $address = ereg_replace("([ ])+", "", $address );
  212. $address = ereg_replace("^.*<(.+)>;.*$", "1", $address);
  213. return $address;
  214. }
  215. function smtp_debug($message)
  216. {
  217. if ($this->debug) {
  218. echo $message . ";";
  219. }
  220. }
  221. }
  222. ?>

复制幣

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。