<?php
function outmail($email_to, $email_subject, $email_message, $email_from = '') {
//下面的配置参数请依实际情况注释掉,选用其他段.
//调用示例
//发给一个人outmail('user1 <test1@test1.com>','标题','邮件正文');
//发给一群人outmail('user1 <test1@test1.com>, user2 <test2@test2.net>','标题','邮件正文');
$mail['mailsend'] = 1;
$mail['charset']='utf-8';//发送邮件编码
$mail['maildelimiter'] = 1;//1使用 \r\n 作为分隔符,2使用 \r 作为分隔符,3使用\n分隔
$mail['mailusername'] = 1;//是否收件人包含用户名
$mail['mailprefix'] = "巧维科技";//邮件标题前缀,如填test则邮件标题显示为 [test]我是邮件标题.
$mail['from']="";//默认发件人,只是用于自动填充发件人.实际调用函数时可以被参数替代.
$mail['mailreplyto']="";//默认回复邮件地址,并不是所有的邮件提供商都支持,有时候填了也会自动回复到发件人那里.
*/
/* windows独有,使用windows的
smtp发送,windows必须先安装iis,在安装iis时勾上smtp组件.
$mail['mailsend'] = 3;
$mail['charset']='utf-8';//发送邮件编码
$mail['maildelimiter'] = 1;//1使用 \r\n 作为分隔符,2使用 \r 作为分隔符,3使用\n分隔
$mail['mailusername'] = 1;//是否收件人包含用户名
$mail['mailprefix'] = "系统邮件请勿回复";//邮件标题前缀,如填test则邮件标题显示为 [test]我是邮件标题.
$mail['from']="";//默认发件人,只是用于自动填充发件人.实际调用函数时可以被参数替代.
$mail['mailreplyto']="";//默认回复邮件地址,并不是所有的邮件提供商都支持,有时候填了也会自动回复到发件人那里.
$mail['server'] = 'localhost';
$mail['port'] = '25';
*/
/* linux,windows通用.gmail邮件需要openssl扩展支持. */
$mail['mailsend'] = 2;
$mail['charset'] = 'utf-8'; //发送邮件编码
$mail['maildelimiter'] = 1; //1使用 \r\n 作为分隔符,2使用 \r 作为分隔符,3使用\n分隔
$mail['mailusername'] = 1; //是否收件人包含用户名
$mail['mailprefix'] = "巧维科技"; //邮件标题前缀,如填test则邮件标题显示为 [test]我是邮件标题.
$mail['from'] = ""; //默认发件人,只是用于自动填充发件人.实际调用函数时可以被参数替代.
$mail['mailreplyto'] = ""; //默认回复邮件地址,并不是所有的邮件提供商都支持,有时候填了也会自动回复到发件人那里.
$mail['server'] = 'smtp.gmail.com'; //smtp服务器一般是smtp加域名。如qq的,smtp.qq.com,gmail的smtp.gmail.com
$mail['port'] = 465; //smtp的端口号一般是465或25
$mail['auth'] = 1; //是否需要登录.基本上用网上的邮局如qq,163,sina,99%这个得填1,只有一种情况你自己在windows建邮件服务器可以填0
$mail['from'] = '系统管理员 username@gmail.com'; //发件人,通常和邮箱登录用户名是一样的
$mail['auth_username'] = 'username@gmail.com'; //邮箱登录用户名,是一个完整的邮件地址.如a@a.com
$mail['auth_password'] = 'flksadjfs'; //邮箱登录密码
$mail['ssl'] = 1; //是否需要ssl验证,gmail的验证需要打开这个选项
/*配置结束*/
$mailreplyto = isset($mail['mailreplyto']) ? $mail['mailreplyto'] : $mail['from'];
$maildelimiter = $mail['maildelimiter'] == 1 ? "\r\n" : ($mail['maildelimiter'] == 2 ? "\r" : "\n");
$mailusername = isset($mail['mailusername']) ? $mail['mailusername'] : 1;
$email_subject = '=?' . $mail['charset'] . '?B?' . base64_encode(str_replace("\r", '', str_replace("\n", '', '[' . $mail['mailprefix'] . '] ' . $email_subject))) . '?=';
$email_message = chunk_split(base64_encode(str_replace("\r\n.", " \r\n..", str_replace("\n", "\r\n", str_replace("\r", "\n", str_replace("\r\n", "\n", str_replace("\n\r", "\r", $email_message)))))));
$email_from = $email_from == '' ? '=?' . $mail['charset'] . '?B?' . base64_encode($mail['mailprefix']) . "?= <$adminemail>" : (preg_match('/^(.+?) \<(.+?)\>$/', $email_from, $from) ? '=?' . $charset . '?B?' . base64_encode($from[1]) . "?= <$from[2]>" : $email_from);
foreach (explode(',', $email_to) as $touser) {
$tousers[] = preg_match('/^(.+?) \<(.+?)\>$/', $touser, $to) ? ($mailusername ? '=?' . $mail['charset'] . '?B?' . base64_encode($to[1]) . "?= <$to[2]>" : $to[2]) : $touser;
}
$email_to = implode(',', $tousers);
//构造邮件头.
//邮件头示例
/*
Received: from mail.360buy.com (unknown [211.151.32.10])
by newmx77.qq.com (NewMx) with SMTP id
for <xx@qq.com>; Tue, 17 May 2011 22:13:50 +0800
X-QQ-SSF:00500000000000F00x000001000000
X-QQ-mid:mx77t1305641631t84t13212
Received: from web162 (192.168.10.254) by cas.360buy.com (192.168.80.152) with
Microsoft SMTP Server id 8.1.240.5; Tue, 17 May 2011 22:14:11 +0800
Subject: =?GB2312?Q?=CD=FC=BC=C7=C3=DC=C2=EB=CC=E1=CA=BE?=
Sender: =?GB2312?Q?=BE=A9=B6=AB=CD=F8=C9=CF=C9=CC=B3=C7?=
<customer_service@360buy.com>
From: =?GB2312?Q?=BE=A9=B6=AB=CD=F8=C9=CF=C9=CC=B3=C7?=
<customer_service@360buy.com>
Date: Tue, 17 May 2011 22:12:36 +0800
To: "=?GB2312?Q?xx@qq=2Ecom?=" <xx@qq.com>
X-Priority: 3
X-MSMail-Priority: Normal
Content-Transfer-Encoding: Quoted-Printable
MIME-Version: 1.0
X-Mailer: JMail 4.4 by Dimac
Content-Type: text/html
Message-ID: <14eebe19-3bcb-458a-b25a-94acd11e029b@cas.360buy.com>
Return-Path: customer_service@360buy.com
*/
$headers = "From: $email_from{$maildelimiter}X-Priority: 3{$maildelimiter}X-Mailer: Reynaldliu{$maildelimiter}Return-Path: {$mailreplyto}{$maildelimiter}MIME-Version: 1.0{$maildelimiter}Content-type: text/plain; charset=" . $mail['charset'] . "{$maildelimiter}Content-Transfer-Encoding: base64{$maildelimiter}";
$mail['port'] = $mail['port'] ? $mail['port'] : 25;
if ($mail['mailsend'] == 1 && function_exists('mail')) {
//仅linux或unix或macos独有,不支持windows
@mail($email_to, $email_subject, $email_message, $headers);
} elseif ($mail['mailsend'] == 2) {
//使用smtp方式.如果有ssl需要打开php_openssl的扩展支持,windows,linux,macos系统通用.
if ($mail['ssl'] == 1) {
if (!$fp = fsockopen('ssl://' . $mail['server'], $mail['port'], $errno, $errstr, 30)) {
$errorlog.="($mail[server]:$mail[port]) CONNECT - Unable to connect to the SMTP server";
}
} else {
if (!$fp = fsockopen($mail['server'], $mail['port'], $errno, $errstr, 30)) {
$errorlog.="($mail[server]:$mail[port]) CONNECT - Unable to connect to the SMTP server";
}
}
stream_set_blocking($fp, true);
$lastmessage = fgets($fp, 512);
if (substr($lastmessage, 0, 3) != '220') {
$errorlog.="$mail[server]:$mail[port] CONNECT - $lastmessage";
}
fputs($fp, ($mail['auth'] ? 'EHLO' : 'HELO') . " discuz\r\n");
$lastmessage = fgets($fp, 512);
if (substr($lastmessage, 0, 3) != 220 && substr($lastmessage, 0, 3) != 250) {
$errorlog.="($mail[server]:$mail[port]) HELO/EHLO - $lastmessage";
}
while (1) {
if (substr($lastmessage, 3, 1) != '-' || empty($lastmessage)) {
break;
}
$lastmessage = fgets($fp, 512);
}
if ($mail['auth']) {
fputs($fp, "AUTH LOGIN\r\n");
$lastmessage = fgets($fp, 512);
if (substr($lastmessage, 0, 3) != 334) {
$errorlog.="($mail[server]:$mail[port]) AUTH LOGIN - $lastmessage";
}
fputs($fp, base64_encode($mail['auth_username']) . "\r\n");
$lastmessage = fgets($fp, 512);
if (substr($lastmessage, 0, 3) != 334) {
$errorlog.="($mail[server]:$mail[port]) USERNAME - $lastmessage";
}
fputs($fp, base64_encode($mail['auth_password']) . "\r\n");
$lastmessage = fgets($fp, 512);
if (substr($lastmessage, 0, 3) != 235) {
$errorlog.="($mail[server]:$mail[port]) PASSWORD - $lastmessage";
}
$email_from = $mail['from'];
}
fputs($fp, "MAIL FROM: <" . preg_replace("/.*\<(.+?)\>.*/", "\\1", $email_from) . ">\r\n");
$lastmessage = fgets($fp, 512);
if (substr($lastmessage, 0, 3) != 250) {
fputs($fp, "MAIL FROM: <" . preg_replace("/.*\<(.+?)\>.*/", "\\1", $email_from) . ">\r\n");
$lastmessage = fgets($fp, 512);
if (substr($lastmessage, 0, 3) != 250) {
$errorlog.="($mail[server]:$mail[port]) MAIL FROM - $lastmessage";
}
}
$email_tos = array();
foreach (explode(',', $email_to) as $touser) {
$touser = trim($touser);
if ($touser) {
fputs($fp, "RCPT TO: <" . preg_replace("/.*\<(.+?)\>.*/", "\\1", $touser) . ">\r\n");
$lastmessage = fgets($fp, 512);
if (substr($lastmessage, 0, 3) != 250) {
fputs($fp, "RCPT TO: <" . preg_replace("/.*\<(.+?)\>.*/", "\\1", $touser) . ">\r\n");
$lastmessage = fgets($fp, 512);
$errorlog.= "($mail[server]:$mail[port]) RCPT TO - $lastmessage";
}
}
}
fputs($fp, "DATA\r\n");
$lastmessage = fgets($fp, 512);
if (substr($lastmessage, 0, 3) != 354) {
$errorlog.= "($mail[server]:$mail[port]) DATA - $lastmessage";
}
$headers .= 'Message-ID: <' . gmdate('YmdHs') . '.' . substr(md5($email_message . microtime()), 0, 6) . rand(100000, 999999) . '@' . $_SERVER['HTTP_HOST'] . ">{$maildelimiter}";
fputs($fp, "Date: " . gmdate('r') . "\r\n");
fputs($fp, "To: " . $email_to . "\r\n");
fputs($fp, "Subject: " . $email_subject . "\r\n");
fputs($fp, $headers . "\r\n");
fputs($fp, "\r\n\r\n");
fputs($fp, "$email_message\r\n.\r\n");
$lastmessage = fgets($fp, 512);
if (substr($lastmessage, 0, 3) != 250) {
$errorlog.="($mail[server]:$mail[port]) END - $lastmessage";
}
fputs($fp, "QUIT\r\n");
} elseif ($mail['mailsend'] == 3) {
//windows独有发送
ini_set('SMTP', $mail['server']);
ini_set('smtp_port', $mail['port']);
ini_set('sendmail_from', $email_from);
@mail($email_to, $email_subject, $email_message, $headers);
}
}
?>