Drupal实现邮件订阅推送系统的解决方案
电子邮件营销称为EDM,即Email Direct Marketing的缩写,是在用户事先许可的前提下,通过电子邮件的方式向目标用户传递价值信息的一种网络营销手段。邮件推送是跟用户互动最有效的手段之一,因此任何一个平台,需要跟用户交流,邮件推送系统是必不可少的一个环节。
本文主要讲解如何用drupal搭建一个邮件推送系统,实现用户订阅邮件的发送。
本文参考: http://www.wdtutorials.com/…
第一步,安装模块Simplenews、MailSystem、HTMLMail。
Simplenews是邮件管理发送的核心模块,启用simplenews就可以有一种内容类型,用来创建新的newsletter,MailSystem和HTMLMail,是设置邮件输出内容以及格式用的。
第二步,创建Newsletter。
A. 设置一个测试邮箱(Test Address)admin/config/services/simplenews/settings
B. 创建Newsletter node/add/simplenews
C. 创建完成之后,到newsletter的tab,点击发送测试
设置测试邮件地址截图:
这时候,我们可以到测试邮箱地址查看是否收到了此邮件(涉及本地的sendmail系统和收件箱是否屏蔽垃圾邮件)。
这样两步就完成了一个基本的邮件管理和发送,注意这里的发送用的是Sendmail,也就是系统自带的发送邮件程序,稍微我们讲解如何替换。
第三步,Simplenews高级设置。
a. 默认设置
admin/config/services/simplenews/settings
有很多设置点:默认的format,测试收件箱、发送者、确认邮件的模板、cron发件数量等
b. 创建simplenews分类,然后在具体分类里面设置邮件发送配置
admin/config/services/simplenews
第四步,系统邮件设置 ? drupal Mail System
a. admin/config/system/mailsystem
NEW SETTING 里面选择 simplenews,点击保存。
b. MAIL SYSTEM SETTINGS 里面会有一个 Simplenews module class,选择HTMLMailSystem,点击保存。
给Simplenews模块添加邮件截图:
保存之后,给Simplenews选择邮件处理模块:
第五步. 邮件输出:HTMLMail的模板和Simplenews的Formatter
a. HTML Mail基础设置
admin/config/system/htmlmail
step 1 查看tpl文件和debug属性
step 2 选择使用的theme,选择一个简单theme或者当前theme即可。
注意,这个theme决定了htmlmail模板需要放置的位置。
step 3 输出formatter设置。
推荐新建一个formatter用于newsletter,安装几个推荐filter,比如Emogrifier。
b. simplenews的输出格式(都选择HTML)
默认的formatter在: admin/config/services/simplenews/settings
具体simplenews分类的formatter在: admin/config/services/simplenews
如果分类里面设置为HTML格式,不成功,那就再把默认的formmater也设置为HTML
到这里,就可以测试发送邮件的效果了,看看邮件格式是否正确。
关于邮件的内容正文和内容类型设置有两种方式:
1. 通过Node的body,发不出来的跟邮件的内容同一个body。
2. 通过自定义的Field,然后在tpl里面拼装,不同的用于显示结果不一样。
需要注意的问题:
Simplenews的相关模板的tpl具体在simplenews下面,需要复制到theme下面的话,一般是seven(自己测试一下为什么放到当前theme下不行),所以,推荐直接修改simplenews模块下面的tpl。
HTMLMail的相关tpl主要作用是包装simplenews,把htmlmail?simplenews.tpl.php文件复制到指定的 theme或当前theme下面(这个theme可以在htmlmail模块里设置),然后可以在htmlmail-body标签外面包装自己想要的信息即可。
HTMLMail的tpl可以用于邮件的头尾信息的包装,比如邮件的头部的logo,尾部的版权信息等。
步骤六,邮件的订阅人管理地址: admin/people/simplenews
步骤七,使用Cron发送: admin/config/services/simplenews/settings/mail
设置完成上面的步骤,一个简单的邮件推送系统就搭建完成了,Drupal里面主要还是管理邮件内容和推送用户信息、订阅等信息,真正的发送邮件还是系统的sendmail,如果需要更高效的发送,可以安装postfix。考虑到邮件的认证、域名反向解析、spf以及垃圾邮件处理,可以考虑使用第三方的发送系统,这个时候,我们可以安装Drupal的SMTP模块即可。
在Drupal7以及PHP(也不知那个版本)后,多了一个概念:Stream,主要用来表示文件流。BTW,追溯起Stream的概念,这个应该很早在Java和C#等OOP的语言中已存在,PHP只是简单的封装了file/file_get_content等函数,使用起来方便,所以PHPer 们更少的在意stream以及整个底层的操作。
当我们使用一个完整的框架(如:drupal框架),drupal又更加完善了PHP中stream的概念和使用方式,使其更加OO,更加易用。
注意:PHP本身是支持StreamWrapper的,Drupal只是对其进行完善,因此PHP的函数,如move、 fopen、move_uploaded_file等函数是直接可以用scheme的形式访问(类似php://的形式),在PHP中增加一个 streamwrapper需要注册一个,需要调用stream_wrapper_register函数。
详情参考: http://php.net/..class.streamwrapper.php
Stream是什么?
Stream其实是一个抽象的概念,类似于传输层,位于文件系统的下层。跟Stream相连的就是存储,也就是Stream相当于一传输线,一端连接存储,一端连接程序。
File的操作
文件的操作基本就是读写,读写的位置其实就是stream,一般情况下读写本地文件,我们认为也是一个stream,可以认为 LocalFileStream,读写网络文件(FTP、HTTP、S3、阿里OSS、NFF等)也是一种stream,这样看来,文件的操作API其实应该是一个抽象的函数,而不是一个具体的函数。
用数据库作为类比,数据的open、prepare、update、execute、close就是有一个抽象的类,后端用什么数据库,就有对应的实现,参考下面的图片:
程序调用数据库的抽象接口,该接口根据数据库的url,按照不同的scheme返回不同的数据库操作类,完成对数据库的操作。
因此文件的操作,我们用数据库操作做对比,也可以用下图来表示:
通过上图,我们就可以理解,其实对文件的操作就是对流的操作,不同的流对应不同的存储介质,只是默认情况下,我们认为流就是本地文件,但是随着存储的日益复杂和云的兴起,对文件的操作已不能简单的理解为对本地文件的操作,而应该是对流(Stream)的操作。
因此,在其他语言里面stream是一个基类,根据不同的存储介质,stream有不同的实现,比如C#中的stream的集成关系如下,通过OO的方式,更好的理解stream的概念。
Drupal中File API和Stream Wrapper
一图顶万言,综合上面的理解,我们做了下面这张关系图,虽然不一定准确,但是可以帮助我们理解Drupal中file和stream wrapper的关系。
Drupal的stream wrapper只是一个接口,可以实现任意的自定义stream wrapper。
Drupal的第三方stream wrapper:
Remote stream wrapper(http://、https://、feeds://)
https://www.drupal.org/project/remote_stream_wrapper
System stream wrapper (module://、theme://、profile://、library://)
https://www.drupal.org/project/system_stream_wrapper
因此,标准化的File操作,需要传进去一个带有scheme的path,在PHP中,默认的不带scheme就是本地文件。在Drupal中,默认的scheme是public,也是是本地文件的public目录。
StorageAPI 模块
Drupal中也许对上面的逻辑坐得不够完善,或许抽象层不是很完美,因此storageAPI模块出现了,它扩展的标准的Drupal文件操作,即使你对Drupal的file和stream不懂,装上这个模块,加上对应的service就能实现上图对云文件的操作。 如Amazon S3、Ftp、database等。
(笔者看来,StorageAPI就是对上面图中文件访问结构图中逻辑的实现和完善)
当然这个模块也有缺陷,那就是跟某些第三方模块的兼容的问题,并不是所有模块都能良好的兼容storage api模块,这个也是drupal第三方模块的同病。
注意,要启用drupal文件对storageAPI的支持,需要启用Core Bridge 模块。
StorageAPI模块参考 https://drupal.org/project/storage_api
Storage api stream wrapper :https://www.drupal.org/project/storage_api_stream_wrapper
后记
回顾第一段,PHP内部支持StreamWrapper,在Drupal中,对PHP的StreamWrapper进行了扩展,主要的Interface是:DrupalStreamWrapperInterface
Drupal本身通过这个Interface实现了DrupalLocalStreamWrapper,第三方模块实现了很多,如下:
HPCloud: HPCloudDrupalStreamWrapper
Storage API: StorageApiStreamWrapper
Storage Core Bridge: DrupalStorageStreamWrapper
在php所谓的输出缓冲,就是代码中的echo 或者其他输出命令在执行的时候是先写入到 php buffer,在脚本执行完或者强制执行输出缓存的命令后,才会把数据输出到浏览器(其中php buffer 就是php.ini中设置的output_buffering ,默认是on,表明无限制大小,可以换成数字来限制大小)。
例子:
echo 'www.111cn.net';
echo '技术';
echo '分享';
这两个echo 是按顺序插入到缓冲区的,只有脚本执行完成或者强制执行缓存输出才会把数据输出到浏览器。
如果我想要实时地输出echo的数据,见下面的代码:
ob_end_flush(); //关闭php缓存,或者在flush()前先执行ob_flush(),下面有解释
echo str_pad(" ", 256);
for ($i=5; $i>0; $i--) {
echo $i. '<br>';
flush();
sleep(1);
}
注意:
1:flush和ob_flush 区别:
乍看之下两者很像,而且很多手册的解释也不清楚,模凌两可,其实两者是有很大区别的。
当php.ini没有开启php buffer缓存时,php脚本输出的内容都会在服务端处于等待输出状态 ,不会保存到输出缓存,因为缓存都没开,此时利用flush可以将那些等待输出的内容立即输出来发到客户端(浏览器或者其他输出端)。
当php.ini开启了php buffer缓存后,php脚本输出内容的第一步是存储在输出缓存中 ,此时等到输出的内容是没有数据的,用flush的话是无效果,取不到数据的。因此要先利用ob_flush把输出缓存中的内容取出来变成等待输出的状态,接下来在利用flush把内容发到客户端。执行的顺序是先ob_flush 再 flush。
因此要实现实时地输出,要么利用ob_end_flush 先关掉php 输出缓存后直接flush,要么先 ob_flush再flush。
2:浏览器无法输出实时数据
把代码改成下面的代码,在chrome firefox ie等浏览器都是一次性输出的,很奇葩的现象:
ob_end_flush(); //关闭php缓存,或者在flush前ob_flush();
echo str_pad(" ", 256);
for ($i=5; $i>0; $i--) {
echo $i;
flush();
sleep(1);
}
找了半天的bug,终于发现了个现象,只要顺便加个html标签,即可实时输出。
原因是:只有在遇到html标签的时候才会即时输出,真是神奇,还好一般输出的内容都会带着html标签,很少纯文本。
解决办法:加个回车或者其他的html标签即可解决问题。
一:下面详细介绍out control 的相关函数
1、flush //将等待输出的内容发送带浏览器,不会对缓存区有影响。
2、ob_flush // 将缓存区的内容变成等待输出状态,数据还没有输出到客户端。
3、ob_start(callback) // 打开输出缓冲区,可以加入回调的callback函数,实现在输出之前执行想要的功能。
例子(1)
ob_start('callbackFun');
echo '1111111';
function callbackFun($string){
return md5($string);//进行md5加密
}
结果:
1
e10adc3949ba59abbe56e057f20f883e
浏览器返回的结果是加密过的字符串,而不是 1111111,说明在数据存入输出缓存之前执行了回调函数对数据进行了md5加密后才存入输出缓存的。
例子(2)
结合ob_gzhandler实现网页内容的gzip压缩,减少传输的大小,提高页面的加载速度。
ob_start('ob_gzhandler');
echo str_repeat('hlmblog', 1024);
例子(3)
可以嵌套ob_start,但是记得要有对应的闭合,两个一一对应,不然会报错,或者取不到数据。
ob_start();
var_dump(1);
ob_start();
var_dump(2);
ob_end_flush();
ob_end_flush();
结果:
int 1
int 2
4、ob_get_contents() 获取输出缓冲区的内容或者页面输出的内容
echo str_pad('', 1024);//使缓冲区溢出
ob_start();//打开缓冲区
phpinfo();
$content = ob_get_contents();//获取缓冲区内容
$f = fopen('./phpinfo.txt', 'wb');//打开文件
fwrite($f, $content);//内容写入txt文件
fclose($f);//关闭文件
ob_end_clean();//关闭缓冲区,输出数据并清空浏览器
//ob_end_flush();//发送缓冲区内容到客户端,并关闭缓冲区,不清空浏览器
注意:
这时候浏览器将什么都不输出,因为使用了ob_end_clean() 清空掉了,但是会在当前目录产生一个phpinfo.txt 的文件,里面是获取到的phpinfo信息。
如果使用ob_end_flush,不仅会生成phpinfo.txt 文件,而且还在浏览器输出信息。
5、ob_get_length() 返回输出缓冲区的内容长度
echo str_pad('', 1024);//缓冲区溢出
ob_start();//打开缓冲区
phpinfo();
$string = ob_get_contents();//获取缓冲区内容
$length = ob_get_length();//获取缓冲区内容长度
$re = fopen('./phpinfo.txt', 'wb');
fwrite($re, $string);//将内容写入文件
fclose($re);
var_dump($length); //输出长度
ob_end_flush();//输出并关闭缓冲区
6、ob_get_level() //获取输出缓冲区嵌套级别,就是所处的级别位置
ob_start();
var_dump(ob_get_level());
ob_start();
var_dump(ob_get_level());
ob_end_flush();
ob_end_flush();
浏览器会输出对应的级别:
int 2
int 3
7、ob_get_status() //获取当前缓冲区的状态,返回的是一个数组信息
ob_start('ob_gzhandler');
var_dump(ob_get_status());
ob_start();
var_dump(ob_get_status());
ob_end_flush();
ob_end_flush();
array
'level' => int 2
'type' => int 1
'status' => int 0
'name' => string 'ob_gzhandler' (length=12)
'del' => boolean true
array
'level' => int 3
'type' => int 1
'status' => int 0
'name' => string 'default output handler' (length=22)
'del' => boolean true
返回数组参数详解:
level:嵌套级别,和ob_get_level()获取到的值是一样的。
type :处理缓冲类型,0是系统内部自动处理,1是用户手动处理。
status :缓冲处理状态, 0是开始, 1是进行中, 2是结束。
name: :定义的输出处理函数名称,就是ob_start() 函数中第一个参数的回调函数。
del :是否运行了删除缓冲区操作。
8、ob_list_handlers() //获得处理程序的函数名数组,也就是ob_start函数传入的第一个参数函数名
print_r(ob_list_handlers());
ob_end_flush();
ob_start("ob_gzhandler");
print_r(ob_list_handlers());
ob_end_flush();
浏览器输出对应的处理函数信息数组:
Array ( [0] => default output handler ) Array ( [0] => ob_gzhandler )
9、ob_implicit_flush() // 打开或关闭绝对刷送模式,就是每一次输出后自动执行 flush(),不用对应地写多次的flush,节省代码,提高效率
echo str_pad('', 1024);//缓冲区溢出
ob_end_flush();
ob_implicit_flush(true);//打开绝对刷送
echo 'hlmblog</br>';
//flush();
sleep(1);
echo '分享</br>';
//flush();
sleep(1);
echo '技术</br>';
浏览器实时的输出下面:
hlmblog
分享
技术
10、ob_end_flush() //发送内部缓冲区的内容到浏览器,并且关闭输出缓冲区
11、ob_end_clean() //删除内部缓冲区的内容,并且关闭内部缓冲区
二:控制缓存输出可以用来做什么,具体的几个示例
1:生成静态页面
静态页面的加载速度就是快,这句话是家户喻晓的道理,不用请求数据库,这是多么爽的事情啊。
下面是生成静态页面的例子:
echo str_pad('', 1024);//使缓冲区溢出
ob_start();//打开缓冲区
$content = ob_get_contents();//获取页面输出的内容
$f = fopen('./index.html', 'w');
fwrite($f, $content);//内容写入txt文件
fclose($f);
ob_end_clean();//清空并关闭缓冲区
传说中的静态页面就这样简单的生成。
2:捕获输出
function test($param) {
if($param) {
ob_start();
eval($param);
$contents = ob_get_contents();
ob_end_clean();
}else {
echo '遗憾的没有输出';
exit();
}
return $contents;
}
今天赶上了123System OPenVZ VPS全场半价的机会,购入了一台512MB内存、双核3.49Ghz Xeon E3-1270 V3 CPU的套餐,这是第一次使用123system的产品,整体印象非常不错,就目前而言速度也是杠杠哒,便手动配置起了最新版的Tengine和PHP 5.6.8。在编译完成之后我决定以PHP -FPM的方式来运行PHP,下面是从各处收集到并且重新整理的一些关于FPM使用的技巧,记录一下方便自己与一些平时接触到这方面工作的朋友吧!
1、安装完之后,对php-conf的修改:
修改用户组:
user = www-data
group = www-data
如果www-data用户不存在,那么执行linux命令先添加www-data用户
groupadd www-data
useradd -g www-data www-data
部分参数解析:
pid = run/php-fpm.pid
#pid设置,默认在安装目录中的var/run/php-fpm.pid,建议开启
error_log = log/php-fpm.log
#错误日志,默认在安装目录中的var/log/php-fpm.log
log_level = notice
#错误级别. 可用级别为: alert(必须立即处理), error(错误情况), warning(警告情况), notice(一般重要信息), debug(调试信息). 默认: notice.
emergency_restart_threshold = 60
emergency_restart_interval = 60s
#表示在emergency_restart_interval所设值内出现SIGSEGV或者SIGBUS错误的php-cgi进程数如果超过 emergency_restart_threshold个,php-fpm就会优雅重启。这两个选项一般保持默认值。
process_control_timeout = 0
#设置子进程接受主进程复用信号的超时时间. 可用单位: s(秒), m(分), h(小时), 或者 d(天) 默认单位: s(秒). 默认值: 0.
daemonize = yes
#后台执行fpm,默认值为yes,如果为了调试可以改为no。在FPM中,可以使用不同的设置来运行多个进程池。 这些设置可以针对每个进程池单独设置。
listen = 127.0.0.1:9000
#fpm监听端口,即nginx中php处理的地址,一般默认值即可。可用格式为: 'ip:port', 'port', '/path/to/unix/socket'. 每个进程池都需要设置.
listen.backlog = -1
#backlog数,-1表示无限制,由操作系统决定,此行注释掉就行。backlog含义参考:http://www.3gyou.cc/?p=41
listen.allowed_clients = 127.0.0.1
#允许访问FastCGI进程的IP,设置any为不限制IP,如果要设置其他主机的nginx也能访问这台FPM进程,listen处要设置成本地可被访问的IP。默认值是any。每个地址是用逗号分隔. 如果没有设置或者为空,则允许任何服务器请求连接
2、对Nginx.conf的fastcgi部分修改:
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
3、PHP-FPM启动相关参数
#测试php-fpm配置
/usr/local/php/sbin/php-fpm -t
/usr/local/php/sbin/php-fpm -c /usr/local/php/etc/php.ini -y /usr/local/php/etc/php-fpm.conf -t
#启动php-fpm
/usr/local/php/sbin/php-fpm
/usr/local/php/sbin/php-fpm -c /usr/local/php/etc/php.ini -y /usr/local/php/etc/php-fpm.conf
#关闭php-fpm
kill -INT `cat /usr/local/php/var/run/php-fpm.pid`
#重启php-fpm
kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`
4、Nginx的开启与关闭
结束进程:fuser -k 80/tcp
启动Nginx:sudo /usr/local/nginx/nginx
现在说这个,感觉有点过时了,但是感觉用namespace的人还是不多,估计还是因为不习惯吧。
class把一个一个function组织起来,namespace可以理解成把一个一个class,function等有序的组织起来。个人觉得,namespace的主要优势有
第一,可以更好的管理代码
第二,文件一多,可以避免class,function的重名
第三,代码可读性增强了
1,定义namespace
namespace userCenter; //php代码 namespace userCenter\register; //php代码 namespace userCenter\login { //php代码 }
命名空间不能嵌套或在同一代码处声明多次(只有最后一次会被识别)。但是,你能在同一个文件中定义多个命名空间化的代码,比较合适的做法是每个文件定义一个命名空间(可以是相同命名空间)。
2,调用namespace
\userCenter\register; //绝对调用
userCenter\login; //相对调用
use userCenter\register; //引用空间
use userCenter\register as reg; //引用空间并加别名
3,实例说明
login.class.php
<?php namespace userCenter; function check_username(){ echo "login OK<br>"; } class login{ public function save(){ echo "login had saved<br>"; } } ?> regist.class.php <?php namespace userCenter\regist { function check_username() { echo "regist OK<br>"; } class regist{ public function save(){ echo "regist had saved<br>"; } } } ?>
test.php
<?php require "login.class.php"; require "regist.class.php"; use userCenter\regist; //使用use调用空间 use userCenter\regist as reg; //as定义别名 echo \userCenter\check_username(); //绝对调用 $login = new \userCenter\login(); echo $login->save(); echo regist\check_username(); //相对调用 echo reg\check_username(); //别名调用 $regist = new reg\regist(); echo $regist->save();
使用use,比绝对调用要好一点,好比给class,function等加了一个前缀,这样看起来就比较清楚了
相关文章
- php语言实现redis的客户端与服务端有一些区别了因为前面介绍过服务端了这里我们来介绍客户端吧,希望文章对各位有帮助。 为了更好的了解redis协议,我们用php来实现...2016-11-25
- 有时我们在页面上需要选择数值范围,如购物时选取价格区间,购买主机时自主选取CPU,内存大小配置等,使用直观的滑块条直接选取想要的数值大小即可,无需手动输入数值,操作简单又方便。HTML首先载入jQuery库文件以及jRange相关...2015-03-15
- 本文实例讲述了JS实现的简洁纵向滑动菜单(滑动门)效果。分享给大家供大家参考,具体如下:这是一款纵向布局的CSS+JavaScript滑动门代码,相当简洁的手法来实现,如果对颜色不满意,你可以试着自己修改CSS代码,这个滑动门将每一...2015-10-21
- 这篇文章主要为大家详细介绍了python实现学生通讯录管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-25
jQuery+slidereveal实现的面板滑动侧边展出效果
我们借助一款jQuery插件:slidereveal.js,可以使用它控制面板左右侧滑出与隐藏等效果,项目地址:https://github.com/nnattawat/slideReveal。如何使用首先在页面中加载jquery库文件和slidereveal.js插件。复制代码 代码如...2015-03-15- 翻板抽奖的实现流程:前端页面提供6个方块,用数字1-6依次表示6个不同的方块,当抽奖者点击6个方块中的某一块时,方块翻转到背面,显示抽奖中奖信息。看似简单的一个操作过程,却包含着WEB技术的很多知识面,所以本文的读者应该熟...2015-10-21
SQLMAP结合Meterpreter实现注入渗透返回shell
sqlmap 是一个自动SQL 射入工具。它是可胜任执行一个广泛的数据库管理系统后端指印, 检索遥远的DBMS 数据库等,下面我们来看一个学习例子。 自己搭建一个PHP+MYSQ...2016-11-25- 复制代码 代码如下: // 第一种写法 $da = date("w"); if( $da == "1" ){ echo "今天是星期一"; }else if( $da == "2" ){ echo "今天是星期二"; }else if( $da == "3" ){ echo "今天是星期三"; }else if( $da == "4"...2013-10-04
- 这篇文章主要为大家详细解析了BootStrap栅格系统、表单样式与按钮样式源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2017-01-23
- 这篇文章研究的主要内容就是使用PHP来发送电子邮件,总结为以下两种方法:一、使用PHP内置的mail()函数<?php $to = "test@163.com"; //收件人 $subject = "Test"; //主题 $message = "This is a test mail!"; //正文...2015-10-30
- 如今高要求的分布式系统的建造者遇到了不能完全由传统的面向对象编程(OOP)模型解决的挑战,但这可以从Actor模型中获益。...2021-05-20
- 这篇文章主要介绍了c# 如何实现发送邮件的功能,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-07
- js里面设置DOM节点透明度的函数属性:filter= "alpha(opacity=" + value+ ")"(兼容ie)和opacity=value/100(兼容FF和GG)。 先来看看设置透明度的兼容性代码: 复制代码 代码如下: function setOpacity(ele, opacity) { if (...2014-06-07
- 护卫神·主机管理系统该版本支持在Windows Server 200320082012,含32位和64位,直接开设配置WEB站、FTP站,以及SQL Server和MySQL,是您开设和管理虚拟主机的绝好帮手。但是对于新用户可能在使用上有一些困难,因此请仔细阅读如下说明文档...2016-01-27
- 这篇文章研究的主要内容就是使用PHP来发送电子邮件,总结为以下两种方法:一、使用PHP内置的mail()函数<?php $to = "test@163.com"; //收件人 $subject = "Test"; //主题 $message = "This is a test mail!"; //正文...2015-10-30
- 这篇文章主要介绍了利用C#修改Windows操作系统时间,帮助大家更好的利用c#操作系统,感兴趣的朋友可以了解下...2020-12-08
- 本文我们需要解决的问题是如何实现Http请求来实现通信,解决Android 2.3 版本以后无法使用Http请求问题,下面请看正文。 Android开发中使用HttpClient来开发Http程序...2016-09-20
vivo OriginOS新系统如何更新 originos系统更新方法
vivo新系统更新的步骤是什么?如何更新到vivo的最新系统?vivo的最新系统太亮眼了,不少vivo的用户都在跃跃欲试想体验一下最新的系统。vivo新系统虽然做出来了不过我们想体验的话还是要等待一段时间。到时大家通过下面的方法就可以使用到新系统了...2020-12-08- 这篇文章主要介绍了c#使用netmail方式发送邮件的示例,大家参考使用吧...2020-06-25
- 这篇文章主要为大家详细介绍了C#实现影院售票系统,解析了售票系统的难点,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25