PHP发送邮件的几种方法总结

第一种方式采用PHP中的mail()函数,在发送之前需要对php.ini进行配置。找到[mail function]去掉SMTP前的分号,改为自己的采用SMTP服务器,还有下面的smtp_port,sendemail_from,sendmail_path等mail_php.ini还有需要修改的就是xampp/sendmail/sendmail.ini,[sendmail]修改smtp_server,smtp_port,将error_logfile和debug_logfile打开,auth_username填写自己在该邮箱上的账号即可,下面的auth_password密码。修改完后重启apache服务器

还有需要修改的就是xampp/sendmail/sendmail.ini,[sendmail]修改smtp_server,smtp_port,将error_logfile和debug_logfile打开,auth_username填写自己在该邮箱上的账号即可,下面的auth_password密码。修改完后重启apache服务器

用最简单的mail()函数发送,第一个参数为收件人的地址,第二个为主题,第三个为正文,当然mail()还有两个可选的参数,规定附加的标题和额外的参数。

mail("iat.net.cn@gmail.com", "Hello", "world");

这就是最简单的一行代码发邮件的例子了,当然这也是很不友好的,有没有连上服务器,有没有发送成功都不知道。

第二种方式采用CMD命令行发送,首先需要开启telnet服务,该服务在windows下是默认关闭的,具体开启的方式如下:“控制面板”?>“程序”?>“打开或关闭windows功能”,然后勾选里面的“telnet服务器”和“telnet客户端”,确认即可。接下来再CMD里输入telent就可以进入服务了。

在使用telent发送邮件之前先介绍一下SMTP协议下的连接发送过程:

(1)建立TCP连接

(2)客户端发送HELO或EHLO命令以标识发件人自己的身份

(3)使用AUTH命令登陆SMTP服务器,输入自己的用户名和密码(这里的用户名和密码是通过base64加密的,可以先用base64_encode()函数加密后将字符串复制过来)

(4)客户端发送RCPT命令,标识该电子邮件的收件方,可以用多个RCPT行,服务器以OK作为响应,表示收件方可以接收

(5)协商结束后,使用DATA命令发送

(6)以“.”表示结束,结束此次发送用QUIT命令

在具体的CMD下应该怎样使用呢?首先telnet到smtp.163.com上,加上端口号25,应为默认的是23会连不上。

接下来会打开一个新的窗口

HELO命令与服务器打个招呼,服务器返回250就代表它也回你招呼了。AUTH login后输入自己的用户名,这里的用户名是base64加密后的,服务器返回334后输入自己的密码,密码也是base64加密的(图片中没有显示),密码验证成功会返回235的Authentication successful。telnet_send接下来就是输入发送方的邮箱和接收方和的邮箱,都是250 MAIL OK后输入DATA命令,以下的就是邮件的内容了,按”.”号退出发送。上述命令并不一定会一次性成功,我试了好多遍,同样的命令上一次不对这一次就对了,服务器可能会返回错误响应,可以多次重复尝试。

第三种方式采用SOCKET发送邮件,主要用到的是fsockopen()函数,该函数的好处是把Socket绑定到一个流上,然后使用各种操作流的函数操作这个Socket连接。这是个算比较完善的类了,出错了会进行提示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
<?php
class smtp_mail
{
private $host;
private $port;
private $username;
private $password;
private $debug = false;
private $sock;
private $mail_format = 0;
function smtp_mail($host, $port = 25, $username, $password, $mail_format = 1, $debug = 1)
{
$this->host = $host;
$this->port = $port;
$this->username = base64_encode($username);
$this->password = base64_encode($password);
$this->mail_format = $mail_format;
$this->debug = $debug;
//连接到SMTP服务器
$this->sock = fsockopen($this->host, $this->port, $errno, $errstr, 10);
if(!$this->sock)
exit("Error number: $errno, Error message: $errstr");
$response = fgets($this->sock);//获取服务器信息
if(strstr($response, "220") === false)
exit("server error: $response");
}
//显示debug
private function show_debug($message)
{
if($this->debug)
echo "<p>Debug: $message</p>";
}
//把命令发送到服务器执行,取得服务器消息
private function do_command($cmd, $return_code)
{
fwrite($this->sock, $cmd);
$response = fgets($this->sock);
echo "$response";
if(strstr($response, "$return_code") === false)
{
$this->show_debug($response);
return false;
}
return true;
}
//验证邮箱地址
private function is_email($email)
{
$pattern = "/^[^_][\w]*@[\w.]+[\w]*[^_]$/";
if(preg_match($pattern, $email, $matches))
return true;
return false;
}
//具体的send_mail
public function send_mail($from, $to, $subject, $body)
{
if((!$this->is_email($from)) || (!$this->is_email($to)))
{
$this->show_debug("Please enter vaild email");
return false;
}
if(empty($subject) || empty($body))
{
$this->show_debug("Please enter subject/body");
return false;
}
$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 .= $body;
$this->do_command("HELO smtp.163.com\r\n", 250);
$this->do_command("AUTH LOGIN\r\n", 334);
$this->do_command($this->username . "\r\n", 334);
$this->do_command($this->password . "\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);
}
}

测试代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
include("smtp_mail.class.php");
$host = "smtp.163.com";
$port = 25;
$username = "iatboy@163.com";
$password = "**********";
$from = "iatboy@163.com";
$to = "iat.net.cn@gmail.com";
$subject = "Hello";
$content = "World";
$mail = new smtp_mail($host, $port, $username, $password);
$mail->send_mail($from, $to, $subject, $content);
?>

测试的结果

第四种方式采用开源的PHPMailer类,该类在http://sourceforge.net/projects/phpmailer/files/可以下载到,其中的功能是非常全面的,包括制定多个收件人,抄送地址,暗送地址和回复地址,支持多种邮件编码格式,支持SMTP验证,支持在邮件中嵌入图片,可在任何平台上运行等。

需要调用的是class.smtp.php类,参考网上的测试代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
require("class.phpmailer.php"); //下载的文件必须放在该文件所在目录
$mail = new PHPMailer(); //建立邮件发送类
$address ="iatboy@163.com";
$mail->IsSMTP(); // 使用SMTP方式发送
$mail->Host = "smtp.163.com"; // 您的企业邮局域名
$mail->SMTPAuth = true; // 启用SMTP验证功能
$mail->Username = "iatboy@163.com"; // 邮局用户名(请填写完整的email地址)
$mail->Password = "*********"; // 邮局密码
$mail->Port=25;
$mail->From = "iatboy@163.com"; //邮件发送者email地址
$mail->FromName = "liuyoubin";
$mail->AddAddress("$address", "a");//收件人地址,可以替换成任何想要接收邮件的email信箱,格式是AddAddress("收件人email","收件人姓名")
//$mail->AddReplyTo("", "");
//$mail->AddAttachment("/var/tmp/file.tar.gz"); // 添加附件
//$mail->IsHTML(true); // set email format to HTML //是否使用HTML格式
$mail->Subject = "PHPMailer测试邮件"; //邮件标题
$mail->Body = "Hello,这是测试邮件"; //邮件内容
$mail->AltBody = "This is the body in plain text for non-HTML mail clients"; //附加信息,可以省略
if(!$mail->Send())
{
echo "邮件发送失败. <p>";
echo "错误原因: " . $mail->ErrorInfo;
exit;
}
echo "邮件发送成功";

PHP发送邮件还有其它的方法,之后补充。

Just a beginner.<br /><a href='https://github.com/yaoshanliang/about' target='_blank'>profile</a>