一个简单php 抽奖小程序

 更新时间:2016年11月25日 17:00  点击:1582
一个抽奖小程序,概论可控,也可某个奖品在前端显示,而程序中根本不可能获得! 把所有的概率x10后相加起来,新数组中每项的值等于它前几个的和加上它本身。


然后随即生成一个0到最大数之间的一个数,通过循环查看它属于那个区间,返回该区间的key。

 代码如下 复制代码

$prize = array(
 1 => 3.5,  //3.5%机率
 2 => 2.5,
 3 => 6,
 4 => 2,
 5 => 42,  //42%机率
 6 => 36,
 7 => 2,
 8 => 4,
 9 => 2
);
//最后确认相加等于100
$prizeList = array(
 1 => array('小仙子'),
 2 => array('5Q币'),
 3 => array('38888游戏币'),
 4 => array('88888游戏币'),
 5 => array('谢谢参与!'),
 6 => array('欢迎下次再来!'),
 7 => array('10Q币'),
 8 => array('888银元宝(绑定)'),
 9 => array('随机高级坐骑(绑定)')
);
//unset($prize[7]); 直接把10Q这个奖品去掉
 
$times = 10;
$max = 0;
foreach ($prize as $k => $v)
{
 $max = $v * $times + $max;
 $row['v'] = $max;
 $row['k'] = $k;
 $prizeZone[] = $row;
}
 
$max--; //临界值
$rand = mt_rand(0, $max);
$zone = 1;
foreach ($prizeZone as $k => $v)
{
 if ($rand >= $v['v'])
 {
  if ($rand >= $prizeZone[$k + 1]['v'])
  {
   continue;
  }
  else
  {
   $zone = $prizeZone[$k + 1]['k'];
   break;
  }
 }
 $zone = $v['k'];
 break;
}
print_r($prizeList[$zone][0]);

可能使用了PHPMailer发送邮件的朋友带中文附件名时会出现乱码,下面我来介绍一个解决办法。

比如我们要发送的附件是“测试.txt”,如果在添加附件的时候强制使用指定文件名的方式:

$mail->AddAttachment($attach, $attach);
那么发送过去的附件文件名将会是乱码,如果不指定:

$mail->AddAttachment($attach, $attach);
那么发送过去的文件名中的中文干脆没了,成了“.txt”。


解决办法

打开class.phpmailer.php,在大概第1007行左右,函数AddAttachment中,有一句

 代码如下 复制代码

//$filename = basename($path);
if (false === strpos($path, ‘/’))
$filename = $this->EncodeHeader($path);
else
$filename = $this->EncodeHeader(substr($path, strrpos($path, ‘/’) + 1));


解决办法二

如果想设置文件名为中文,则在调用AddAttachment时提供中文的name参数(第二个参数)。
比如

 代码如下 复制代码
$mail->AddAttachment(‘temp/2011/test.rar’, ‘测试.rar’);

其它问题:发送中文邮件的时候,中文会出现乱码

我看了一下源码,乱码的产生大概是在将邮件标题转成几个小的=?utf-8?B?...?=时,可能是无意中把中文给截断了产生的,所以我的修改更简单而又略微温柔一点,修改第1185行:

 代码如下 复制代码

$maxlen = 75 - 7 - strlen($this->CharSet);
改成:
$maxlen = 75000 - 7 - strlen($this->CharSet);

下面我来总结了在php邮箱验证的正则表达式以及还可以checkdnsrr函数来验证你输入的邮箱是否是有效的哦,这样可以更好的过滤到无效邮箱地址哦。

域名由各国文字的特定字符集、英文字母、数字及“-”(即连字符或减号)任意组合而成, 但开头及结尾均不能含有“-”,“-”不能连续出现 。 域名中字母不分大小写。域名最长可达60个字节(包括后缀.com、.net、.org等)。
/^[a-z]([a-z0-9]*[-_]?[a-z0-9]+)*@([a-z0-9]*[-_]?[a-z0-9]+)+[.][a-z]{2,3}([.][a-z]{2})?$/i;
/内容/i 构成一个不区分大小写的正则表达式

 代码如下 复制代码

$email = "tanklo_--vehy@yahoo.com.cn";
    function check_email($email) {
       $pattern_test = "/([a-z0-9]*[-_.]?[a-z0-9]+)*@([a-z0-9]*[-_]?[a-z0-9]+)+[.][a-z]{2,3}([.][a-z]{2})?/i";
       return  preg_match($pattern_test,$email);
    }
echo check_email($email);

上面的只能简单的验证邮件格式,下面一个更具体验证方法。

PHP如何验证:

 代码如下 复制代码

<?

//PHP验证邮箱格式的函数
function valid_email($email) {
// First, we check that there's one @ symbol, and that the lengths are right
if (!ereg("^[^@]{1,64}@[^@]{1,255}$", $email)) {
// Email invalid because wrong number of characters in one section, or wrong number of @ symbols.
return false;
}
// Split it into sections to make life easier
$email_array = explode("@", $email);
$local_array = explode(".", $email_array[0]);
for ($i = 0; $i < sizeof($local_array); $i++) {
if (!ereg("^(([A-Za-z0-9!#$%&#038;'*+/=?^_`{|}~-][A-Za-z0-9!#$%&#038;'*+/=?^_`{|}~.-]{0,63})|("[^(\|")]{0,62}"))$", $local_array[$i])) {
return false;
}
}
if (!ereg("^[?[0-9.]+]?$", $email_array[1])) { // Check if domain is IP. If not, it should be valid domain name
$domain_array = explode(".", $email_array[1]);
if (sizeof($domain_array) < 2) {
return false; // Not enough parts to domain
}
for ($i = 0; $i < sizeof($domain_array); $i++) {
if (!ereg("^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$", $domain_array[$i])) {
return false;
}
}
}
return true;
}


//应用示例

if(!valid_email($myeml)){
echo"<script>alert('Please enter a valid e-mail address');location.href='javascript:history.back()'</script>";
break;
}
?>

 

无意中就发现checkdnsrr函数那里就有了更精妙的例子,分享给大家!

 代码如下 复制代码

< ?php

function validate_email($email){

$exp = "^[a-z'0-9]+([._-][a-z'0-9]+)*@([a-z0-9]+([._-][a-z0-9]+))+$";

if(eregi($exp,$email)){ //先用正则表达式验证email格式的有效性

if(checkdnsrr(array_pop(explode("@",$email)),"MX")){//再用checkdnsrr验证email的域名部分的有效性
return true;
}else{
return false;
}

}else{

return false;

}
}

?>

首先,先到http://phpmailer.sourceforge.net/这个地址去下载最新的PHPMailer的包(PHPMailer方法必须使用这个包)。   下载完成后解压到相应的目录。可以看到解压后的文件夹里面的class.phpmailer.php(调用PHPMailer需要包含这个文件)
 代码如下 复制代码
<?php   
require("phpmailer/class.phpmailer.php");   
function smtp_mail( $sendto_email, $subject, $body, $extra_hdrs, $user_name){   
    $mail = new PHPMailer();   
    $mail->IsSMTP();                  // send via SMTP   
    $mail->Host = "smtp.163.com";   // SMTP servers   
    $mail->SMTPAuth = true;           // turn on SMTP authentication   
    $mail->Username = "xuchao842363331";     // SMTP username  注意:普通邮件认证不需要加 @域名  这里是我的163邮箱
    $mail->Password = "password"; // SMTP password    在这里输入邮箱的密码
    $mail->From = "xuchao842363331@163.com";      // 发件人邮箱   
    $mail->FromName =  "管理员";  // 发件人   
 
    $mail->CharSet = "UTF-8";   // 这里指定字符集!    指定UTF-8后邮件的标题和发件人等等不会乱码,如果是GB2312标题会乱码
    $mail->Encoding = "base64";   
    $mail->AddAddress($sendto_email,"username");  // 收件人邮箱和姓名   
    $mail->AddReplyTo("yourmail@yourdomain.com","yourdomain.com");   
    //$mail->WordWrap = 50; // set word wrap 换行字数   
    //$mail->AddAttachment("/var/tmp/file.tar.gz"); // attachment 附件   
    //$mail->AddAttachment("/tmp/image.jpg", "new.jpg");   
    //$mail->IsHTML(true);  // send as HTML   
    // 邮件主题   
    $mail->Subject = $subject;   
    // 邮件内容   
    $mail->Body = "hello!PHPMailer";                                                                         
    //$mail->AltBody ="text/html";   
    if(!$mail->Send())   
    {   
        echo "error <p>";   
        echo "error: " . $mail->ErrorInfo;   
        exit;   
    }   
    else {   
        echo"success!";
    }   
}   
// 参数说明(发送到, 邮件主题, 邮件内容, 附加信息, 用户名)     
?>

里要说明一下:当字符集指定为GB2312的时候标题会乱码,这里指定为UTF-8不会出现乱码。

  其实,PHPMailer还有很多功能,比如可以添加附件等等,这里就不再演示了。 

  这样在你需要用邮件功能的时候调用这个函数就可以了:

 

 代码如下 复制代码
<?php    
require("mail.php");    
  
smtp_mail("842363331@qq.com", "催还", "", "", "username");   
 
?>
下面总结了三种在php实现邮件发送的实现代码,包括有phpmailer,mail()函数,JMail()这三种哦,有需要的朋友可参考一下。

利用php mail函数发送

使用mail()函数发送邮件,就必须要有一台不需要验证的SMTP服务器。

这样的话配置工作会多一点,但是使用的时候就比较省事了,几行代码就可以

 代码如下 复制代码

$to = "test@163.com";
$subject = "Test";
$message = "This is a test mail!";
mail($to,$subject,$message);

JMail发送邮件

账号必须有smtp发信权限,最好设置$jmail->silent=true,不让jmail自行抛出错误信息。
常用的有网易、sogou、QQ、GMail邮箱。

 代码如下 复制代码

<?php 
$jmail = new COM('JMail.Message')   o&#114; die('无法调用Jmail组件'); 
$jmail->silent = true; //屏蔽例外错误 
$jmail->charset = 'gb2312'; //否则中文会乱码 
$jmail->From = 'web535000@163.com'; //这里理论上是可以不与发件人地址相同的,但用163的试了几次都不行,改成一样的就可以了 
$jmail->FromName = 'BoboTest'; 
$jmail->AddRecipient('abc1@163.com'); //可添加多个邮件接受者 
//$jmail->AddRecipient('abc2@163.com'); 
//$jmail->AddRecipient('abc3@163.com'); 
$jmail->Subject = 'email test.'; 
$jmail->Body = 'this is test email.';  
$jmail->MailServerUserName = 'web535000@163.com'; //发信邮件账号 
$jmail->MailServerPassword = '123456'; //账户的密码 
try{ 
    $email = $jmail->Send('smtp.163.com'); 
    if($email) echo '发送成功'; 
    else echo '发送失败'; 
} catch (Exception $e){ 
    echo $e->getMessage(); 

?> 

发信账号必须有smtp发信权限,对于网易的邮箱,06年后注册的新邮箱好像不行,早期的倒可以。
还有,最好设置$jmail->silent=true,不让jmail自行抛出错误信息,在设置正常的时候,频繁发信会出现一些错误,据我估计应该是发信服务器设置了发信时间间隔。

phpmailer发送邮件,这个是相当简单的也是常用的

 代码如下 复制代码


function postmail_jiucool_com($to,$subject = "",$body = ""){
    //Author:Jiucool WebSite: http://www.jiucool.com
    //$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       = "smtp.googlemail.com";      // SMTP 服务器
    $mail->Port       = 465;                   // SMTP服务器的端口号
    $mail->Username   = "SMTP服务器用户名";  // SMTP服务器用户名
    $mail->Password   = "SMTP服务器密码";            // SMTP服务器密码
    $mail->SetFrom('发件人地址,如admin#jiucool.com #换成@', '发件人名称');
    $mail->AddReplyTo("邮件回复地址,如admin#jiucool.com #换成@","邮件回复人的名称");
    $mail->Subject    = $subject;
    $mail->AltBody    = "To view the message, please use an HTML compatible email viewer! - From www.111cn.net"; // 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!恭喜,邮件发送成功!";
        }
    }

PHPMailer的主要功能特点:

1.支持邮件 s/mime加密的数字签名
2.支持邮件多个 TOs, CCs, BCCs and REPLY-TOs
3.可以工作在任何服务器平台,所以不用担心WIN平台无法发送邮件的问题的
4.支持文本/HTML格式邮件
5.可以嵌入image图像
6.对于邮件客户端不支持HTML阅读的进行支持
7.功能强大的发送邮件调试功能debug
8.自定义邮件header
9.冗余SMTP服务器支持
10.支持8bit, base64, binary, and quoted-printable 编码
11.文字自动换行
12.支持多附件发送功能
13.支持SMTP服务器验证功能
14.在Sendmail, qmail, Postfix, Gmail, Imail, Exchange 等平台测试成功
15.提供的下载文件中,包括内容详细的说明文档及示例说明,所以不用担心难于上手的问题!
16.PHPMailer 非常小巧、简单、方便、快捷

[!--infotagslink--]

相关文章

  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • C#使用Process类调用外部exe程序

    本文通过两个示例讲解了一下Process类调用外部应用程序的基本用法,并简单讲解了StartInfo属性,有需要的朋友可以参考一下。...2020-06-25
  • 微信小程序 页面传值详解

    这篇文章主要介绍了微信小程序 页面传值详解的相关资料,需要的朋友可以参考下...2017-03-13
  • 使用GruntJS构建Web程序之构建篇

    大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
  • uniapp微信小程序:key失效的解决方法

    这篇文章主要介绍了uniapp微信小程序:key失效的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-20
  • js组件SlotMachine实现图片切换效果制作抽奖系统

    这篇文章主要介绍了js组件SlotMachine实现图片切换效果制作抽奖系统的相关资料,需要的朋友可以参考下...2016-04-19
  • PHP常用的小程序代码段

    本文实例讲述了PHP常用的小程序代码段。分享给大家供大家参考,具体如下:1.计算两个时间的相差几天$startdate=strtotime("2009-12-09");$enddate=strtotime("2009-12-05");上面的php时间日期函数strtotime已经把字符串...2015-11-24
  • 将c#编写的程序打包成应用程序的实现步骤分享(安装,卸载) 图文

    时常会写用c#一些程序,但如何将他们和photoshop一样的大型软件打成一个压缩包,以便于发布....2020-06-25
  • 微信小程序自定义tabbar组件

    这篇文章主要为大家详细介绍了微信小程序自定义tabbar组件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-03-14
  • 微信小程序 网络请求(GET请求)详解

    这篇文章主要介绍了微信小程序 网络请求(GET请求)详解的相关资料,需要的朋友可以参考下...2016-11-22
  • 微信小程序如何获取图片宽度与高度

    这篇文章主要给大家介绍了关于微信小程序如何获取图片宽度与高度的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-10
  • 微信小程序二维码生成工具 weapp-qrcode详解

    这篇文章主要介绍了微信小程序 二维码生成工具 weapp-qrcode详解,教大家如何在项目中引入weapp-qrcode.js文件,通过实例代码给大家介绍的非常详细,需要的朋友可以参考下...2021-10-23
  • Python爬取微信小程序通用方法代码实例详解

    这篇文章主要介绍了Python爬取微信小程序通用方法代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-29
  • 微信小程序(应用号)开发新闻客户端实例

    这篇文章主要介绍了微信小程序(应用号)开发新闻客户端实例的相关资料,需要的朋友可以参考下...2016-10-25
  • 微信小程序手势操作之单触摸点与多触摸点

    这篇文章主要介绍了微信小程序手势操作之单触摸点与多触摸点的相关资料,需要的朋友可以参考下...2017-03-13
  • 微信小程序 页面跳转传递值几种方法详解

    这篇文章主要介绍了微信小程序 页面跳转传递值几种方法详解的相关资料,需要的朋友可以参考下...2017-01-16
  • 手把手教你uniapp和小程序分包(图文)

    本文主要介绍了手把手教你uniapp和小程序分包,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-02
  • 微信小程序实现点击导航条切换页面

    这篇文章主要为大家详细介绍了微信小程序实现点击导航条切换页面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-11-19
  • 微信小程序实现canvas分享朋友圈海报

    这篇文章主要为大家详细介绍了微信小程序实现canvas分享朋友圈海报,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-21