>백엔드 개발 >PHP 튜토리얼 >在PHP中用Socket发送电子邮件(三)_PHP

在PHP中用Socket发送电子邮件(三)_PHP

WBOY
WBOY원래의
2016-06-01 12:42:51859검색

邮件发送处理

  下面是真正的秘密了,可要看仔细了。:)


1    function send( $to,$from,$subject,$message)
2    {
3
4        //连接服务器
5        $this->lastact=\"connect\";
6
7        $this->show_debug(\"Connect to SMTP server : \".$this->smtp, \"out\");
8        $this->fp = fsockopen ( $this->smtp, $this->port );
9        if ( $this->fp )
10        {
11
12            set_socket_blocking( $this->fp, true );
13            $this->lastmessage=fgets($this->fp,512);
14            $this->show_debug($this->lastmessage, \"in\");
15
16            if (! ereg ( \"^220\", $this->lastmessage ) )
17            {
18                return false;
19            }
20            else
21            {
22                $this->lastact=\"HELO \" . $this->welcome . \"\n\";
23                if(!$this->do_command($this->lastact, \"250\"))
24                {
25                    fclose($this->fp);
26                    return false;
27                }
28
29                $this->lastact=\"MAIL FROM: $from\" . \"\n\";
30                if(!$this->do_command($this->lastact, \"250\"))
31                {
32                    fclose($this->fp);
33                    return false;
34                }
35
36                $this->lastact=\"RCPT TO: $to\" . \"\n\";
37                if(!$this->do_command($this->lastact, \"250\"))
38                {
39                    fclose($this->fp);
40                    return false;
41                }
42               
43                //发送正文
44                $this->lastact=\"DATA\n\";
45                if(!$this->do_command($this->lastact, \"354\"))
46                {
47                    fclose($this->fp);
48                    return false;
49                }
50
51                //处理Subject头
52                $head=\"Subject: $subject\n\";
53                if(!empty($subject) && !ereg($head, $message))
54                {
55                    $message = $head.$message;
56                }
57               
58                //处理From头
59                $head=\"From: $from\n\";
60                if(!empty($from) && !ereg($head, $message))
61                {
62                    $message = $head.$message;
63                }
64
65                //处理To头
66                $head=\"To: $to\n\";
67                if(!empty($to) && !ereg($head, $message))
68                {
69                    $message = $head.$message;
70                }
71
72                //加上结束串
73                if(!ereg(\"\n\.\n\", $message))
74                    $message .= \"\n.\n\";
75                $this->show_debug($message, \"out\");
76                fputs($this->fp, $message);
77
78                $this->lastact=\"QUIT\n\";
79                if(!$this->do_command($this->lastact, \"250\"))
80                {
81                    fclose($this->fp);
82                    return false;
83                }
84            }
85            return true;
86        }
87        else
88        {
89            $this->show_debug(\"Connect failed!\", \"in\");
90            return false;
91        }
92    }
--------------------------------------------------------------------------------  有些意思很清楚的我就不说了。

  这个函数一共有四个参数,分别是$to表示收信人,$from表示发信人,$subject表求邮件主题和$message表示邮件体。如果处理成功则返回true,失败则返回false。

第8行,连接邮件服务器,如果成功响应码应为220。
第12行,设置阻塞模式,表示信息必须返回才能继续。详细说明看手册吧。
第16行,判断响应码是否为220,如果是,则继续处理,否则出错返回。
第22-27行,处理HELO指令,期望响应码为250。
第29-34行,处理MAIL FROM指令,期望响应码为250。
第36-41行,处理RCPT TO指令,期望响应码为250。
第44-49行,处理DATA指令,期望响应码为354。
第51-76行,生成邮件体,并发送。
第52-56行,如果$subject不为空,则查找邮件体中是否有主题部分,如果没有,则加上主题部分。
第59-63行,如果$from不为空,则查找邮件体中是否有发信人部分,如果没有,则加上发信人部分。
第66-70行,如果$to不为空,则查找邮件体中是否有收信人部分,如果没有,则加上收信人部分。
第73-74行,查找邮件体是否有了结束行,如果没有则加上邮件体的结束行(以\".\"作为单独的一行的特殊行)。
第76行,发送邮件体。
第78-83行,执行QUIT结否与服务器的连接,期望响应码为250。
第85行,返回处理成功标志(true)。
第81-91行,与服务器连接失败的处理。
 以上为整个send_mail类的实现,应该不是很难的。

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.