手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表分类:PHP

转:HTML 格式的邮件如何定义 CSS

转这篇文章之前,先介绍一下"SEGMENTFAULT(http://segmentfault.com/)",或许国内已经有很多人知道这个网站了,但毕竟它还是一个新站,看趋势是想做成stackflow之类的国内站,他这么说自己的网站:

XML/HTML代码
  1. 在 Google 搜索技术问题时突然发现从某段时间开始,所有的问题都被指 向 StackOverflow 这个网站了。而且这个网站的问题和答案质量都很高。但是有一点我很烦恼,没有中文,虽然对技术人员来说看懂英文是最基本 的,但是如果能有一个类似的中文问答社区,对于技术的交流是非常有益的。  
  2.   
  3. 因此,我们借鉴了 StackOverflow 的评分机制,搭建了这个网站。最初的想法很简单:我们在搜索技术问题时,能有中文的优质答案出现在搜索结果里。  

上原文吧:
问:HTML 格式的邮件如何定义 CSS
内容:

按照写网页的习惯,的把 css 写在 header 里,样式在 Outlook 和 Mail 客户端都能够正常显示。但是,发现在 Gmail 的 Web 界面上,移除了 body 及其外部的所有代码。
Email HTML 如下:

XML/HTML代码
  1. <!doctype html>  
  2. <head>  
  3.     <meta charset="UTF-8" />  
  4.     <style type="text/css">  
  5.         .title { color: red }      
  6.     </style>  
  7. </head>  
  8. <body>  
  9.     <h2 class="title">Email title here</h2>  
  10. </body>  
  11. </html>  

 

邮件发出后,在 Gmail 里看到的邮件内容代码只剩下了:
XML/HTML代码
  1. <h2 class="title">Email title here</h2>  
如果想在 Gmail 里正确的显示样式,目前只发现下面的方式才显示正常:
XML/HTML代码
  1. <h2  style="color: red">Email title here</h2>
难道,整封邮件只能这样实现了么,有别的方法吗?

回答:

1、经过google搜索,发现gmail目前支持inline的css方式。

看来只能悲剧的inline了。

2、国外有篇博客讲了怎样写HTML邮件:<HTML Email Coding 101> http://litmus.com/blog/html-email-cod...

不仅仅是CSS。我看过,写得很好,图文并茂,你可以看看

Tags: segmentfault, typecho

php header 设置Cache

在手册里,关于header函数的说明是说服务端会输出一系列的头,用firebug也可以看得很清楚
一般来说,我们用header控制的情况不是特别多,毕竟不会主动去改什么:一般也就设置设置编码、跳转、压缩等,不太会过多的干涉。下载的时候也会设置头,黑黑

手册上,我们对于cache都是写着如何设置,以便让代码不被cache:


header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header("Pragma: no-cache"); // Date in the past

而且在设置的时候还得注意在header前不能有输出,否则header设置无效,但都没有写过,如何给页面设置Cache,虽然我们知道有一些办法,比如 E-TAG之类的。当然也有简单的设置:
比如我们在输出前,对内容进行md5,将它当成e-tag只要没变化,就不会有影响。也有其他的方式:

$seconds_to_cache = 3600;
$ts = gmdate("D, d M Y H:i:s", time() + $seconds_to_cache) . " GMT";
header("Expires: $ts"); header("Pragma: cache");
header("Cache-Control: max-age=$seconds_to_cache");

缓存1小时,主要是过期时间得用gmdate来设置,而不是date,这个要注意,其他都差不多。maxage要和expire能够对得上。

不算笔记的笔记。

Tags: header

粗心,又见粗心

有时候会用到gzip函数,只是有时候而已。。。
于是。。有些函数就会直接用上了。比如 :gzencode,gzdecode,gzcompress,gzuncompress,gzdeflate,gzinflate
在用的时候。。有些是想当然的。。。比如有Gzencode,就一定会有gzdecode吧?错。。。gzdecode暂时还没有正式版本支持,只存在于svn中,虽然手册上有。。但也说明了不能用

gzcompress与gzdeflate的区别,一个是基于RFC1950协议,一个是基于RFC1951,gzcompress因为是用的1950协议,手册上说了,它需要zlib库。gzdeflate就不需要
所以,gzcompress现在用的相对又少了一点。

好吧,现在说说我的粗心了,大家都知道Gzip压缩是有等级的(压缩软件都有,1~9,1最低压缩,9是最高压缩比),用9的话压缩出来的文件最小,但是解压的时候最耗CPU。所以一般 都是level4,其实就算是1也不错了。

粗心的就在于gzinflate的时候,想当然的将第二个参数length想成level了。结果一直在报错。居然我5分钟后才反应过来。NND,太粗心了。。。
第二个参数是length,不是level啊。

Tags: gzip

Yii的又一个BUG?

先申明一下,这个可能不是BUG。只是算起来是实现的方式不一样而已。
场景:我有一个MYSQL数据库,但是现在容量越来越大,主要是因为其中有大字段,多个大字段,所以在查询的时候会特别特别慢。所以想到用mongo来存储一些查询用的结构。单条的时候,我还是准备采用MYSQL。当然其实单条用mongo也合适。不过因为迁移数据有点麻烦,所以还是先忍忍,一步一步来。

测试阶段:因为MYSQL to MONGO有点小麻烦,没有现成的工具。官方说有mongoimport,我看过了,确实OK,但是只支持一些基础的结构,比如:json,csv等。其他的则需要第三方工具。但我自己先在测试中,所以就直接写了个脚本,先将数据用AR取出来。然后插入到mongo中。结果发现,在排序的时候。。9999比10000还大。问了一下神仙 ,他说这应该是按字符串排序的方式来做的。

于是做了一个测试,写进了一个数字,果然就对了。。难道是yii的AR的BUG?想想这不太应该啊。于是我写了一个小的Demo:

PHP代码
  1. $db = mysql_connect("localhost","root","123456");  
  2. mysql_select_db("feed");  
  3. $query = mysql_query("select id from feeds_group limit 1");  
  4. while($rs = mysql_fetch_array($query)){  
  5.     $result = $rs;  
  6.     echo "<pre>";  
  7.     var_dump($result);  
  8.     echo "</pre>";  
  9. }  
  10. echo "<hr />";  
  11. $dsn = 'mysql:host=localhost;dbname=feed';  
  12. $user = 'root';  
  13. $password = '123456';  
  14. $dbh = new PDO($dsn$user$password);  
  15. $sth = $dbh->prepare("select id from feeds_group limit 1");  
  16. $sth->execute();  
  17. $result = $sth->fetchAll();  
  18. echo "<pre>";  
  19. var_dump($result);  
  20. echo "</pre>";  

打印出来一看:

XML/HTML代码
  1. array(2) {  
  2.   [0]=>  
  3.   string(1) "1"  
  4.   ["id"]=>  
  5.   string(1) "1"  
  6. }  
  7.   
  8. array(1) {  
  9.   [0]=>  
  10.   array(2) {  
  11.     ["id"]=>  
  12.     string(1) "1"  
  13.     [0]=>  
  14.     string(1) "1"  
  15.   }  
  16. }  

 

果然出来就是字符串了,最后只能自己在插到mongo的时候写了一个小函数,对于数值型字段做了转换,问题就这样解决了。

 

 

 

 

Tags: yii, mongodb, mysql, string

HtmlPurifier的一个小问题:处理flash

在没有TIdy库的情况下,修复HTML我们是用htmlPurifier类库,但这个类库有点小问题。。。比如,对flash支持不好,虽然官网上有例子,可以支持yotube,不过,国内的flash视频站很多,我们不可能一一写扩展啦。怎么办?

后来有人说:

PHP代码
  1. $config->set('HTML.SafeObject', true);  
  2. $config->set('Output.FlashCompat', true);  
  3. $config->set('HTML.Allowed''object[width|height|data],param[name|value],embed[src|type|allowscriptaccess|allowfullscreen|width|height]');  

但经过测试,发现这样也不行。。不信?你去官网的Demo.php中测试一下就知道了。

测试代码可以是:
http://htmlpurifier.org/demo.php?filter[HTML.SafeObject]=1&filter[Output.FlashCompat]=1&filter[HTML.Allowed]=object[width|height|data],param[name|value],embed[src|type|allowscriptaccess|allowfullscreen|width|height]&html=%3Cp%3E%3C%2Fp%3E%3Cp%3E%3Cembed+src%3D%22http%3A%2F%2Fplayer.youku.com%2Fplayer.php%2Fsid%2FXMzIwMjQ5NTk2%2Fv.swf%22+allowfullscreen%3D%22true%22+quality%3D%22high%22+width%3D%22480%22+height%3D%22400%22+align%3D%22middle%22+allowscriptaccess%3D%22always%22+type%3D%22application%2Fx-shockwave-flash%22%2F%3E%3C%2Fp%3E&submit=Submit

所以。如果stripos($data,"embed")!==false的话,还是不要用htmlpurifier过滤了。

参考:
1、http://htmlpurifier.org/docs/enduser-youtube.html(文中有为什么不支持embed的说明)

  1. <embed> is not recognized by W3C, so if you want standards-compliant code, you'll have to get rid of it.
  2. The code is exactly the same for all instances, except for the identifier AyPzM5WK8ys which tells us which movie file to retrieve.

2、http://stackoverflow.com/questions/1368809/allow-embed-object-param-html-tags-with-htmlpurifier(即使设置了allowed,还是不行)
3、http://htmlpurifier.org/phorum/read.php?5,2239,page=3 (在这里,也还是没有解决。寄希望于下一版了。。。)

Tags: htmlpurifier