利用PHPMailer来完成PHP的邮件发送

 更新时间:2016年11月25日 17:00  点击:1450
PHPMailer发送邮件配置非常的简单,只要下载一个PHPMailer插件,然后我们再注册一个163邮箱就可以实现php发邮件了,具体例子如下。


1.首先是下载PHPMailer
 
2.解压
 
从中取出class.phpmailer.php 和 class.smtp.php 放到你的项目的文件夹,因为我们等下会引用到它们.
 
3.创建发送邮件的函数,其中你需要配置smtp服务器
 
function postmail($to,$subject = '',$body = ''){
    //Author:smsyun WebSite: http://www.111cn.net
    //$to 表示收件人地址 $subject 表示邮件标题 $body表示邮件正文
    //error_reporting(E_ALL);
    error_reporting(E_STRICT);
    date_default_timezone_set('Asia/Shanghai');//设定时区东八区
    require_once('class.phpmailer.php');
    include('class.smtp.php');
    $mail             = new PHPMailer(); //new一个PHPMailer对象出来
    $body            = eregi_replace("[\]",'',$body); //对邮件内容进行必要的过滤
    $mail->CharSet ="utf-8";//设定邮件编码,默认ISO-8859-1,如果发中文此项必须设置,否则乱码
    $mail->IsSMTP(); // 设定使用SMTP服务
    $mail->SMTPDebug  = 1;                     // 启用SMTP调试功能
    // 1 = errors and messages
    // 2 = messages only
    $mail->SMTPAuth   = true;                  // 启用 SMTP 验证功能
    $mail->SMTPSecure = "ssl";                 // 安全协议,可以注释掉
    $mail->Host       = 'stmp.163.com';      // SMTP 服务器
    $mail->Port       = 25;                   // SMTP服务器的端口号
    $mail->Username   = 'smsyun';  // SMTP服务器用户名,PS:我乱打的
    $mail->Password   = 'password';            // SMTP服务器密码
    $mail->SetFrom('xxx@xxx.xxx', 'who');
    $mail->AddReplyTo('xxx@xxx.xxx','who');
    $mail->Subject    = $subject;
    $mail->AltBody    = 'To view the message, please use an HTML compatible email viewer!'; // optional, comment out and test
    $mail->MsgHTML($body);
    $address = $to;
    $mail->AddAddress($address, '');
    //$mail->AddAttachment("images/phpmailer.gif");      // attachment
    //$mail->AddAttachment("images/phpmailer_mini.gif"); // attachment
    if(!$mail->Send()) {
        echo 'Mailer Error: ' . $mail->ErrorInfo;
    } else {
//        echo "Message sent!恭喜,邮件发送成功!";
    }
}
4. 使用函数
 
 
postmail('admin@163.com','测试标题','测试内容');

如果发不出邮件我们可以检测一下是不是邮箱没用开启stmp与pop3功能了,这个可以到163邮箱中去开启了,还有一个如果是新注册的163邮箱是不能发送哦,注册久了才可以使用。

mail函数是php自由的一个邮件发送函数了,但有人在使用mail发邮件时出与标题也内容乱码问题了,那么此问题如何处理呢

使用mail方法发信时,如果标题或发件人含有中文就会造成乱码,而正文不会。解决办法如下

先用函数base64_encode() ? 使用 MIME base64 对数据进行编码
标题字符串前加编码类型例如: =?UTF-8?B?
标题字符串后加:?=
邮件header说明Content-type ? 防止邮件正文也乱码

首先在报文头加入声明

 //如果你的网站是GBK,下面将utf-8改为gbk
$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";

然后在需要使用中文的地方将中文进行如下转移

//如果你的网站是GBK,下面将utf-8改为gb2312
//例如标题
$subject = "新密码通知信";
$subject = "=?UTF-8?B?".base64_encode($subject)."?=";
//例如发件人
$headers .= 'From: =?UTF-8?B?'.base64_encode("某某网站").'?=<service@apieye.com>' . "\r\n";

本文教程我们来讲解使用亚马逊云AMAZON SES发邮件的详细步骤,前面是用文字描述,后面那篇附带了每个步骤的图片。

使用SES发邮件

(1) 使用SES(Simple Email Service)发邮件的时候,我们需要添加一个发件者邮箱(verify email sender),SES使用这个发件者邮箱作为发件者,添加完认证发信者之后,需要登录发信者邮箱点击确认连接。
SNS(简单消息服务)还有个类似的功能,叫topic,类似邮件组,将多个verified receivers添加到一个topic,然后在CloudWatch或者其他的服务调用,来发群邮件。这次先不讨论SNS。
可以使用下面这小段代码来添加verified sender

import boto.ses
conn = boto.ses.connect_to_region('us-east-1')
conn.verify_email_address('sender@address.com')

对了,截止我写这些时,SES只支持三个地区,Virginia,Ireland,Oregon(分别对应us-east-1, eu-west-1, us-west-2)
(2) 接来下我们收集SMTP credential相关信息
在SMTP Settings里面我们可以看到SMTP相关信息,例如Virginia地区的:

Server Name:                          email-smtp.us-east-1.amazonaws.com
Port:                                 25, 465 or 587
Use Transport Layer Security (TLS):   Yes
Authentication:                       Your SMTP credentials - see below.

然后在下面创建SMTP credential点击创建,他就自动创建了一个IAM角色并授权,并产生一组了类似AccessKey的信息,不过名字变成Username和password,形如:

IAM User Name,Smtp Username,Smtp Password
"ses-smtp-user.xxxx",AKIxxx,Aqbxxxxxxxxxxxxxxxxxx

(3) 这样使用SMTP发邮件的信息收集全了。可使用ConfigObj来加载配置文件中的Credential,并用smtplib来创建发邮件的对象

import smtplib
from configobj import ConfigObj

cfg = ConfigObj(config_path)
cfg_dict = cfg.dict()
host = cfg_dict["server"]
from_addr = cfg_dict["from_addr"]
username = cfg_dict["username"]
password = cfg_dict["password"]

server = smtplib.SMTP(host)
server.starttls()
server.login(username, password)
server.sendmail(from_addr, receivers, BODY)
server.quit()

配置文件形如:

server = email-smtp.us-east-1.amazonaws.com
from_addr = sender@domain.com
username = AKIxxx
password = Aqbxxxxxxxxxxxxxxxxxx


使用亚马逊云AMAZON SES发邮件图解步骤

普通企业发邮件很少,一般使用Gmail、163.com、Hotmail.com、QQ邮箱之类的邮箱直接发送就可以了。

但是如果您的客户比较多,日发送量超过500封以上,这就成了一个大问题,因为上面所说邮箱每日发送量都是有限额的,多了就发不出去了。

亚马逊云(aws)是世界上最早的也是最成熟的云平台,它上面提供了一个叫做SES的邮件服务,专门为满足上面所说的情况,每日发送几万封也是没问题得。

注册亚马逊云帐号,搜亚马逊云可找到。

注册帐号的时候需要一个手机、普通信用卡

安装一个普通邮件客户端软件,比如foxmail、outlook

方法/步骤

首先是注册亚马逊云帐号,并登陆AWS管理控制台,选择SES进入。


怎样使用亚马逊云AMAZON SES发邮件。



进入以后,会看到这个蓝色的按钮。

默认注册亚马逊云帐户是不开通SES邮件服务的,需要单独申请。

点击蓝色按钮进入申请页面。


怎样使用亚马逊云AMAZON SES发邮件。



在申请页面前两项是默认的,第三项Region是选择区域,选第一个就行。

Pre-Production Checklist:这个选项中3项全选中。

Use Case Description:这个描述您用SES邮件服务干什么,要写成英文的。


怎样使用亚马逊云AMAZON SES发邮件。



申请完成后,返回SES邮件服务界面,一般亚马逊24小时内会审批完成,就能看到结果。看这张图中的Sending Quota这一条,如果变成了1万,说明亚马逊审核通过,这时候就可以发邮件了。


怎样使用亚马逊云AMAZON SES发邮件。



选中SMTP Setting,点击Create My Smtp这个蓝色的按钮,再点Create按钮,务必记住这个用户名和密码。


怎样使用亚马逊云AMAZON SES发邮件。




怎样使用亚马逊云AMAZON SES发邮件。



安装一个客户端软件,如outlook、foxmail。

根据图片上画出的位置记下对应的SMTP发邮件设置信息,在您的客户端软件里面添上就可以了。


怎样使用亚马逊云AMAZON SES发邮件。



点Email Address,进入验证发邮件地址页面,添加上自己的发信邮箱,验证的时候亚马逊会给您发一封验证信,确认一下就可以。


怎样使用亚马逊云AMAZON SES发邮件。



这时候就可以用您的邮件客户端软件开始发邮件了,一天发上千封是没问题的。

但是这里面有一些注意事项:

1、一个发信邮箱一天最好别发超过5000封,否则以后再发就会进垃圾收件箱。

2、最好不要一次性发出,因为收信邮局有频率限制,连续发太多,实际很多并没有发到。

也可以找一些专业用亚马逊ses发邮件的工具,这些软件一般可以定时发送,设置发送频率,设置发送任务,自动生成邮件黑名单,查询反弹邮件,还有的可以根据不同的客户发送不同的内容等等。

邮件黑名单:空邮件地址和用户退订(用户点这是一封垃圾邮件)

反弹邮件:收到服务器异步返回的信息,有可能是1-2个小时以后才返回,实际由于各种原因并没有发送到,比如发送频率太快,邮件内容不符合要求等。

当然这类工具很多,搜一下就能找到,多对比一下,就能找到自己满意的。

祝大家使用顺利。

注意事项

注册亚马逊云帐号只能是一个信用卡一个电话一个账户,不能重复注册。

申请开通SES邮件服务,需要把申请原因描述的比较清楚,不能一笔带过。

PHPMailer是一个邮件发送插件了,我们可以把PHPMailer安装包解压到Vendor目录中之后然后简单的配置就可以发邮件了,下面来看一个例子.

最近一直在用ThinkPHP框架开发项目, 一般进行用户注册的时候都会发送一封验证邮件, 验证注册. 在这次做的CRM客户管理系统中需要用到邀请注册这个功能, 团队管理员注册之后可通过邮件邀请团队的其他人员进行注册. 如何给团队人员发送邮件, 很流行的一个邮件发送类库就是PHPMailer.

1. 下载PHPmailer并解压到ThinkPHP\Extend\Vendor文件夹下

2. 用ThinkPHP自带的Vendor方法载入第三方类库

3. 配置相关参数.

4.为了方便随意调用, 在common.php创建一个发送邮件的函数, 之后就可以调用此函数发送邮件了

/**
 * 邮件发送
 */
function sendMail(){
    // 载入邮件发送类库
    Vendor('PHPMailer.PHPMailerAutoload');

    $mail = new PHPMailer;

    $mail->isSMTP();        //设置PHPMailer使用SMTP服务器发送Email
    $mail->Host = 'smtp.163.com';   //指定SMTP服务器 可以是smtp.126.com, gmail, qq等服务器 自行查询
    $mail->SMTPAuth = true;
    $mail->CharSet='UTF-8';     //设置字符集 防止乱码
    $mail->Username = 'username@163.com';  //发送人的邮箱账户
    $mail->Password = 'xxxxxxxxxx';   //发送人的邮箱密码
    $mail->Port = 25;   //SMTP服务器端口

    $mail->From = 'user@admin.com';            //发件人邮箱地址
    $mail->FromName = '在路上';                //发件人名称
    $mail->addAddress('guest@test.com');      // 收件人邮箱地址 此处可以发送多个

    $mail->WordWrap = 50;                                 // 换行字符数
    $mail->isHTML(true);                                  // 设置邮件格式为HTML

    $mail->Subject = '青岛XXX';       //邮件标题
    $mail->Body    = '尊敬的先生/女士:<br/>非常抱歉,您接受到这封邮件是因您的好友邀请您加入我们的CRM系统体验当中,请点击以下链接注册账户<a href=####>######</a><br/>如您没有相关意向,请忽略';

    if(!$mail->send()) {
        echo '邮件发送失败.';
        echo '错误信息: ' . $mail->ErrorInfo;
    } else {
        echo '邮件发送成功';
    }
}


定义好函数之后,如果想发送邮件,直接调用 sendMail();

可把发送内容, 发送标题, 收件人全部设置为变量, 例如: sendMail($body, $title, $recipient)  收件人可为数组的形式, 在函数里面循环一下就搞定啦!!  SMTP服务器以及发件人的一些配置可以写到Conf\config.php文件中, 直接C()方法调用即可.


方法二,

第一步 先下载PHPMailer.class.php压缩包(本文上面有附件下载)

解压后会有如下的三个文件:

1.class.pop3.php
2.class.smtp.php
3.PHPMailer.class.php
PHPMailer.class.php这个文件就是核心的文件,把这个文件放到ThinkPHP的扩展包下路径如\下:ThinkPHP\Extend\Library

第二步 在ThinkPHP,common文件中新建一个common.php文件写入如下代码:

functionSendMail($address,$title,$message)
{
import('ORG.Net.PHPMailer');
$mail=newPHPMailer();
// 设置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='zyimm';
// 设置邮件标题
$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());
第三步 在ThinkPHP,conf.php文件写入如下代码:

注意:以下是的我自己QQ邮箱的测试的,每个邮箱参数不同,具体以邮箱为准,qq邮箱的stmp需要自己到邮箱开启的。

returnarray(
//'配置项'=>'配置值'
'MAIL_ADDRESS'=>'799783009@qq.com', // 邮箱地址 
'MAIL_LOGINNAME'=>'799783009@qq.com', // 邮箱登录帐号
'MAIL_SMTP'=>'smtp.qq.com', // 邮箱SMTP服务器
'MAIL_PASSWORD'=>'******', // 邮箱密码
'SHOW_PAGE_TRACE'=>true,
);

第四步 剩下使用了。在ThinkPHP,IndexAction.class.php文件写入如下代码:

// 本类由系统自动生成,仅供测试用途
classIndexAction extendsAction {
publicfunctionindex(){
if(!empty($_POST['title']) && !empty($_POST['content'])){
if(SendMail("597417106@qq.com",$_POST['tile'],$_POST['content']))
echo'发送成功!';
else
echo'发送失败';
}
$this->assign('title','测试标题');
$this->display();
}
}
好了,就这么简单的

方法二算是一个标准的方法了,整体都放到thinkphp类中了,小编推荐使用第二种方案.

笔记遇到一个问题:Claws Mail不识别PHPMailer发送的附件,经过烽数次在网上找资料,终于找到原因并解决,现在把原因及解决办法整理如下 。

环境:Claws Mail 3.9.1, PHP 5.4.16, PHPMailer 5.2.6 c5e9f7873f

现象:PHPMailer 发送带附件的邮件,直接使用 AddAttachment() 方法

$mailer->AddAttachment($attach_file);

没有其他设置。Claws Mail 收到信以后,查看邮件内容为空白, 附件栏显示:

message/rfc822
    multipart/mixed

以下就是空白了。 而能够正常识别附件的邮件,附件栏内容一般为:

message/rfc822
    multipart/mixed
        text/plain
        text/html   (这个是附件的 mime 类型)

gmail 和 mutt 中识别这样的邮件是正常的。

分析:通过对比正常和不正常的邮件原始码, 发现不正常邮件在声明内容是分节之后,多了一句传输编码声明,比如:

Content-Type: multipart/mixed;
    boundary="b1_95a848b14cb4385965320b915d5829dd"
Content-Transfer-Encoding: base64

最后的 Content-Transfer-Encoding 就是比正常邮件多的一行。

由于邮件原始码的这个部分,只是用来声明后续邮件是多个部分组成, 并定义了每个部分的辨识边界 boundary,并没有实际的内容, 所以应当是不需要声明编码类型的。在 PHPMailer 中相关代码为:

  public function GetMailMIME() {
    $result = '';
    switch($this->message_type) {
      case 'inline':
        $result .= $this->HeaderLine('Content-Type', 'multipart/related;');
        $result .= $this->TextLine("tboundary="" . $this->boundary[1].'"');
        break;
      case 'attach':
      case 'inline_attach':
      case 'alt_attach':
      case 'alt_inline_attach':
        $result .= $this->HeaderLine('Content-Type', 'multipart/mixed;');
        $result .= $this->TextLine("tboundary="" . $this->boundary[1].'"');
        break;
      case 'alt':
      case 'alt_inline':
        $result .= $this->HeaderLine('Content-Type', 'multipart/alternative;');
        $result .= $this->TextLine("tboundary="" . $this->boundary[1].'"');
        break;
      default:
        // Catches case 'plain': and case '':
        $result .= $this->TextLine('Content-Type: '.$this->ContentType.'; charset='.$this->CharSet);
        break;
    }
    //RFC1341 part 5 says 7bit is assumed if not specified
    if ($this->Encoding != '7bit') {
      $result .= $this->HeaderLine('Content-Transfer-Encoding', $this->Encoding);
    }

特意加上了这个申明,因为按照 RFC1341,7bit 编码类型是默认的。

解决: 或许问题是出在 Claws Mail 上,但我暂时只能修改 PHPMailer 来适应这个问题了。 上面的问题弄清楚之后,在 multipart 后面不添加传输编码声明即可:

    //RFC1341 part 5 says 7bit is assumed if not specified
    // Not after multipart/mixed, claws-mail will not recoginize attachment
    if (($this->Encoding != '7bit') && (!in_array($this->message_type, array(
        'attach',
        'inline_attach',
        'alt_attach',
        'alt_inline_attach',
    )))) {
      $result .= $this->HeaderLine('Content-Transfer-Encoding', $this->Encoding);
    }

终于解决了这个问题,现在我们可以放心的用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
  • python实现企业微信定时发送文本消息的实例代码

    这篇文章主要介绍了python实现企业微信定时发送文本消息的实例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-11-25
  • PHP测试成功的邮件发送案例

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

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

    //原创:www.111cn.net 注明:转载说明来处www.111cn.net // 昨天听一网友说用php 里面的mail发邮件发不出去,我想一般都是发不了的,现在大多数据邮件提供商都不准那样了...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
  • 解决PHPMailer错误SMTP Error: Could not connect to SMTP host的办法

    PHPMailer发邮件时提示SMTP Error: Could not connect to SMTP host错误是smtp服务器的问题我们一起来看看关于SMTP Error: Could not connect to SMTP host问题的解...2016-11-25
  • php天翼开放平台短信发送接口实现

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

    这篇文章主要介绍了C#实现异步发送邮件的方法,涉及C#异步操作与邮件发送的技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • jQuery实现订单提交页发送短信功能前端处理方法

    这篇文章主要介绍了jQuery实现订单提交页发送短信功能前端处理方法,涉及jQuery响应鼠标事件及针对页面元素的样式与字符串正则操作相关技巧,需要的朋友可以参考下...2016-07-06
  • Qt实现UDP多线程数据处理及发送的简单实例

    本文主要介绍了Qt实现UDP多线程数据处理及发送的简单实例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-10-21
  • phpmailer发送邮件 SMTP Error: Could not authenticate 错误

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

    header("Content-type:text/html;charset=utf-8"); include('phpmailer/class.phpmailer.php'); include('phpmailer/class.smtp.php'); $mail = new PHPMailer();...2016-11-25
  • C++实现含附件的邮件发送功能

    这篇文章主要为大家详细介绍了C++实现含附件的邮件发送功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25