Heim > Artikel > Backend-Entwicklung > Senden Sie E-Mails über Socket
In diesem Artikel geht es um die Verwendung von Socket zum Senden von E-Mails.
Ich habe zuvor einen Artikel geschrieben ist die Verwendung von nette/mail. Die Komponente sendet E-Mails.
Der folgende Inhalt wurde aus „PHP Core Technology and Best Practices“ zusammengestellt.
PHP verfügt über eine integrierte mail()-Funktion. Wenn Sie jedoch das SMTP-Protokoll zum Senden von E-Mails verwenden möchten, müssen Sie einen SMTP-Server installieren. Wenn Sie es nicht installieren möchten, können Sie Socket zum Senden von E-Mails verwenden. Das SMTP-Protokoll baut auf dem TCP-Protokoll auf, sodass Socket im Prinzip für die Interaktion mit dem SMTP-Server gemäß den Spezifikationen des SMTP-Protokolls verwendet wird.
Der SMTP-Verbindungs- und Sendevorgang läuft wie folgt ab:
1) Stellen Sie eine TCP-Verbindung her.
2) Der Client sendet den HELO-Befehl, um den Absender selbst zu identifizieren, und der Client sendet den MAIL-Befehl. Der Server antwortet mit OK und zeigt damit an, dass er empfangsbereit ist.
3) Melden Sie sich mit dem AUTH-Befehl beim SMTP-Server an und geben Sie den Benutzernamen und das Passwort ein (Beachten Sie, dass sowohl der Benutzername als auch das Passwort Base64-verschlüsselt sein müssen).
4) Der Client sendet einen RCPT-Befehl, um den beabsichtigten Empfänger der E-Mail zu identifizieren. Es können mehrere RCPT-Zeilen vorhanden sein. Der Server antwortet mit „OK“ und zeigt damit an, dass er bereit ist, die E-Mail an den Empfänger zu senden.
5) Nachdem die Verhandlung abgeschlossen ist, verwenden Sie zum Senden den Befehl DATA.
6) Beenden Sie mit einem „.“-Zeichen, senden Sie den Eingabeinhalt zusammen, beenden Sie diesen Versand und beenden Sie den Vorgang mit dem QUIT-Befehl.
Verwenden Sie beispielsweise Telnet, um eine SMTP-Sitzung zu erstellen, wobei S für den Server und C für den Client steht. Der Code lautet wie folgt:
C: open smtp.qq.com 25S: 220 esmtp4.qq.com Esmtp QQ Mail ServerC: HELO smtp qq.comS: 250 esmtp4.qq.comC: AUTH loginS: 334 VXNlcm5hbWU6C: 这里输入使用base64加密过的用户名S: 334 UGFzc3dvcmQ6C: 这里输入使用base64加密过的密码 S:235 Authentication successfulC: MAIL FROM:<liexusong@qq.com>S: 250 sender <liexusong@qq.com> OKC: RCPT TO:<liexusong@163.com>S: 250 recipient <liexusong@163.com> OKC: DATAS: 354 Enter mail,end with "." on a line by itselfC: This is example from smtp protocolC:.S: 250 message sentC: QUITS: 221 goodbye
Ich wollte ursprünglich die qq-Mailbox zum Senden von E-Mails verwenden , aber die Seite ist alt, nachdem SMTP im qq-Postfach aktiviert wurde. Sie können E-Mails normal über das 163-Postfach senden.
Code:
smtp_mail.php
<?php class smtp_mail{ private $host; private $port=25; private $user; private $pwd; private $debug=false; //是否开启调试模式 默认不开启 private $sock; //保存与SMTP服务器连接的句柄 private $mail_format=0; //邮件格式 0为普通文本 1为HTML邮件 public function smtp_mail($host,$port,$user,$pwd,$mail_format=0,$debug=false){ $this->host=$host; $this->port=$port; $this->user=$user; $this->pwd=$pwd; $this->mail_format=$mail_format; $this->debug=$debug; //连接SMTP服务器 /** * fsockopen() 初始化一个套接字连接到指定主 * 最后一个参数为timeout,连接时限 */ $this->sock=fsockopen($this->host,$this->port,$errno,$errstr,10); if (!$this->sock){//连接失败 exit("Error number: $errno, Error message: $errstr\n"); } //取得服务器信息 $response=fgets($this->sock); //若包含220,表示已经成功连接到服务器 if (strstr($response,"220")===false){//首次出现地址|false exit("Server error: $response\n"); } } //将命令发送到服务器,然后取得服务器反馈信息,判断命令是否执行成功 private function do_command($cmd,$return_code){ fwrite($this->sock,$cmd); $response=fgets($this->sock); if (strstr($response,"$return_code")===false){ $this->show_debug($response); return false; } return true; } //发送邮件 public function send_mail($from,$to,$subject,$content){ //判断收发件邮箱地址是否合法 if (!$this->is_email($from) or !$this->is_email($to)){ $this->show_debug('Please enter valid from/to email.'); return false; } //判断主题内容是否为空 if (empty($subject) or empty($content)){ $this->show_debug('Please enter subject/content.'); return false; } //整合邮件信息,发送邮件主体时要以\r\n.\r\n作为结尾 $detail="From:".$from."\r\n"; $detail.="To:".$to."\r\n"; $detail.="Subject:".$subject."\r\n"; if ($this->mail_format==1){ $detail.="Content-Type: text/html;\r\n"; }else{ $detail.="Content-Type: text/plain;\r\n"; } $detail.="charset=utf-8\r\n\r\n"; $detail.=$content; //此处应该有判断命令是否执行成功 $this->do_command("HELO smtp.qq.com\r\n",250); $this->do_command("AUTH LOGIN\r\n",334); $this->do_command("$this->user\r\n",334); $this->do_command("$this->pwd\r\n",235); $this->do_command("MAIL FROM:<".$from.">\r\n",250); $this->do_command("RCPT TO:<".$to.">\r\n",250); $this->do_command("DATA\r\n",354); $this->do_command($detail."\r\n.\r\n",250); $this->do_command("QUIT\r\n",221); return true; } //判断是否为合法邮箱 private function is_email($emial){ if(filter_var($emial,FILTER_VALIDATE_EMAIL)){ return true; }else{ return false; } } //显示调试信息 private function show_debug($message){ if ($this->debug){ echo "<p>Debug: $message</p><br/>"; } } }
index.php
<?phpinclude_once "smtp_mail.php";$host="smtp.163.com";$port=25;$user="你的账户名@163.com";$pwd="授权码";$from="你的账户名@163.com";$to="目标邮箱";$subject="Test Smtp Mail";$content="This is example email for you.";$mail=new smtp_mail($host,$port,base64_encode($user),base64_encode($pwd),1,true);$mail->send_mail($from,$to,$subject,$content);
Verwandte Empfehlungen:
php implementiert das Senden der hexadezimalen Socket-Methode
PHP-Methode zum Implementieren von Socket
Detailliertes Beispiel für die PHP-Socket-Programmierung
Das obige ist der detaillierte Inhalt vonSenden Sie E-Mails über Socket. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!