php mail()邮件发送配置方法

 更新时间:2016年11月25日 17:01  点击:1823
这两天写了个方法用到php mail()本以为php提供的这个方法非常简单、方便、易用,其实不然!

php mail()函数需要配置才可以发邮件的哦,下面配置方法

如果你没有使用windows,那么sendmail_path指令就是你唯一要担心的东西.如果你正在使用Windows,你就需要看看最后两个指令.

如果你使用的是Linux或是一个Unix变种,sendmail_path看起来应该象这样:

sendmail_path = /usr/sbin/sendmail

或者如果你使用Qmail:

sendmail_path = /var/qmail/bin/sendmail

在PHP mail()函数中的这条指令里,你还可以设置配置参数来指明队列缓冲选项或是显示的设置Return-Path头,如下所示:

sendmail_path = /usr/sbin/sendmail -t -fyou@yourdomain.com

作为一个非Windows用户,这就是你要做的一切了.如果你使用的是Windows,你有更多的事情要做.你还需要看一看SMTP和sendmail_from的值.不要被sendmail_from指令名字中的sendmail弄迷糊了.虽然你没有在Windows上使用名叫Sendmail的程序,但那只是指令的名字.不要被它吓到了.

在你的phpinfo()显示的结果里,看看SMTP和sendmail_from的缺省值--它们要么是空白,要么包含了胡乱的值.你应该把它们改成有意义的值.

如果你决心在这台电脑上运行一个SMTP服务程序,你在php.ini文件中的条目就应该如下:

SMTP = localhost

但是,如果你要使用你ISP(在这个例子中是EarthLink)的外发邮件服务器,那么php.ini中的邮件看起来应该如下:

SMTP = mail.earthlink.net

你也可以使用IP地址而不是域名,因为计算机不区分这两种条目.

第二条配置指令是sendmail_from,它应该被设置成From头中的电子邮件地址.它可以在脚本里被修改但是通常作为缺省值使用.下面就是这个配置指令的示例youraddress@yourdomain.com指的是你自己的邮件地址.

 代码如下 复制代码

sendmail_from = youraddress@yourdomain.com

发送一个简单的电子邮件:

 代码如下 复制代码

$txt = "First line of textnSecond line of text";
// Use wordwrap() if lines are longer than 70 characters
$txt = wordwrap($txt,70);
// Send email
mail("somebody@example.com","My subject",$txt);


刚开始感觉非常不错,网易邮箱、QQ邮箱、GMAIL邮箱常用的邮箱都可以收到,但经测试HOTMAIL、TOM、LIVE等邮箱是收不到此类邮件的!

经查询邮件发送的时候,一般都需要身份验证,而PHP自带的mail()无能为力,很脆弱啊!

本文章总结了关于在phpmailer发送邮件时出现的中文乱码与标题中文乱码解决方法总结,有需要的朋友可参考本文章。

一个客户的PHP网站需要一个邮件订阅功能,我采用一个在PHP开源程序中被大量使用的程序 PHPmailer(PHPMailer_v2.0.4),在正确填写examples文件夹下的test_mail.php后测试邮件系统,被测试邮箱 可以收到邮件,不过title标题却一直是乱码,故想到这个肯定是PHP的编码问题,经过多次调试终于找到解决办法:核心问题就是加 入$mail->CharSet = "UTF-8";以下是个人测试成功的phpmailer邮件系统

1.对于所有的网易的邮箱(163.com,126.com,yeah.net等),一旦发送中文(标题和正文)都会出现乱码;
2.还有,别的邮箱在发中文时,正文都能正常显示,而标题还出现乱码;

实例:

test.php

 代码如下 复制代码
<html>
<body>
<h3>phpmailer Unit Test</h3>
请你输入<font color="#FF6666">收信</font>的邮箱地址:
<form name="phpmailer" action="send.php" method="post">
<input type="hidden" name="submitted" value="1"/>
邮箱地址: <input type="text" size="50" name="address" />
<br/>
<input type="submit" value="发送"/>
</form>
</body>
</html>

send.php

 代码如下 复制代码

<?php
require("class.phpmailer.php");
$mail = new PHPMailer();
$mail->CharSet = "gb2312"; /
$mail->Encoding = "base64";
$address = $_POST['address'];
$mail->IsSMTP(); // set mailer to use SMTP
$mail->Host = "smtp.126.com"; // specify main and backup server
$mail->SMTPAuth = true; // turn on SMTP authentication
$mail->Username = ""; // SMTP username
$mail->Password = "******"; // SMTP password

$mail->From = "";
$mail->FromName = "rokaye";
$mail->AddAddress("$address", "");
//$mail->AddAddress(""); // name is optional
//$mail->AddReplyTo("", "");

//$mail->WordWrap = 50; // set word wrap to 50 characters
//$mail->AddAttachment("/var/tmp/file.tar.gz"); // add attachments
//$mail->AddAttachment("/tmp/image.jpg", "new.jpg"); // optional name
//$mail->IsHTML(true); // set email format to HTML

$mail->Subject = "PHPMailer测试邮件";
$mail->Body = "Hello,这是rokaye的测试邮件";
$mail->AltBody = "This is the body in plain text for non-HTML mail clients";

if(!$mail->Send())
{
echo "Message could not be sent. <p>";
echo "Mailer Error: " . $mail->ErrorInfo;
exit;
}

echo "Message has been sent";
?>


解决方法一

$mail = new PHPMailer();
$mail->CharSet = "GB2312"; // 设置字符集编码 utf-8
$mail->Encoding = "base64";//设置文本编码方式

如果标题错误可

$mail->Subject = "=?UTF-8?B?" . base64_encode("我的邮件") . "?=";

本文章来介绍人一下关于与我们不同的发送邮件的方法我们来利用php curl stmp来实现邮件的发送程序。

$ telnet 邮箱SMTP服务地址 25
Trying 邮箱服务IP地址...
Connected to 邮箱SMTP服务地址.
Escape character is '^]'.
 exchange邮箱服务器地址 Microsoft ESMTP MAIL Service ready at Sat, 2 Jun 2012 15:02:12 +0800
EHLO 127.0.0.1
-exchange邮箱服务器地址 Hello [邮箱服务IP地址]
-SIZE
-PIPELINING
-DSN
-ENHANCEDSTATUSCODES
-X-ANONYMOUSTLS
-AUTH NTLM LOGIN
-X-EXPS GSSAPI NTLM
-8BITMIME
-BINARYMIME
-CHUNKING
-XEXCH50
 XRDST
AUTH LOGIN
 VXNlcm5hbWU6
用户名(base64_encode)
 UGFzc3dvcmQ6
密码(base64_encode)
 2.7.0 Authentication successful
MAIL FROM:发件箱地址
 2.1.0 Sender OK
RCPT TO:收件箱地址
 2.1.5 Recipient OK
DATA
 Start mail input; end with <CRLF>.<CRLF>
要发送的内容(这里的相关的规范有很多)
.
 2.6.0 <0b476f30-3b96-4e3d-84d2-395a96d34000@exchange邮箱服务器地址> Queued mail for delivery
QUIT
 2.0.0 Service closing transmission channel
Connection closed by foreign host.

php测试代码:

 

 代码如下 复制代码
<?php
 header("content-type:text/html;charset=utf-8");
 $smtp = array(
     "url"      => "邮箱SMTP服务器地址",
     "port"     => "邮箱SMTP服务器端口", // 一般为25
     "username" => "用户名",
     "password" => "密码",
     "from"     => "发件地址",
     "to"       => "收件地址",
     "subject"  => "测试一下标题",
     "body"     => "测试一下内容"
 );
 
 $CRLF = "rn";
 $test = "";
 $curl = curl_init();
 
 curl_setopt($curl, CURLOPT_URL, $smtp['url']);
 curl_setopt($curl, CURLOPT_PORT, $smtp['port']);
 curl_setopt($curl, CURLOPT_TIMEOUT,10);
 
 function inlineCode($str){
         $str = trim($str);
         return $str?'=?UTF-8?B?'.base64_encode($str).'?= ':'';
 }
 
 function buildHeader($headers){
     $ret = '';
     foreach($headers as $k=>$v){
         $ret.=$k.': '.$v."n";
     }
     return $ret;
 }
 
 //
 $header = array(
     'Return-path'=>'<'.$smtp['from'].'>',
     'Date'=>date('r'),
     'From'=> '<'.$smtp['from'].'>',
     'MIME-Version'=>'1.0',
     'Subject'=>inlineCode($smtp['subject']),
     'To'=>$smtp['to'],
     'Content-Type'=>'text/html; charset=UTF-8; format=flowed',
     'Content-Transfer-Encoding'=>'base64'
 );
 $data = buildHeader($header).$CRLF.chunk_split(base64_encode($smtp['body']));
 
 
 $content  = "EHLO ".$smtp["url"].$CRLF; // 先得hello一下
 $content .= "AUTH LOGIN".$CRLF.base64_encode($smtp["username"]).$CRLF.base64_encode($smtp["password"]).$CRLF; // 验证登陆
 $content .= "MAIL FROM:".$smtp["from"].$CRLF; // 发件地址
 $content .= "RCPT TO:".$smtp["to"].$CRLF;  // 收件地址
 $content .= "DATA".$CRLF.$data.$CRLF.".".$CRLF; // 发送内容
 $content .= "QUIT".$CRLF; // 退出
 
 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);    // curl接收返回数据
 curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $content);
 $test = curl_exec($curl);
 var_dump($test);
 echo "<br/>rn";
 var_dump($content);
 
 // 结束
 curl_close($curl);

包测试+修改花了近6个小时让产品的代码兼容了fsockopen和curl

 

以后有空写个兼容fsockopen和curl简单发送邮件的smtp类

php程序员我想都知道phpmailer这个第三方插件,只要用到邮箱发送大家几乎都会用这个插件来实现邮箱发送,下面我们来介绍一下其特点和用法。

我顶PHPMailer ,就如它的名字一样,是一个使用 PHP 编写的邮件发送类,同时,PHPMailer 也是一个功能强大的类。

官方网站:http://phpmailer.codeworxtech.com/
DOWNLOAD:http://code.google.com/a/apache-extras.org/p/phpmailer/
PHPMailer 的主要特点有:

1、在邮件中包含多个 TO、CC、BCC 和 REPLY-TO。
2、平台应用广泛,支持的 smtp 服务器包括 Sendmail、qmail、Postfix、Gmail、Imail、Exchange 等等。
3、支持嵌入图像,附件,HTML 邮件。
4、可靠的强大的调试功能。
5、支持 SMTP 认证。
6、自定义邮件头。
7、支持 8bit、base64、binary 和 quoted-printable 编码。

PHPMailer 的最新稳定版本是 2.2.1,大家可以从官方网站下载。

新版支持tcp,ssl,tls,ssl2.0,经过测试完美支持163,QQ,gmail,foxmail等,
在本地配置php,必须开启socket和open_ssl模块。
附件提供了一个发信的代码,请单机运行,一次不要发太多了,不然可能会被SMTP服务器封IP。

实例1

使用SMTP发送邮件:

 代码如下 复制代码

$mail = new PHPMailer();     //得到一个PHPMailer实例

$mail->CharSet = "gb2312";  //设置采用gb2312中文编码
$mail->IsSMTP();                    //设置采用SMTP方式发送邮件
$mail->Host = "192.168.1.27";    //设置邮件服务器的地址
$mail->Port = 25;                           //设置邮件服务器的端口,默认为25

$mail->From     = "mailFrom@tencent.com";  //设置发件人的邮箱地址
$mail->FromName = "samzhang";                       //设置发件人的姓名
//$mail->SMTPAuth = true;                                    //设置SMTP是否需要密码验证,true表示需要

$mail->Username="samzhang";

$mail->Password = 'your password";
$mail->Subject = $subject;                                 //设置邮件的标题

$mail->AltBody = "text/html";                                // optional, comment out and test


$mail->Body = "你的邮件的内容";                   

$mail->IsHTML(true);                                        //设置内容是否为html类型
//$mail->WordWrap = 50;                                 //设置每行的字符数
$mail->AddReplyTo("samzhang@tencent.com","samzhang");     //设置回复的收件人的地址


 $mail->AddAddress("mailTo@tencent.com","toName");     //设置收件的地址
if(!$mail->Send()) {                    //发送邮件
  echo 发送失败:';
 } else {
  echo "发送成功;

注意:
phpmailer是一款很不错的邮件发送插件,可用于任何邮件发送功能,但是如果你用免费邮箱如163,qq,sina这类免费邮箱如果大批量群发可能会被封号哦。其它的我就不说多了。

本文章介绍了关于在thinkphp中利用了phpmailer来实现邮件发送的详细教程,有需要的朋友可以参考一下。

本文所使用的是ThinkPHP 2.1版和 PHPMailer 5.1版。(后者建议您直接从本博下载,因为我们不能保证下面的代码在所有版本的PHPMailer中都能正常运行)

下面是具体步骤:

第一步、添加PHPMailer类库

点击此处下载

将下载后的文件解压,将PHPMail目录移动至ThinkPHP目录中的Vendor内。(请确保class.phpmailer.php文件就在ThinkPHPVendorPHPMailerclass.phpmailer.php)

第二步、添加发送邮件函数

在项目目录中的Common文件夹中的common.php文件(如果没有请创建)添加如下代码:

 代码如下 复制代码

<?php
/**********
 * 发送邮件 *
 **********/
function SendMail($address,$title,$message)
{
    vendor('PHPMailer.class#PHPMailer');

    $mail=new PHPMailer();
    // 设置PHPMailer使用SMTP服务器发送Email
    $mail->IsSMTP();

    // 设置邮件的字符编码,若不指定,则为'UTF-8'
    $mail->CharSet='UTF-8';

    // 添加收件人地址,可以多次使用来添加多个收件人
    $mail->AddAddress($address);

    // 设置邮件正文
    $mail->Body=$message;

    // 设置邮件头的From字段。
    $mail->From=C('MAIL_ADDRESS');

    // 设置发件人名字
    $mail->FromName='LilyRecruit';

    // 设置邮件标题
    $mail->Subject=$title;

    // 设置SMTP服务器。
    $mail->Host=C('MAIL_SMTP');

    // 设置为“需要验证”
    $mail->SMTPAuth=true;

    // 设置用户名和密码。
    $mail->Username=C('MAIL_LOGINNAME');
    $mail->Password=C('MAIL_PASSWORD');

    // 发送邮件。
    return($mail->Send());
}

?>


第三步、配置邮箱信息

编辑Conf目录下的config.php,在return array添加如下内容

 代码如下 复制代码

    'MAIL_ADDRESS'=>'xxx@126.com', // 邮箱地址
    'MAIL_SMTP'=>'smtp.126.com', // 邮箱SMTP服务器
    'MAIL_LOGINNAME'=>'xxx', // 邮箱登录帐号
    'MAIL_PASSWORD'=>'xxx', // 邮箱密码

其中的邮箱登录帐号可能需要包括@后面的内容,请自行尝试^_^

第四步、在Action中发送邮件

由于ThinkPHP会自动加载common.php中的函数,所以在需要发送邮件的时候,只需要使用如下代码即可。

 代码如下 复制代码

SendMail("xxx@xxx.com","邮件标题","邮件正文");

至此,本教程已经结束。撒花~~~

欢迎成功配置的同学SendMail("dreamrunner@foxmail.com","我也会用ThinkPHP发送邮件啦","哇啦哇啦~~");

还有一些说明

如果邮件正文中需要换行怎么办呢?其实,最简单的方法是——

SendMail("xxx@xxx.com","邮件标题","邮件正文
我换行啦~~!");

 

QQ邮箱(含foxmail)和网易的126、163都测试成功。因为近期访问GMail比较吃力,所以没有测试。听说GMail要求必须使用SSL,有这方面需要的同学自行谷歌百度PHPMailer的方法。

 

[!--infotagslink--]

相关文章

  • NodeJS实现阿里大鱼短信通知发送

    本文给大家介绍的是nodejs实现使用阿里大鱼短信API发送消息的方法和代码,有需要的小伙伴可以参考下。...2016-01-20
  • 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
  • c# 实现发送邮件的功能

    这篇文章主要介绍了c# 如何实现发送邮件的功能,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-07
  • php邮件发送的两种方式

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

    mail()函数的作用:连接到邮件服务器,利用smtp协议,与该服务器交互并投邮件。注意:1、mail函数不支持esmtp协议,---即,只能直投,不能登陆2、由上条,我们只能直投至最终的收件服务器地址.而该地址,又是在PHP.ini中指定的,所...2015-10-30
  • python实现企业微信定时发送文本消息的实例代码

    这篇文章主要介绍了python实现企业微信定时发送文本消息的实例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-11-25
  • PHP在Linux下连接MSSQLServer的配置方法简述(一、Sybase库)

    如果需要在Linux下访问Microsoft SQL Server或Sybase数据库,则推荐下列软件包。 SybaseCommon http://download.sybase.com/pub/ase1192_linux/sybase-common-11.9....2016-11-25
  • node.js 基于 STMP 协议和 EWS 协议发送邮件

    这篇文章主要介绍了node.js 基于 STMP 协议和 EWS 协议发送邮件的示例,帮助大家更好的理解和使用node.js,感兴趣的朋友可以了解下...2021-02-15
  • apache 防盗链配置方法

    修改httpd.conf 找到 <Dirctory "/var/www/html"> 在这个Dirctory容器内添加: 代码如下 复制代码 SetEnvIfNoCase Referer "^http://www.111cn.net/"...2016-01-28
  • ECMall支持SSL连接邮件服务器的配置方法详解

    首先,主要是ecmall使用的phpmailer版本太低,不支持加密连接。然后,得对相应代码做一定调整。1. 覆盖phpmailer请从附件进行下载: 复制代码 代码如下:http://cywl.jb51.net:81/201405/yuanma/ecmall_phpmailer_lib(jb51.n...2014-05-31
  • 西部数码空间伪静态配置方法图解

    今天在使用西部数码空间时发现里面有很多定义好的伪静态规则了,下面我来给大家介绍一下在后面主机面板中配置使用伪静态功能吧,希望文章对各位会带来帮助。...2016-10-10
  • PHPStorm主题安装配置方法详解

    由于在php开发时很多函数命令都只记得一个部份,如果要全写还得百度,后来听说有一个PHPStorm可实现自动补全,我就下载了一个并安装配置了,下面给各位朋友介绍。 为...2016-11-25
  • php中利用curl smtp发送邮件实例

    本文章来介绍人一下关于与我们不同的发送邮件的方法我们来利用php curl stmp来实现邮件的发送程序。 $ telnet 邮箱SMTP服务地址 25 Trying 邮箱服务IP地址......2016-11-25
  • Python基于httpx模块实现发送请求

    这篇文章主要介绍了Python基于httpx模块实现发送请求,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-08
  • php定时发送邮件

    <?php // 请求 PHPmailer类 文件 require_once("class.phpmailer.php"); //发送Email函数 function smtp_mail ( $sendto_email, $subject, $body, $extra_hd...2016-11-25
  • mysql中max_allowed_packet参数的配置方法(避免大数据写入或者更新失败)

    MySQL根据配置文件会限制Server接受的数据包大小。有时候大的插入和更新会受 max_allowed_packet 参数限制,导致写入或者更新失败。 查看目前配置:复制代码 代码如下:show VARIABLES like '%max_allowed_packet%';显示...2014-05-31
  • Apache支持.htaccess配置方法

    打开httpd.conf文件用文本编辑器打开后,查找 代码如下 复制代码 Options FollowSymLinks AllowOverride None 改为: Options FollowSymLinks AllowOv...2016-01-28
  • php天翼开放平台短信发送接口实现

    临时性需求,研究了一下天翼开发平台的东西,用来发送验证码还是不错的,但是每日限额不多,所以很鸡肋,但是保证100%到达 买的话还是蛮贵的,代码没有做任何优化处理,只是测试是...2016-11-25
  • C#实现异步发送邮件的方法

    这篇文章主要介绍了C#实现异步发送邮件的方法,涉及C#异步操作与邮件发送的技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25