科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件在PHP中用Socket发送电子邮件

在PHP中用Socket发送电子邮件

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

一个直接使用socket,向指定的邮箱发送邮件的类。

作者:PConline 来源:PConline 2007年9月15日

关键字: 软件

  • 评论
  • 分享微博
  • 分享邮件
下面是真正的秘密了,可要看仔细了。:)

--------------------------------------------------------------------------------

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类的实现,应该不是很难的。

下面给出一个实例。

邮件发送实例

先给出一个最简单的实例:

--------------------------------------------------------------------------------

1 include "sendmail.class.php3";

2 $email="Hello, this is a test letter!";

3 $sendmail=new send_mail("smtp.263.net", "limodou", true); //显示调示信息

4 if($sendmail->send("chatme@263.net", "chatme@263.net", "test", $email))

5 {

6 echo "发送成功!

";

7 }

8 else

9 {

10 echo "发送失败!

";

11 }

?>

--------------------------------------------------------------------------------

第1行,装入send_mail类。

第3行,创建一个类的实例,且设置显示调示信息,如果不想显示,可以

  $sendmail=new send_mail("smtp.263.net");。

第4行,发送邮件。

很简单,不是吗?下面再给合以前的发送MIME邮件的例子,给出一个发送HTML附件的例子。

--------------------------------------------------------------------------------

include "MIME.class.php3";

//注,在发送MIME邮件一文中,这个类文件名为MIME.class,在此处我改成这样的

$to = 'chatme@263.net'; //改为收信人的邮箱

$str = "Newsletter for ".date('M Y', time());

//信息被我改少了

$html_data = '

Hello! This is a test!

';

//生成MIME类实例

$mime = new MIME_mail("chatme@263.net", $to, $str);

//添加HTML附件

$mime->attach($html_data, "", HTML, BASE64);

//注释掉,采用我的发送邮件处理

//$mime->send_mail();

//生成邮件

$mime->gen_email();

//显示邮件信息

//echo $mime->email."

";

//包含sendmail文件

include "sendmail.class.php3";

//创建实例

$sendmail=new send_mail("smtp.263.net", "limodou", true);

//发送邮件

$sendmail->send("chatme@263.net", "chatme@263.net", $str, $mime->email);

?>

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章