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";
网上有很多朋友用phpmailer组件发送邮件提示:Could not instantiate mail function.错误,解决方案少之用少,原因是服务器没有安装sendmail组件,使用yum进行安装:
yum install sendmail
/etc/init.d/sendmail start
注意:如果sendmail启动缓慢,请将hostname加入到/etc/hosts里面
配置/usr/local/php/etc/php.ini,填写sendmail绝对路径:
vim /usr/local/php/etc/php.ini
sendmail_path = /usr/sbin/sendmail -t -i
:wq!
/etc/init.d/php-fpm restart
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邮箱是不能发送哦,注册久了才可以使用。
本文教程我们来讲解使用亚马逊云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进入。
进入以后,会看到这个蓝色的按钮。
默认注册亚马逊云帐户是不开通SES邮件服务的,需要单独申请。
点击蓝色按钮进入申请页面。
在申请页面前两项是默认的,第三项Region是选择区域,选第一个就行。
Pre-Production Checklist:这个选项中3项全选中。
Use Case Description:这个描述您用SES邮件服务干什么,要写成英文的。
申请完成后,返回SES邮件服务界面,一般亚马逊24小时内会审批完成,就能看到结果。看这张图中的Sending Quota这一条,如果变成了1万,说明亚马逊审核通过,这时候就可以发邮件了。
选中SMTP Setting,点击Create My Smtp这个蓝色的按钮,再点Create按钮,务必记住这个用户名和密码。
安装一个客户端软件,如outlook、foxmail。
根据图片上画出的位置记下对应的SMTP发邮件设置信息,在您的客户端软件里面添上就可以了。
点Email Address,进入验证发邮件地址页面,添加上自己的发信邮箱,验证的时候亚马逊会给您发一封验证信,确认一下就可以。
这时候就可以用您的邮件客户端软件开始发邮件了,一天发上千封是没问题的。
但是这里面有一些注意事项:
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类中了,小编推荐使用第二种方案.
相关文章
- 最近做了个扫描二维码得到vcard的项目,遇到一个问题,有一部分生成完的二维码,用android系统手机扫描后得到的vcard中的中文姓名是乱码,经过比对发现,这部分vcard中ORG这个...2016-11-25
- eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
- 在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
Python astype(np.float)函数使用方法解析
这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08- 这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
- 本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
- 下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 今天在写一个vbs的时候,发现中文乱码,后来写好代码正常运行的代码压缩一下给了同事,发现报无效字符,经过验证后发现原来是编码的问题导致,这里就为大家分享一下...2020-06-30
- CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
- 这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
Android开发中findViewById()函数用法与简化
findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)
最近两天做项目总是被乱码问题困扰着,这不刚把mysql中文乱码问题解决了,下面小编把我的解决方案分享给大家,供大家参考,也方便以后自己查阅。首先:用show variables like “%colla%”;show varables like “%char%”;这两条...2015-11-24- strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
PHP函数分享之curl方式取得数据、模拟登陆、POST数据
废话不多说直接上代码复制代码 代码如下:/********************** curl 系列 ***********************///直接通过curl方式取得数据(包含POST、HEADER等)/* * $url: 如果非数组,则为http;如是数组,则为https * $header:...2014-06-07- Foreach 函数(PHP4/PHP5)foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。...2013-09-28
- 这篇文章主要介绍了C#读取中文文件出现乱码的解决方法,涉及C#中文编码的操作技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
- free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
- PHP 函数 strip_tags 提供了从字符串中去除 HTML 和 PHP 标记的功能,该函数尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果。由于 strip_tags() 无法实际验证 HTML,不完整或者破损标签将导致更多的数...2014-05-31
- 分享一个PHP加密解密的函数,此函数实现了对部分变量值的加密的功能。 加密代码如下: /* *功能:对字符串进行加密处理 *参数一:需要加密的内容 *参数二:密钥 */ function passport_encrypt($str,$key){ //加密函数 srand(...2015-10-30
- 在 php 中使用 json_encode() 内置函数(php > 5.2)可以使用得 php 中数据可以与其它语言很好的传递并且使用它。这个函数的功能是将数值转换成json数据存储格式。<?php$arr = array ( 'Name'=>'希亚', 'Age'...2015-11-08