1 <?php
2 header("Content-Type: text/html; charset=utf-8");
3
4 //引入发送邮件类
5 require("smtp.php");
6 //使用163邮箱服务器
7 $smtpserver = "smtp.163.com";
8 //163邮箱服务器端口
9 $smtpserverport = 25;
10 //你的163服务器邮箱账号
11 $smtpusermail = "****@163.com";//
12 //收件人邮箱,***@163.com/***@qq.com
13 $smtpemailto = "707490440@qq.com";
14 //发送人,可随意显示发件人
15 $sender = "邮件发送方";
16 //你的邮箱账号(去掉@163.com)
17 $smtpuser = "****";//你的163邮箱去掉后面的163.com
18 //你的邮箱密码
19 $smtppass = "*****"; //你的163邮箱SMTP的授权码,千万不要填密码!!!
20
21 //邮件主题
22 $mailsubject = "邮件提醒";
23 //邮件内容
24 $mailbody = "
25 详细信息:</br>
26 <h1>这是一封测试邮件</h1>
27 ";
28 //邮件格式(HTML/TXT),TXT为文本邮件
29 $mailtype = "HTML";
30 //这里面的一个true是表示使用身份验证,否则不使用身份验证.
31 $smtp = new smtp($smtpserver,$smtpserverport,true,$smtpuser,$smtppass);
32 //是否显示发送的调试信息
33 $smtp->debug = TRUE;
34 //发送邮件
35 $smtp->sendmail($smtpemailto, $smtpusermail, $sender ,$mailsubject, $mailbody, $mailtype);
36
37 ?>
1 <?php
2 header("Content-Type: text/html; charset=utf-8");
3
4 class smtp
5 {
6 /* Public Variables */
7 var $smtp_port;
8 var $time_out;
9 var $host_name;
10 var $log_file;
11 var $relay_host;
12 var $debug;
13 var $auth;
14 var $user;
15 var $pass;
16
17 /* Private Variables */
18 var $sock;
19
20 /* Constractor */
21 function smtp($relay_host = "", $smtp_port = 25,$auth = false,$user,$pass)
22 {
23 $this->debug = FALSE;
24 $this->smtp_port = $smtp_port;
25 $this->relay_host = $relay_host;
26 $this->time_out = 30; //is used in fsockopen()
27 $this->auth = $auth;//auth
28 $this->user = $user;
29 $this->pass = $pass;
30 $this->host_name = "localhost"; //is used in HELO command
31 $this->log_file = "";
32 $this->sock = FALSE;
33 }
34
35 /* Main Function */
36 function sendmail($to, $from, $sender, $subject = "", $body = "", $mailtype, $cc = "", $bcc = "", $additional_headers = "")
37 {
38 $mail_from = $this->get_address($this->strip_comment($from));
39 $body = preg_replace("/(^|(
))(.)/", "1.3", $body);
40 $header = "MIME-Version:1.0
";
41 if($mailtype=="HTML")
42 {
43 $header .= "Content-Type:text/html
";
44 }
45 $header .= "To: ".$to."
";
46 if ($cc != "")
47 {
48 $header .= "Cc: ".$cc."
";
49 }
50 $header .= "From: ".$sender."<".$from.">
";
51 $header .= "Subject: ".$subject."
";
52 $header .= $additional_headers;
53 $header .= "Date: ".date("r")."
";
54 $header .= "X-Mailer:By Redhat (PHP/".phpversion().")
";
55 list($msec, $sec) = explode(" ", microtime());
56 $header .= "Message-ID: <".date("YmdHis", $sec).".".($msec*1000000).".".$mail_from.">
";
57 $TO = explode(",", $this->strip_comment($to));
58
59 if ($cc != "")
60 {
61 $TO = array_merge($TO, explode(",", $this->strip_comment($cc)));
62 }
63 if ($bcc != "")
64 {
65 $TO = array_merge($TO, explode(",", $this->strip_comment($bcc)));
66 }
67 $sent = TRUE;
68 foreach ($TO as $rcpt_to)
69 {
70 $rcpt_to = $this->get_address($rcpt_to);
71 if (!$this->smtp_sockopen($rcpt_to))
72 {
73 $this->log_write("Error: Cannot send email to ".$rcpt_to."
");
74 $sent = FALSE;
75 continue;
76 }
77 if ($this->smtp_send($this->host_name, $mail_from, $rcpt_to, $header, $body))
78 {
79 $this->log_write("E-mail has been sent to <".$rcpt_to.">
");
80 }
81 else
82 {
83 $this->log_write("Error: Cannot send email to <".$rcpt_to.">
");
84 $sent = FALSE;
85 }
86 fclose($this->sock);
87 $this->log_write("Disconnected from remote host
");
88 }
89 return $sent;
90 }
91
92 /* Private Functions */
93 function smtp_send($helo, $from, $to, $header, $body = "")
94 {
95 if (!$this->smtp_putcmd("HELO", $helo))
96 {
97 return $this->smtp_error("sending HELO command");
98 }
99
100 #auth
101 if($this->auth)
102 {
103 if (!$this->smtp_putcmd("AUTH LOGIN", base64_encode($this->user)))
104 {
105 return $this->smtp_error("sending HELO command");
106 }
107 if (!$this->smtp_putcmd("", base64_encode($this->pass)))
108 {
109 return $this->smtp_error("sending HELO command");
110 }
111 }
112 if (!$this->smtp_putcmd("MAIL", "FROM:<".$from.">"))
113 {
114 return $this->smtp_error("sending MAIL FROM command");
115 }
116 if (!$this->smtp_putcmd("RCPT", "TO:<".$to.">"))
117 {
118 return $this->smtp_error("sending RCPT TO command");
119 }
120 if (!$this->smtp_putcmd("DATA"))
121 {
122 return $this->smtp_error("sending DATA command");
123 }
124 if (!$this->smtp_message($header, $body))
125 {
126 return $this->smtp_error("sending message");
127 }
128 if (!$this->smtp_eom())
129 {
130 return $this->smtp_error("sending <CR><LF>.<CR><LF> [EOM]");
131 }
132 if (!$this->smtp_putcmd("QUIT"))
133 {
134 return $this->smtp_error("sending QUIT command");
135 }
136 return TRUE;
137 }
138
139 function smtp_sockopen($address)
140 {
141 if ($this->relay_host == "")
142 {
143 return $this->smtp_sockopen_mx($address);
144 }
145 else
146 {
147 return $this->smtp_sockopen_relay();
148 }
149 }
150
151 function smtp_sockopen_relay()
152 {
153 $this->log_write("Trying to ".$this->relay_host.":".$this->smtp_port."
");
154 $this->sock = @fsockopen($this->relay_host, $this->smtp_port, $errno, $errstr, $this->time_out);
155 if (!($this->sock && $this->smtp_ok()))
156 {
157 $this->log_write("Error: Cannot connenct to relay host ".$this->relay_host."
");
158 $this->log_write("Error: ".$errstr." (".$errno.")
");
159 return FALSE;
160 }
161 $this->log_write("Connected to relay host ".$this->relay_host."
");
162 return TRUE;;
163 }
164
165 function smtp_sockopen_mx($address)
166 {
167 $domain = preg_replace("^.+@([^@]+)$", "1", $address);
168 if (!@getmxrr($domain, $MXHOSTS))
169 {
170 $this->log_write("Error: Cannot resolve MX "".$domain.""
");
171 return FALSE;
172 }
173 foreach ($MXHOSTS as $host)
174 {
175 $this->log_write("Trying to ".$host.":".$this->smtp_port."
");
176 $this->sock = @fsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out);
177 if (!($this->sock && $this->smtp_ok()))
178 {
179 $this->log_write("Warning: Cannot connect to mx host ".$host."
");
180 $this->log_write("Error: ".$errstr." (".$errno.")
");
181 continue;
182 }
183 $this->log_write("Connected to mx host ".$host."
");
184 return TRUE;
185 }
186 $this->log_write("Error: Cannot connect to any mx hosts (".implode(", ", $MXHOSTS).")
");
187 return FALSE;
188 }
189
190 function smtp_message($header, $body)
191 {
192 fputs($this->sock, $header."
".$body);
193 $this->smtp_debug("> ".str_replace("
", "
"."> ", $header."
> ".$body."
> "));
194 return TRUE;
195 }
196
197 function smtp_eom()
198 {
199 fputs($this->sock, "
.
");
200 $this->smtp_debug(". [EOM]
");
201 return $this->smtp_ok();
202 }
203
204 function smtp_ok()
205 {
206 $response = str_replace("
", "", fgets($this->sock, 512));
207 $this->smtp_debug($response."
");
208 if (!preg_match("/^[23]/", $response))
209 {
210 fputs($this->sock, "QUIT
");
211 fgets($this->sock, 512);
212 $this->log_write("Error: Remote host returned "".$response.""
");
213 return FALSE;
214 }
215 return TRUE;
216 }
217
218 function smtp_putcmd($cmd, $arg = "")
219 {
220 if ($arg != "")
221 {
222 if($cmd=="")
223 {
224 $cmd = $arg;
225 }
226 else
227 {
228 $cmd = $cmd." ".$arg;
229 }
230 }
231 fputs($this->sock, $cmd."
");
232 $this->smtp_debug("> ".$cmd."
");
233 return $this->smtp_ok();
234 }
235
236 function smtp_error($string)
237 {
238 $this->log_write("Error: Error occurred while ".$string.".
");
239 return FALSE;
240 }
241
242 function log_write($message)
243 {
244 $this->smtp_debug($message);
245 if ($this->log_file == "")
246 {
247 return TRUE;
248 }
249 $message = date("M d H:i:s ").get_current_user()."[".getmypid()."]: ".$message;
250 if (!@file_exists($this->log_file) || !($fp = @fopen($this->log_file, "a")))
251 {
252 $this->smtp_debug("Warning: Cannot open log file "".$this->log_file.""
");
253 return FALSE;;
254 }
255 flock($fp, LOCK_EX);
256 fputs($fp, $message);
257 fclose($fp);
258 return TRUE;
259 }
260
261 function strip_comment($address)
262 {
263 $comment = "/([^()]*)/";
264 while (preg_match($comment, $address))
265 {
266 $address = preg_replace($comment, "", $address);
267 }
268 return $address;
269 }
270
271 function get_address($address)
272 {
273 $address = preg_replace("/([
])+/", "", $address);
274 $address = preg_replace("/^.*<(.+)>.*$/", "1", $address);
275 return $address;
276 }
277
278 function smtp_debug($message)
279 {
280 if ($this->debug)
281 {
282 echo $message;
283 }
284 }
285
286 }
287 ?>