Home >Backend Development >PHP Tutorial >Beginner's guide to sending emails via smtp using php_PHP tutorial

Beginner's guide to sending emails via smtp using php_PHP tutorial

WBOY
WBOYOriginal
2016-07-13 17:19:591240browse

由于php没有提供现成的smtp函数,却提供了一个功能不甚灵活的mail()函数,这个函数需要服务器配置上的支持,并且不支持smtp验证,在很多场合无法正常的工作,因此不建议使用。本文的目的在于为新手指明方向,并没有涉及那些高级的内容,一来本身水平有限,二来也担心不能准确的讲述相关的概念,进而对各位造成误导,还请自行深入学习。本文撰写日期是2004年7月2日,阅读时请注意时效性。

“使用php发送mail”最近已经成为继“register_globals”以后本版第二个新手陷阱,今天特地写这篇文章为新手解惑,希望可以为迷茫的人指明方向。
让我们先从以下这个例子开始说起:

引用:
[root@server~/]# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is ^].
220 server.domain.com.br ESMTP Postfix (2.1.0)
MAIL FROM: teste@dominio.com.br
250 Ok
RCPT TO: teste@dominio.com.br
250 Ok
DATA
354 End data with .
teste
.
250 Ok: queued as 7B41F4665A
QUIT
221 Bye
Connection closed by foreign host.
注:以上来自netkiller的postfix文档,偷懒,直接用现成的。

首先是使用telnet来连接本地的25端口,稍微熟悉点网络的人都知道smtp协议使用25端口,这也就是说,现在在连接本地的smtp服务器。
引用:
Trying 127.0.0.1...
Connected to localhost.
Escape character is ^].
220 server.domain.com.br ESMTP Postfix (2.1.0)

这些东西是系统输出信息,说明已经连接上了,而且这个smtp服务器是postfix做的。

“MAIL FROM: teste@dominio.com.br”这个命令指明了发件地址是teste@dominio.com.br,“250 Ok”说明这条命令被服务器接受并正确执行,这类似http协议的200、404、500等状态代码。接下来的“RCPT TO: teste@dominio.com.br”指明了收件地址是teste@dominio.com.br。
引用:
DATA
354 End data with .
teste
.

这一段是输入邮件正文,输入“DATA”以后系统提示使用“<回车>.<回车>”来结束输入,正文内容是“teste”。
最后使用“QUIT”退出。

以上就是最简单的一次发送mail的过程,从这个例子我们可以看出,发送mail其实是很简单的事情,实质上也就是建立一个对smtp服务器的连接,然后发送一些简单的命令给它,一封内容简单的邮件就发送出去了,至于更加复杂内容的邮件或者操作,其实也就是在此基础上稍加扩展而已。

把这个过程用php来实现,其实就是利用php的Socket functions、Network Functions等等操作socket的函数来和smtp服务器建立一个连接,然后发送文本的命令给服务器,如果你亲自去看看那些写好的利用smtp协议发送邮件的类或者函数,相信可以印证我的说法。

由于已经存在很多现成的封装得很好的类或者函数替我们完成底层的socket级操作,我们只需要直接拿来用就好,而我也不会费时费神的在本文里去讨论底层的代码,有精神去研究的话,自己找代码来研究吧。现在继续跟我走,我们来点实际的代码来说明如何使用php发送邮件,采用的类是PEAR::Mail。
代码:
require_once Mail.php;

$conf[mail] = array(
host => xx.xx.xx.xx,                //smtp服务器地址,可以用ip地址或者域名
        auth     => true,                         //true表示smtp服务器需要验证,false代码不需要
        username => tester,                     //用户名
        password => retset                      //密码
);

/***
* 使用$headers数组,可以定义邮件头的内容,比如使用$headers[Reply-To]可以定义回复地址
* 通过这种方式,可以很方便的定制待发送邮件的邮件头
***/
$headers[From]    = tester@domain.com;              //发信地址
$headers[To]      = tester@domain.com;              //收信地址
$headers[Subject] = test mail send by php;          //邮件标题
$mail_object = &Mail::factory(smtp, $conf[mail]);   

$body = <<< MSG //邮件正文
hello world!!!
MSG;

$mail_res = $mail_object->send($headers[To], $headers, $body);        //发送

if( Mail::isError($mail_res) ){                         //检测错误
    die($mail_res->getMessage());
}
?>

The above code is very simple and should not be difficult to understand with the comments. For more information about PEAR and PEAR::Mail, you can read the PEAR Manual for further information.

Now you’re good to go, but if you want to do better and do more, I’m here to provide some more guidance.

1. SMTP protocol
Be familiar with and understand the contents of the SMTP protocol, so that you can perform more advanced operations, and even write an email program to meet your own special needs. Although the above code is simple, there must still be many people who don't understand what the email header mentioned in the comments is and what impact it has on the outgoing emails.
For example, "Why does the other party see garbled characters when sending HTML emails?" and other problems may be related to the email header. If you have a good understanding of the SMTP protocol, you can quickly know the problem.
2. MIME specification
If you want to send HTML emails or even multimedia emails, you must have a certain understanding of MIME. With this knowledge, you can send emails with more exciting content.
3. PEAR
PEAR is not the only tool for sending emails, but PEAR includes Mail, Mail_Mime and other encapsulated classes, which can make our development more efficient, and in addition to Mail things, it It also provides many other ready-made tools, which are well worth the time to learn.

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/532627.htmlTechArticleSince PHP does not provide a ready-made smtp function, it does provide a mail() function that is not very flexible. This The function requires server configuration support and does not support SMTP verification. In many...
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn