In diesem Artikel wird hauptsächlich der Beispielcode zum Senden von E-Mails basierend auf dem SMTP-Protokoll vorgestellt. Er hat einen gewissen Referenzwert.
SMTP-Protokoll
Wenn wir PHP-Bibliotheken oder -Tools von Drittanbietern zum Versenden von E-Mails verwenden, haben Sie jemals über eine Frage nachgedacht:
Warum können wir nicht selbst PHP-Code schreiben, um die E-Mail-Erkennung zu realisieren, sondern die Bibliotheken anderer Leute verwenden? ? Wolltuch? Wie versende ich E-Mails in PHP?
Zunächst müssen wir die Grundprinzipien des E-Mail-Versands verstehen.
SMTP (Simple Mail Transfer Protocol) ist ein einfaches Mail-Übertragungsprotokoll. Einfach ausgedrückt definiert es eine Reihe von Regeln. Wir müssen diese Regel nur befolgen, um dem SMTP-Server mitzuteilen, dass wir den Absender, den Empfänger, den Inhalt, den Betreff und andere Informationen der E-Mail senden möchten.
Dann analysiert der SMTP-Server die von uns gesendeten Informationen gemäß diesem Regelwerk und sendet schließlich die E-Mail.
Mailserver wie 163 und qq bieten alle SMTP-Dienste an. Wir müssen nur eine Verbindung zu ihren SMTP-Servern herstellen und dann Daten schreiben, um E-Mails zu senden.
Tatsächlich können wir das Linux-Telnet-Tool direkt verwenden, um eine Verbindung zum SMTP-Dienst herzustellen und E-Mails zu senden, ohne Code schreiben zu müssen. Nutzen Sie dies, um den gesamten Prozess des E-Mail-Versands zu verstehen.
Telnet zum Senden von E-Mails
Wir können den Telnet-Befehl in der Linux-Umgebung verwenden, um eine Verbindung zum SMTP-Dienst 163, Port 25, herzustellen (im Allgemeinen verwendet SMTP Port 25). , um den SMTP-Übertragungsprozess zu verstehen.
telnet smtp.163.com 25
Dann erhalten wir die folgenden Ergebnisse, die darauf hinweisen, dass unsere Verbindung erfolgreich ist
Trying 220.181.12.16... Connected to smtp.163.com. Escape character is '^]'. 220 163.com Anti-spam GT for Coremail System (163com[20141201])
Dann führen wir den folgenden Befehl aus, um der anderen Partei mitzuteilen, woher unsere Identität kommt
HELO smtp.163.com
Die andere Partei gibt uns ein 250 OK zurück
und dann AUTH LOGIN ausführen. Sagen Sie der anderen Partei, dass wir mit der Identitätsauthentifizierung beginnen möchten, und dann wird die andere Partei uns mit einigen Nachrichten antworten.
Später geben wir unseren Benutzernamen, unser Passwort, den Inhalt der E-Mail, den Absender, den Empfänger und andere Informationen ein, beenden dann die Konversation und der SMTP-Server hilft uns beim Versenden der E-Mail.
Da das SMTP-Protokoll strenge Anforderungen an das E-Mail-Inhaltsformat stellt und auf der Befehlszeile schwierig auszuführen ist, wird der gesamte Prozess hier nicht ausgeführt. Er wird später vollständig mit PHP-Code implementiert.
Wie aus dem obigen Prozess der Verwendung von Telnet zum Herstellen einer Verbindung zu SMTP-E-Mails hervorgeht, ist der Vorgang des E-Mail-Versands eigentlich sehr einfach. Es besteht darin, eine Verbindung zu Port 25 des SMTP-Dienstes herzustellen und der anderen Partei mitzuteilen, was E-Mail, die wir gemäß dem Protokoll senden möchten. Das hat nichts mit der Plattform oder der Programmiersprache zu tun.
Ob wir C-Sprache, Java oder PHP verwenden, solange wir Socket verwenden, um eine Verbindung zum SMTP-Server herzustellen, können wir E-Mails senden.
SMTP-Befehle
Als wir Telnet verwendet haben, um oben eine Verbindung zum SMTP-Dienst herzustellen, haben wir HELO, AUTH LOGIN usw. eingegeben. Möglicherweise haben Sie Fragen dazu was das sind.
Tatsächlich sind dies die Anweisungen oder Regeln, die durch das SMTP-Protokoll definiert werden. Durch diese Anweisungen weiß der SMTP-Server, was wir tun möchten.
Allgemeine Befehle sind wie folgt:
指令 | 作用 |
---|---|
HELO | 向对方邮件服务器发出的标识自己的身份的命令 |
AUTH LOGIN | 即将进行身份认证 |
MAIL FROM | 告诉对方本次邮件发送人是谁 |
RCPT TO | 发送给谁 |
DATA | 告诉对方本次邮件,接下来我们发送邮件具体内容了 |
QUIT | 邮件内容输入完毕后,执行该指令退出 |
php实现邮件发送
直接上代码
class Mailer { private $host; private $port = 25; private $user; private $pass; private $debug = false; private $sock; public function __construct($host,$port,$user,$pass,$debug = false) { $this->host = $host; $this->port = $port; $this->user = base64_encode($user); //用户名密码一定要使用base64编码才行 $this->pass = base64_encode($pass); $this->debug = $debug; //socket连接 $this->sock = fsockopen($this->host,$this->port); if(!$this->sock){ exit('出错啦'); } //读取smtp服务返回给我们的数据 $response = fgets($this->sock); $this->debug($response); //如果响应中有220返回码,说明我们连接成功了 if(strstr($response,'220') === false){ exit('出错啦'); } } //发送SMTP指令,不同指令的返回码可能不同 public function execCommand($cmd,$return_code){ fwrite($this->sock,$cmd); $response = fgets($this->sock); //输出调试信息 $this->debug('cmd:'.$cmd .';response:'.$response); if(strstr($response,$return_code) === false){ return false; } return true; } public function sendMail($from,$to,$subject,$body){ //detail是邮件的内容,一定要严格按照下面的格式,这是协议规定的 $detail = 'From:'.$from."\r\n"; $detail .= 'To:'.$to."\r\n"; $detail .= 'Subject:'.$subject."\r\n"; $detail .= 'Content-Type: Text/html;'."\r\n"; $detail .= 'charset=gb2312'."\r\n\r\n"; $detail .= $body; $this->execCommand("HELO ".$this->host."\r\n",250); $this->execCommand("AUTH LOGIN\r\n",334); $this->execCommand($this->user."\r\n",334); $this->execCommand($this->pass."\r\n",235); $this->execCommand("MAIL FROM:<".$from.">\r\n",250); $this->execCommand("RCPT TO:<".$to.">\r\n",250); $this->execCommand("DATA\r\n",354); $this->execCommand($detail."\r\n.\r\n",250); $this->execCommand("QUIT\r\n",221); } public function debug($message){ if($this->debug){ echo '<p>Debug:'.$message . PHP_EOL .'</p>'; } } public function __destruct() { fclose($this->sock); } }
调用示例
$port = 25; $user = 'username'; //请替换成你自己的smtp用户名 $pass = 'pass'; //请替换成你自己的smtp密码 $host = 'smtp.163.com'; $from = 'xxxxx@163.com'; $to = 'xxxx@qq.com'; $body = 'hello world'; $subjet = '我是标题'; $mailer = new Mailer($host,$port,$user,$pass,true); $mailer->sendMail($from,$to,$subjet,$body);
在执行指令时有输出调试信息,输出了我们每次执行的指令以及smtp服务返回给我们的响应数据。
因此我们可以看到以下结果
Debug:220 163.com Anti-spam GT for Coremail System (163com[20141201]) Debug:cmd:HELO smtp.163.com ;response:250 OK Debug:cmd:AUTH LOGIN ;response:334 dXNlcm5hbWU6 Debug:cmd:aXR6aG91anVuYmxvZ0AxNjMuY29t ;response:334 UGFzc3dvcmQ6 Debug:cmd:QzBjSGRRNe32xiNGFYUE5oag== ;response:235 Authentication successful Debug:cmd:MAIL FROM: ;response:250 Mail OK Debug:cmd:RCPT TO:<380472723@qq.com> ;response:250 Mail OK Debug:cmd:DATA ;response:354 End data with . Debug:cmd:From:itzhoujunblog@163.com To:380472723@qq.com Subject:我是标题 Content-Type: Text/html; charset=gb2312 hello world . ;response:250 Mail OK queued as smtp11,D8CowACXHE5APdNYCo0hAQ--.19144S2 1490238785 Debug:cmd:QUIT ;response:221 Bye
总结
邮件发送步骤
使用socket连接smtp服务
使用smtp指令进行对话,输入身份信息,邮件信息等
结束对话
以上就是本文的全部内容,希望对大家的学习有所帮助。
相关推荐:
Das obige ist der detaillierte Inhalt vonPHP-Methode zur Implementierung einer E-Mail-Versandinstanz basierend auf dem SMTP-Protokoll. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!