使用php通过smtp发送邮件新手指南

smtp|发送邮件

由于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 <CR><LF>.<CR><LF>
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 <CR><LF>.<CR><LF>
teste
.

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

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

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

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

以上的代码非常的简单,配合注释应该不难看懂,关于PEAR和PEAR::Mail的更多信息,可以自己去翻阅PEAR Manual得到进一步的信息。

现在你依葫芦画瓢已经可以开始工作了,不过如果你还想做得更好、做得更多的话,我在这里提供一些更多的指南。

1、SMTP协议
熟悉并了解SMTP协议的内容,这样你可以进行更多的高级操作,甚至自己写一个满足自己特别需求的发邮件程序。以上的代码虽然简单,但是肯定还是有很多人不了解注释里提到的邮件头是什么东西,它到底对发出的邮件有什么样的影响。
比如“发送html邮件为什么对方看到的是乱码”等等问题都可能和邮件头相关,如果对smtp协议比较了解的话,可以很快的知道问题所在。
2、MIME规范
如果想要发送html邮件甚至多媒体邮件,一定是需要对MIME有一定了解的,有了这方面的知识你就可以发送内容更加精彩的邮件。
3、PEAR
PEAR并非唯一的发送邮件的工具,但是PEAR包含了Mail、Mail_Mime等等已经封装好了的类,可以让我们的开发事半功倍,并且除了Mail方面的东西以外,它还提供了很多其他方面的现成的工具,非常值得花时间学一学。
 

时间: 2024-12-03 15:45:52

使用php通过smtp发送邮件新手指南的相关文章

在asp.NET 中使用SMTP发送邮件的实现代码

核心代码:复制代码 代码如下: public class Mail { #region 邮件参数 static public string accountName = System.Configuration.ConfigurationManager.AppSettings["SmtpAccountName"]; static public string password = System.Configuration.ConfigurationManager.AppSettings[&

使用CDO.Message+SMTP发送邮件

smtp|发送邮件 <!--发送代码--> <% Const cdoSendUsingMethod="http://schemas.microsoft.com/cdo/configuration/sendusing" Const cdoSendUsingPort=2 Const cdoSMTPServer="http://schemas.microsoft.com/cdo/configuration/smtpserver" Const cdoSMT

php基于socket实现SMTP发送邮件的方法

 这篇文章主要介绍了php基于socket实现SMTP发送邮件的方法,实例分析了php采用socket实现smtp发送邮件的原理与技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了php基于socket实现SMTP发送邮件的方法.分享给大家供大家参考.具体分析如下: php采用socket通过SMTP发送邮件. 用的是php的php-sockets扩展,可以发送纯文本和html格式的邮件.代码如下: 代码如下: <?php /** * 邮件发送类 * 支持发送纯文本邮件和H

ecshop实现smtp发送邮件

这篇文章主要介绍了ecshop实现smtp发送邮件,需要的朋友可以参考下 使用ECShop的smtp方式发送邮件时,在cls_smtp类文件中,执行到get_data方法中的语句: 代码如下: $line = fgets($this->connection, 512); ;时,发生超时错误. 注释掉该函数的执行,直接发送邮件,则返回错误ehlo command failed. 但打印出链接数据时,确实连上了. 之前用别的程序发送邮件也是可以正常发送的,于是重新发送函数,改用phpmailer发送

php基于socket实现SMTP发送邮件的方法_php技巧

本文实例讲述了php基于socket实现SMTP发送邮件的方法.分享给大家供大家参考.具体分析如下: php采用socket通过SMTP发送邮件. 用的是php的php-sockets扩展,可以发送纯文本和html格式的邮件.代码如下: 复制代码 代码如下: <?php /** * 邮件发送类 * 支持发送纯文本邮件和HTML格式的邮件 * @example * $config = array( *       "from" => "*****", * 

Python实现SMTP发送邮件详细教程_python

简介 Python发送邮件的教程本人在网站搜索的时候搜索出来了一大堆,但是都是说了一大堆原理然后就推出了实现代码,我测试用给出的代码进行发送邮件时都不成功,后面找了很久才找到原因,这都是没有一个详细的环境调试导致,所以今天特出一个详细的教程,一步一步从环境调试到代码实现整一个教程,希望对还在苦苦寻找解决方法却迟迟不能得到有效解决的人员一点帮助. SMTP协议 首先了解SMTP(简单邮件传输协议),邮件传送代理程序使用SMTP协议来发送电邮到接收者的邮件服务器.SMTP协议只能用来发送邮件,不能用

java实现基于SMTP发送邮件的方法_java

本文实例讲述了java实现基于SMTP发送邮件的方法.分享给大家供大家参考.具体实现方法如下: import java.util.Date; import java.util.Properties; import javax.mail.Authenticator; import javax.mail.Message; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Tra

C# smtp发送邮件问题,群组邮件

问题描述 我用c#smtp发送邮件给exchange的用户,单个发送,指定用户的邮件地址是可以成功的,我现在的问题是,我把发送邮件的地址修改给outlook中的群组地址,则发送不成功,也没有报错,请问是什么问题? 解决方案 解决方案二:你使用的邮件服务器,是端口号是25吗

Go语言通过smtp发送邮件的方法_Golang

本文实例讲述了Go语言通过smtp发送邮件的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package main import (  "net/smtp"  "fmt"  "strings" ) /*  * user : example@example.com login smtp server user  * password: xxxxx login smtp server password  * host: smt