PHP-Methode zur Implementierung einer E-Mail-Versandinstanz basierend auf dem SMTP-Protokoll

墨辰丷
Freigeben: 2023-03-27 16:52:01
Original
1974 Leute haben es durchsucht

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
Nach dem Login kopieren

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])
Nach dem Login kopieren

Dann führen wir den folgenden Befehl aus, um der anderen Partei mitzuteilen, woher unsere Identität kommt

HELO smtp.163.com
Nach dem Login kopieren

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 &#39;<p>Debug:&#39;.$message . PHP_EOL .&#39;</p>&#39;;
    }
  }

  public function __destruct()
  {
    fclose($this->sock);
  }

}
Nach dem Login kopieren

调用示例

$port = 25;
$user = &#39;username&#39;; //请替换成你自己的smtp用户名
$pass = &#39;pass&#39;; //请替换成你自己的smtp密码
$host = &#39;smtp.163.com&#39;;
$from = &#39;xxxxx@163.com&#39;; 
$to = &#39;xxxx@qq.com&#39;;
$body = &#39;hello world&#39;;
$subjet = &#39;我是标题&#39;;
$mailer = new Mailer($host,$port,$user,$pass,true);
$mailer->sendMail($from,$to,$subjet,$body);
Nach dem Login kopieren

在执行指令时有输出调试信息,输出了我们每次执行的指令以及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
Nach dem Login kopieren

总结

邮件发送步骤

  1. 使用socket连接smtp服务

  2. 使用smtp指令进行对话,输入身份信息,邮件信息等

  3. 结束对话

以上就是本文的全部内容,希望对大家的学习有所帮助。


相关推荐:

php查询操作实现投票功能_php技巧

php数据访问之查询关键字_php技巧

php简单实现批量上传图片的方法_php技巧

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage