大佬教程收集整理的这篇文章主要介绍了uchome发送邮件失败,需要修改sendmail设置,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
概述
装了个UCHOME,设置一些参数的时候
发现了个问题,怎么弄也不能发送邮件,比较郁闷,去discuz
查了N多资料,也还是不行,按照上面设置的步骤来,还是不可以,比较头疼,大致原因好像是这样环境:Windows操作系统,IIS6.0做为
php解释引擎可能为windows原因,服务器又没有安装邮件系统,所以默认的发送方法不可行,也就是"通过
php 函数的 sendmail 发送(推荐此方式)",实验了N多次,不可以.没有办法,只好自己
看代码修改了,通过第二种方式,也就是"通过 SOCKET 连接 SMTP 服务器发送(支持 ESMTP 验证)",但是实验了几个邮箱,QQ的没有发送成功,gmail没有发送成功,但是foxmail发送成功了.这个时候有点知道了,按理说应该是服务器设置原因,gmail必须要安全验证,也就是ssl发送才可以,
看了下UCHOME的邮件发送代码,发现挺简单,加一句话就可以了.打开
source/function_sendmai
l.php,查找fsockopen,然后修改这句为:fsockopen("ssl://".$mail['server'], $mail[
'port'], $errno, $errstr, 30)这样的话,就可以了,但
是需要服务器支持OpenSSL,这个可以通过查看
phpINFO来确定是否支持,嘿嘿,
本来偶的也不支持,但是联系了下陈哥,帮忙解决了.如何开启OpenSSL和mcrypt到此为止,OK了,Discuz论坛上一堆人文这个问题,但是没几个说怎么解决的,翻来覆去都是那么几个帖子,拜托,就那么几个选项还能不知道怎么填么,问题是根本没把问题描述清楚.- -#PS:而且sendmai
l.php这个文件在官方的程序里面貌似还没有?至少我这个版本里面没有,不知道大C他们搞什么呢.下面是这个文件的代码,放到/
source/cron/文件夹下面就可以了. 代码 1 <?
php 2 /* 3
[UCenter Home] (
C) 2007-2008 Comsenz Inc. 4
$Id: sendmai
l.php 8302 2008-08-01 02
:10:28Z liguode $ 5 */ 6 if(!defined('IN_UCHOME
')) { 7
exit('Access Denied'
); 8 } 9 10 //防止超时 11 set_time_limit(0
); 12 13 //一次发送邮件个数 14 $pernum =
5; 15 16 include_once(S_ROOT.'./
source/function_sendmai
l.php'
); 17 18 //获取发送队列 19 $emails = $touids =
array(
); 20 $query = $_SGLOBAL['db']->query(
"seleCT touid, email FROM ".tname
('Mailcron')." WHERE sendtime<='$_SGLOBAL[
timestamp]' ORDER BY sendtime LIMIT 0,$pernum"
); 21 while ($value = $_SGLOBAL['db']->fetch_array($query))
{ 22
if($value[
'eR_981_11845@ail'])
{ 23
$emails[$value[
'eR_981_11845@ail']] = $value[
'eR_981_11845@ail']; 24
} elseif ($value['touid'])
{ 25
$touids[$value['touid']] = $value['touid']; 26
} 27 } 28 29 //获取用户邮件
30 $useremails = $deluids =
array(
); 31 if($touids)
{ 32
$query = $_SGLOBAL['db']->query(
"seleCT sf.email
check, sf.email,
S.Uid,
s.lastsend,
S.Up
datetiR_981_11845@e 33
FROM ".tname('space')." s 34
LEFT JOIN ".tname('spacefield')." sf ON sf.uid=
S.Uid 35
WHERE
S.Uid IN (".simplode($touids).")"
); 36
while ($value = $_SGLOBAL['db']->fetch_array($query))
{ 37
if($_SCONFIG['sendmailday'] && $value[
'eR_981_11845@ail
check'] && $value[
'eR_981_11845@ail'] && ($_SGLOBAL['
timestamp'] - $value['lastlogin'] > $_SCONFIG['sendmailday']*86400))
{ 38
$useremails[$value['uid']] = $value[
'eR_981_11845@ail']; 39
} else
{ 40
$deluids[$value['uid']] = $value['uid']; 41
unset($touids[$value['uid']]
); 42
} 43
} 44 } 45 46 47 48 //删除无效的用户邮件 49 if($deluids)
{ 50
$_SGLOBAL['db']->query("
deletE FROM ".tname
('Mailcron')." WHERE touid IN (".simplode($deluids).")"
); 51
$_SGLOBAL['db']->query("
deletE FROM ".tname
('Mailqueue')." WHERE touid IN (".simplode($deluids).")"
); 52 } 53 54 //获取邮件队列 55 $wherearr = $sends = $sendmails =
array(
); 56 if($emails)
{ 57
$wherearr[] =
'email IN ('.simplode($emails).')'; 58 } 59 if($touids)
{ 60
$wherearr[] =
'touid IN ('.simplode($touids).')'; 61 } 62 63 if($wherearr)
{ 64
$query = $_SGLOBAL['db']->query(
"seleCT * FROM ".tname
('Mailqueue')." WHERE ".implode(' OR
', $wherearr)
); 65
while ($value = $_SGLOBAL['db']->fetch_array($query))
{ 66
if($value['touid'])
{ 67
$value[
'eR_981_11845@ail'] = $useremails[$value['touid']]; 68
} 69
$sendmails[$value[
'eR_981_11845@ail']] = $value[
'eR_981_11845@ail']; 70
$sends[$value[
'eR_981_11845@ail']]['sub
ject'][] = $value['sub
ject']; 71
$sends[$value[
'eR_981_11845@ail']]['
message'][] = $value['
message']; 72
$sends[$value[
'eR_981_11845@ail']]['dateline'][] = $value['dateline']; 73
} 74
//删除当前已执行的队列 75
$_SGLOBAL['db']->query("
deletE FROM ".tname
('Mailcron')." WHERE ".implode(' OR
', $wherearr)
); 76
$_SGLOBAL['db']->query("
deletE FROM ".tname
('Mailqueue')." WHERE ".implode(' OR
', $wherearr)
); 77 78
//更新用户最后发送时间 79
if($touids)
{ 80
$_SGLOBAL['db']->query("
updatE ".tname('space')." SET lastsend='$_SGLOBAL[
timestamp]' WHERE uid IN (".simplode($touids).")"
); 81
} 82 } 83 84 //开始发送邮件 85 foreach ($sendmails as $email)
{ 86
$
thesend = $sends[$email]; 87
$sub
ject = $
thesend['sub
ject']
[0]; 88
$
message =
''; 89
foreach ($
thesend[
装了个UCHOME,设置一些参数的时候发现了个问题,怎么弄也不能发送邮件,比较郁闷,去discuz查了N多资料,也还是不行,按照上面设置的步骤来,还是不可以,比较头疼,大致原因好像是这样
环境:Windows操作系统,IIS6.0做为PHP解释引擎
可能为windows原因,服务器又没有安装邮件系统,所以默认的发送方法不可行,也就是"通过 PHP 函数的 sendmail 发送(推荐此方式)",实验了N多次,不可以.
没有办法,只好自己看代码修改了,通过第二种方式,也就是"通过 SOCKET 连接 SMTP 服务器发送(支持 ESMTP 验证)",但是实验了几个邮箱,QQ的没有发送成功,gmail没有发送成功,但是foxmail发送成功了.这个时候有点知道了,按理说应该是服务器设置原因,gmail必须要安全验证,也就是ssl发送才可以,看了下UCHOME的邮件发送代码,发现挺简单,加一句话就可以了.
打开source/function_sendmail.PHP,查找fsockopen,然后修改这句为:
fsockopen("ssl://".$mail['server'],$mail['port'],$errno,$errstr,30) 这样的话,就可以了,但是需要服务器支持OpenSSL,这个可以通过查看PHPINFO来确定是否支持,嘿嘿,本来偶的也不支持,但是联系了下陈哥,帮忙解决了.到此为止,OK了,Discuz论坛上一堆人文这个问题,但是没几个说怎么解决的,翻来覆去都是那么几个帖子,拜托,就那么几个选项还能不知道怎么填么,问题是根本没把问题描述清楚.- -#
PS:而且sendmail.PHP这个文件在官方的程序里面貌似还没有?至少我这个版本里面没有,不知道大C他们搞什么呢.下面是这个文件的代码,放到/source/cron/文件夹下面就可以了.
<div class="cnblogs_code" onclick="cnblogs_code_show('5192f114-7136-49bd-8b3e-76fec367bfbf')">
<img class="code_img_closed" id="code_img_closed_5192f114-7136-49bd-8b3e-76fec367bfbf" src="http://code.js-code.com/res/2019/02-07/12/1c53668bcee393edac0d7b3b3daff1ae.gif" alt=""><img class="code_img_opened" id="code_img_opened_5192f114-7136-49bd-8b3e-76fec367bfbf" style="display: none" onclick="cnblogs_code_hide('5192f114-7136-49bd-8b3e-76fec367bfbf',event)" src="http://code.js-code.com/res/2019/02-07/12/405b18b4b6584ae338e0f6ecaf736533.gif"><span class="cnblogs_code_collapse">代码
<div class="cnblogs_code_hide" id="cnblogs_code_open_5192f114-7136-49bd-8b3e-76fec367bfbf">
@H_
674_32@
<>
PHP PHP 8302 2008-08-01 02
:10:28Z liguode $
发送邮件个数
PHP 获取发送队列
@H_
696_251@
<>
@H_
696_251@
获取用户邮件 @H_
696_251@
@H_
696_251@
figfig 删除无效的
用户邮件 @H_
696_251@
@H_
696_251@
获取邮件队列
@H_
696_251@
@H_
696_251@
删除当前已执行的队列
@H_
696_251@
@H_
696_251@
新用户最后发送时间
@H_
696_251@
发送邮件 (