然后随即生成一个0到最大数之间的一个数,通过循环查看它属于那个区间,返回该区间的key。
代码如下 | 复制代码 |
$prize = array( |
比如我们要发送的附件是“测试.txt”,如果在添加附件的时候强制使用指定文件名的方式:
$mail->AddAttachment($attach, $attach);
那么发送过去的附件文件名将会是乱码,如果不指定:
$mail->AddAttachment($attach, $attach);
那么发送过去的文件名中的中文干脆没了,成了“.txt”。
解决办法
打开class.phpmailer.php,在大概第1007行左右,函数AddAttachment中,有一句
代码如下 | 复制代码 |
//$filename = basename($path); |
解决办法二
如果想设置文件名为中文,则在调用AddAttachment时提供中文的name参数(第二个参数)。
比如
代码如下 | 复制代码 |
$mail->AddAttachment(‘temp/2011/test.rar’, ‘测试.rar’); |
其它问题:发送中文邮件的时候,中文会出现乱码
我看了一下源码,乱码的产生大概是在将邮件标题转成几个小的=?utf-8?B?...?=时,可能是无意中把中文给截断了产生的,所以我的修改更简单而又略微温柔一点,修改第1185行:
代码如下 | 复制代码 |
$maxlen = 75 - 7 - strlen($this->CharSet); |
域名由各国文字的特定字符集、英文字母、数字及“-”(即连字符或减号)任意组合而成, 但开头及结尾均不能含有“-”,“-”不能连续出现 。 域名中字母不分大小写。域名最长可达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"; |
上面的只能简单的验证邮件格式,下面一个更具体验证方法。
PHP如何验证:
<? //PHP验证邮箱格式的函数 if(!valid_email($myeml)){
代码如下
复制代码
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!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&'*+/=?^_`{|}~.-]{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;
}
//应用示例
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的域名部分的有效性 }else{ return false; } ?> |
代码如下 | 复制代码 |
<?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 mail函数发送
使用mail()函数发送邮件,就必须要有一台不需要验证的SMTP服务器。
这样的话配置工作会多一点,但是使用的时候就比较省事了,几行代码就可以
代码如下 | 复制代码 |
$to = "test@163.com"; |
JMail发送邮件
账号必须有smtp发信权限,最好设置$jmail->silent=true,不让jmail自行抛出错误信息。
常用的有网易、sogou、QQ、GMail邮箱。
代码如下 | 复制代码 |
<?php |
发信账号必须有smtp发信权限,对于网易的邮箱,06年后注册的新邮箱好像不行,早期的倒可以。
还有,最好设置$jmail->silent=true,不让jmail自行抛出错误信息,在设置正常的时候,频繁发信会出现一些错误,据我估计应该是发信服务器设置了发信时间间隔。
phpmailer发送邮件,这个是相当简单的也是常用的
代码如下 | 复制代码 |
|
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 非常小巧、简单、方便、快捷