利用PHP mail函数实现邮箱发送

 更新时间:2016年11月25日 17:00  点击:1327
mail函数是php自带的一个邮箱发送函数,但在各方法本人测试了都不如第三方插件好用,但是它有一个特点就是量不大的情况下使用方法快捷。

 

在我们平常使用PHP发送邮件时,不一定每次都需要使用像phpmailer这样强大的工具类,在网上找到一个不错的PHP mail封装函数,该函数能够解决以下使用mail()函数经常碰到的几个问题
1.怎样发送HTML格式邮件。
2.邮件主题填上中文是乱码。
3.收件人中除了填上收件人的邮件,还要填上名字,而且还是中文的。
4.发件人要填上网站的名字,让人收到邮件的时候不是光秃秃的显示邮件地址。// 对邮件地址进行中文的UTF-8编码转化


function format_mail_address($address){
  if(preg_match("||", $address, $matches)){
    $name = mb_substr($address, 0, strpos($address, '
函数的使用方法:
html_mail(
    "电商沙龙",
    array(
        "用户A",
        "用户B"),
    "这是一封测试邮件",

需要说明的一点是,收件人为数组时,其中一个收件人查看邮件会看到所有其他收件人的邮件地址。如果要分开来发送(互相都看不见各自的邮件地址),可以使用循环一个个发送。使用加密抄送的方式可以实现隐藏加密抄送的邮件地址。

<?php
$to = $mailtoname . " <" . $mailtomail . "-->" ;
$mailsubject="邮件测试";
$mailheader = "X-Priority: 5n";
$mailheader.= "From: " . "Sales Teamn";
$mailheader.= "X-Sender: " . "support@ec-shalom.comn";
$mailheader.= "Return-Path: " . "support@ec-shalom.comn";
//普通抄送邮件
$mailheader.= "Cc: " . $mailcc ."n";
//加密抄送
$mailheader.= "Bcc: " . $mailbcc ."n";
$mailbody="电商沙龙-mail()函数发送邮件";
$result = mail ($to, $mailsubject, $mailbody, $mailheader);
echo "

Mail sent to “. “$to”. ” “; echo $mailsubject. ” “; echo $mailbody. ” “; echo $mailheader. ” “; if ($result) { echo “

<strong></strong><strong>Email sent successfully!</strong>
 
<strong>"; }else{ echo "</strong>
 
<strong></strong><strong>Email could not be sent. </strong>
 
<strong>"; } ?&gt;</strong>


注意了php mail函数是需要服务器的支持,此函数配置如下

装设置服务端


Windows XP和2000本身就拥有构件SMTP服务器的功能,只是一般还没有安装。选择“控制面板→添加/删除程序→添加/删除Windows组件”,弹出“Windows组件向导”对话框,在其中双击“Internet信息服务(IIS)”项,就会打开详细选择项,选中“SMTP Service”,按“确定”,插入Windows XP安装盘进行安装

 


安装好SMTP服务器后,选择“控制面板→性能和维护→管理工具→Internet信息服务”打开Internet信息服务设置窗口,在窗口左侧点击本地计算机名,展开本地计算机目录,可以看到有两个分支“Wed站点”和“默认SMTP虚拟服务器”。在“默认SMTP虚拟服务器”上点击鼠标右键选择“属性”,打开“默认SMTP虚拟服务器属性”窗口。


“常规”选项卡主要设置IP地址,单击IP地址下拉项选择“127.0.0.1”,表示指向本地计算机IP地址,其他项使用默认即可。如果你是局域网接入,拥有固定IP地址,那么IP地址就应该选择相应的地址


 


“访问”选项卡中设置访问权限。单击“身份验证”,选择“匿名访问”,表示任何用户都可以发送,其他两项不用选择;单击“连接控制”中的“连接”和“中段限制”中的“中断”,选中“仅以下列表除外”,表示可以许接入所有用户的访问。


“邮件”选项卡中设置邮件传输条件及限制,“限制邮件大小为”等四个选项可以使用默认值,无须更改;


“将未传递报告的副本发送到”可将发送不成功的邮件返回发件人,并且写明不成功的原因;“死信目录”设置没有发送成功的邮件被存放的位置。


“传输”选项中设置邮件传递时间,这里不用修改,使用默认值;“LDAP路由”选项用来指定服务器使用的目录服务器标识和属性,这里也不用启动它。


“安全”选项中设置使用发送服务器的有权用户,默认用户是“Administrators”,你可以单击“添加”添加使用用户。


一切设置好后,你就拥护了自己的邮件发送服务器了!
 

SMTP装好以后 你应该是在WINDOW2K下,你找到PHP。INI文件 在C:WINNT下
打开找到下面这些行
[mail function]
; For Win32 only.
SMTP = 10.0.0.9 -------》替换成你的IP,10.0.0.9是偶的IP了 :)


; For Win32 only.
sendmail_from = test@test.com    ---》发件人信息


然后重新启动APACHE

phpmailer是一个非常优秀的php第三方邮箱发送类函数,它支持几乎所有国内外邮箱登录发送功能,下面我们一起来看个php中利用PHPMailer插件实现gmail发送邮件实例,希望此教程对大家有帮助。

HPMailer 是一个专门用于php语言的邮件发送类,功能十分地强大,丰富了 PHP 本身单一的 mail() 函数。支持 SMTP 等、附件等。 PHPMailer 遵守 LGPL 授权,可以免费下载。
下载地址:http://sourceforge.net/projects/phpmailer/files/phpmailer%20for%20php5_6/PHPMailer%20v5.1/PHPMailer_v5.1.zip/download
使用方法(只说法邮件,其收邮件的功能飘过):

 代码如下 复制代码
IsSMTP();
 $mail-&gt;SMTPAuth = true; //smtp要求身份验证
 $mail-&gt;SMTPSecure = 'ssl'; //smtp验证方式
 $mail-&gt;Port = 465 ; //smtp端口号
 $mail-&gt;Username = "username@gmail.com"; // 注册了的gmail用户邮箱(用你的gmail邮箱就可以)
 $mail-&gt;Password = "password"; //密码
 $mail-&gt;Host = 'smtp.gmail.com'; // 发邮件的服务器
 $mail-&gt;IsHTML(true); // 是否使支持 HTML 邮件的发送,默认为 false ,
 $mail-&gt;From ='username@gmail.com'; // 发信人的邮箱,用你的gmail邮箱就可以
 $mail-&gt;FromName = 'Mailer'; // 你的姓名
 $mail-&gt;Subject = '邮件标题'; // 邮件标题
 $mail-&gt;Body ='Hello world'; // 邮件内容,支持HTML代码
 $mail-&gt;AddAddress('name@anydomain.com', 'First Last'); // 收件人邮箱和姓名
 if (!$mail-&gt;Send()) {
 echo $mail-&gt;ErrorInfo;
 }

本来一般是照上面的配置就可以通过指定的smtp服务器发送邮件了,但是经个人测试上面的设置只能用163,126的smtp发送邮件,像qq,gmail等都发送不出去! 在google上搜了N久,终于找到了下面的方法可以成功通过gmail发送邮件了,当然还包括:qq、sina、sohu等(雅虎的不能通过,貌似雅虎默认smtp没有开通,得开通他们的一个叫‘邮件提醒’功能才给你开通smtp/pop3)
下面是解决方法: 只需要在 class.phpmailer.php 中查找到下面的代码(可能由于下载的版本不同而稍微有点区别):

 代码如下 复制代码
if(eregi(’^(.+):([0-9]+)$‘, $hosts[$index], $hostinfo)) {
   $host = $hostinfo[1];
  $port = $hostinfo[2];
 } else {
  $host = $hosts[$index];
  $port = $this-&gt;Port;
 }

更改为( 不任什么版本都改成下面的内容):

 代码如下 复制代码
if(eregi(’^#(([a-z]+://)?[^:]+):(d+)#i‘, $hosts[$index], $hostinfo)) {
  $host = $hostinfo[1];
  $port = $hostinfo[3];
 } else {
  $host = $hosts[$index];
  $port = $this-&gt;Port;
 }

几经修改希望你也可以顺利的通过gmail的smtp发送邮件了(当然要在win下面要能发邮件,还得在IIS中安装smtp以及在php中有OpenSSL扩展的支持)。 最后经测试,这种修改后能顺利通过 126163qqgmailsinasohu的smtp发送邮件

本文章来给各位同学介绍一下PHP用mail或pear mail发送邮件(window/linux),有需要了解学习的同学可进入参考哈


一 、windows sendmail

http://glob.com.au/sendmail/

二、windows smtp 服务器


http://msdn.microsoft.com/zh-cn/library/8b83ac7t(v=vs.80).aspx

解决 WIN7 SMTP 安装问题
有人说WIN7系统没有SMTP服务 怎么可能呢
具体安装步骤如下:
控制面板/程序>打开和关闭Windows功能
 
Internet信息服务  将 万维网服务>应用程序开发功能>.NET扩展性 勾上 安装 就可以了
 
帮你们解决的 说声谢谢啊


php mail()函数在windows不能用


php mail()函数在windows不能用,需要安装sendmail。

Warning: mail() [function.mail]: "sendmail_from" not set in php.ini or custom "From:" header missing in
1.从http://glob.com.au/sendmail/下载sendmail.zip
2.解压到C:下,例如C:/PHP/sendmail,最好短路径,长路径名有可能产生问题。
3.修改php.ini如下
sendmail_path = "C:/PHP/sendmail/sendmail.exe -t"
4.根据你自己的配置环境修改sendmail.ini。
第一次最好启用debug.log_file,error_logfile,以查看sendmail是否生效。
5.重启apache


用sendmail结合其它的smtp服务器,如smtp.airmb.com来实现发邮件。现在大部分邮箱都要求smtp验证,所以要在sendmail.ini中加入用户名和密码。

php.ini配置 (以用airmb.com邮箱为例)

[mail function]
; For Win32 only.
SMTP = smtp.airmb.com
smtp_port = 25
; For Win32 only.
sendmail_from = facai@airmb.com
; For Unix only. You may supply arguments as well (default: “sendmail -t -i”).
sendmail_path = “C:/PHP/sendmail/sendmail.exe -t”

就配置三项,smtp、smtp_port和sendmail_path

sendmail.ini配置

[sendmail] 
; you must change mail.mydomain.com to your smtp server
smtp_server=smtp.airmb.com
smtp_port=25
auth_username=yourusername
auth_password=yourpassword
force_sender=facai@airmb.com
; default_domain=mydomain.com


同时在虚拟主机的conf里加上这样一句

php_admin_value sendmail_path  'C:/PHP/sendmail/sendmail.exe -t facai@airmb.com'

此邮件地址为用户的邮件地址,随便添。

注意

经测试,结果如下 : 发送成功 ,表示已发到邮件服务器队列 但!但邮件服务器没有启动!

运行: service sendmail start

另外 ,已发送成功的邮件,sendmail服务器会一直保存 ! 启动邮件服务器后 ,所有未发送的都会发送

本文章来给大家介绍php mail发邮件标题中文乱码的问题解决办法,希望到此类问题的朋友可进入参考。

当使用下面的PHP语句发送电子邮件的时候,如果编码和接收邮箱编码不相同,会发现邮件的标题是乱码,而邮件正文却是正确的,如何才能使得邮件标题不是乱码呢?

  $subject = stripslashes($the_post['Title']);
  $headers = "MIME-Version: 1.0rn";
  $headers .= "Content-type: text/plain; charset=utf-8rn";
  $headers .= "Content-Transfer-Encoding: 8bitrn";
  $message = stripslashes(strip_tags($the_post['Content']));
  mail($to, $subject, $message, $headers);

  先用函数base64_encode() — 使用 MIME base64 对数据进行编码
  标题字符串前加编码类型例如: =?UTF-8?B?
  标题字符串后加:?=

  例如:

  $subject = "=?UTF-8?B?".base64_encode($subject)."?=";

  将上面一句添加到代码之中,这样,发送的中文邮件标题就不是乱码了。

 代码如下 复制代码

<?php
$to      = 'junhuibai@gmail.com';
$subject = iconv('','GB2312','亲爱的'.$s_user.',请取回您的密码!');
$subject = "=?GB2312?B?".base64_encode($subject)."?=";
$message = $s_user.',您好!'.
                '您的新密码是:'.$pwd.''.
                '为了保证您用户的安全性,请登录更改您的密码。'.
                '此信是由系统发出,系统不接收回信,请勿直接回复!';

$headers = 'From: junhuibai@tom.com' . "rn" .
    'Reply-To:junhuibai@tom.com' . "rn" .
    'X-Mailer: PHP/' . phpversion();

if(mail($to, $subject, $message,$headers))
echo'ok';
else
echo 'no';
phpinfo();
?>

最终解决办法

 代码如下 复制代码

标题乱码:     


   $subject = "=?UTF-8?B?".base64_encode('邮箱验证 —— ' . SITE_NAME)."?=";

正文乱码:

设置header : charset=utf-8'


$headers = 'From: webmaster@webinno.cn' . "rn" .
        'Content-type: text/html; charset=utf-8' . "rn" .
        // 'Reply-To: webmaster@example.com' . "rn" .
        'X-Mailer: PHP/' . phpversion();

今天在使用phpmailer发送邮件时居然提示SMTP Error: Could not authenticate,这个感觉是smtp设置的问题,下面我在网上找到了几种解决办法。

今天在使用phpmailer发送smtp邮件时提示 SMTP Error: Could not authenticate 错误,其中密码帐号都是正确的,邮箱也设置开启了SMTP功能。

上谷歌百度了一遍,有的说是服务器禁用了端口,有的说把class.phpmailer.php中的

 代码如下 复制代码

function IsSMTP() {
$this->Mailer = 'smtp';
}改为

function IsSMTP() {
$this->Mailer = 'SMTP';
}

测试以后还是不行,心中郁闷的一米。最后在一篇博客中找到了解决方法,先分享出来让更多遇到同样问题的人能得到帮助!


这个错误说明虚拟主机不支持PHPMailer默认调用的fsockopen函数,找到class.smtp.php文件,搜索fsockopen,就找到了这样一段代码:

 代码如下 复制代码

// connect to the smtp server
$this->smtp_conn = @fsockopen($host,// the host of the server
    $port,// the port to use
    $errno,   // error number if any
    $errstr,  // error message if any
    $tval);   // give up after ? secs

方法1:将fsockopen函数替换成pfsockopen函数

 
首先,在php.ini中去掉下面的两个分号

 
;extension=php_sockets.dll

 
;extension=php_openssl.dll

然后重启一下

因为pfsockopen的参数与fsockopen基本一致,所以只需要将@fsockopen替换成@pfsockopen就可以了。

方法2:使用stream_socket_client函数

一般fsockopen()被禁,pfsockopen也有可能被禁,所以这里介绍另一个函数stream_socket_client()。

stream_socket_client的参数与fsockopen有所不同,所以代码要修改为:

 代码如下 复制代码

$this->smtp_conn = stream_socket_client("tcp://".$host.":".$port, $errno,  $errstr,  $tval);

这样就可以了。


如果上面办法还是没有解决可能是邮箱自动过滤你机器自动登录邮箱发邮件了哦,我是使用下面办法解决的

刚开始使用的qq的帐号,提示上面错误。换成新注册的163帐号可以正常发送。


之后换了一个qq等级比较高的帐号,这下可以正常发送,没有报任何错误。

因为收件人用的是qq邮箱帐号,所以发件帐号用qq的邮箱比较好,这样发送过多不会轻易的被拦截或判为垃圾邮件。

所以结论就是配置中使用一个qq等级比较高的帐号(我的一个小号等级2个月亮可以正常使用,当然等级越高越好,)

ps:也要查看邮箱中“设置邮件地址黑名单”及“收信规则”,有时系统会自动将一些邮箱自动加入黑名单的

[!--infotagslink--]

相关文章

  • php正确禁用eval函数与误区介绍

    eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • Python astype(np.float)函数使用方法解析

    这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08
  • Python中的imread()函数用法说明

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • 金额阿拉伯数字转换为中文的自定义函数

    CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • PHP用strstr()函数阻止垃圾评论(通过判断a标记)

    strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
  • PHP函数分享之curl方式取得数据、模拟登陆、POST数据

    废话不多说直接上代码复制代码 代码如下:/********************** curl 系列 ***********************///直接通过curl方式取得数据(包含POST、HEADER等)/* * $url: 如果非数组,则为http;如是数组,则为https * $header:...2014-06-07
  • php中的foreach函数的2种用法

    Foreach 函数(PHP4/PHP5)foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。...2013-09-28
  • NodeJS实现阿里大鱼短信通知发送

    本文给大家介绍的是nodejs实现使用阿里大鱼短信API发送消息的方法和代码,有需要的小伙伴可以参考下。...2016-01-20
  • C语言中free函数的使用详解

    free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
  • PHP函数strip_tags的一个bug浅析

    PHP 函数 strip_tags 提供了从字符串中去除 HTML 和 PHP 标记的功能,该函数尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果。由于 strip_tags() 无法实际验证 HTML,不完整或者破损标签将导致更多的数...2014-05-31
  • PHP加密解密函数详解

    分享一个PHP加密解密的函数,此函数实现了对部分变量值的加密的功能。 加密代码如下: /* *功能:对字符串进行加密处理 *参数一:需要加密的内容 *参数二:密钥 */ function passport_encrypt($str,$key){ //加密函数 srand(...2015-10-30
  • SQL Server中row_number函数的常见用法示例详解

    这篇文章主要给大家介绍了关于SQL Server中row_number函数的常见用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08
  • PHP测试成功的邮件发送案例

    mail()函数的作用:连接到邮件服务器,利用smtp协议,与该服务器交互并投邮件。注意:1、mail函数不支持esmtp协议,---即,只能直投,不能登陆2、由上条,我们只能直投至最终的收件服务器地址.而该地址,又是在PHP.ini中指定的,所...2015-10-30
  • php邮件发送的两种方式

    这篇文章研究的主要内容就是使用PHP来发送电子邮件,总结为以下两种方法:一、使用PHP内置的mail()函数<&#63;php $to = "test@163.com"; //收件人 $subject = "Test"; //主题 $message = "This is a test mail!"; //正文...2015-10-30
  • php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法

    最近遇到一个问题,就是在使用php的mail函数发送utf-8编码的中文邮件时标题出现乱码现象,而邮件正文却是正确的。最初以为是页面编码的问题,发现页面编码utf-8没有问题啊,找了半天原因,最后找到了问题所在。 1.使用 PEAR 的...2015-10-21