fixed one bug in redis_client_cluster for set_password; add feature in mime class

This commit is contained in:
ubuntu14 2016-03-17 14:42:58 +08:00
parent ba42c843c5
commit dcf7d25171
24 changed files with 5760 additions and 173 deletions

View File

@ -1,6 +1,14 @@
修改历史列表:
-----------------------------------------------------------------------
414) 2016.3.17
414.1) bugfix: redis_client_cluster 类中的 set_password 方法在设置集群中节点
密码时,该方法的调用与添加集群节点的方法(set)与顺序相关,容易造成误操作导致密码设计无效
413) 2016.3.16
413.1) feature: queue_file::create 在产生唯一 ID 时,可以明显区分出进程号
以便于调试检查当前队列文件所属的进程
412) 2016.3.11
412.1) bugfix: json_node::is_array 判断方式有问题

View File

@ -134,10 +134,11 @@ public:
* @param enableDecode {bool}
* @param toCharset {const char*}
* @param off {off_t}
* @param all {bool} message/application/image
* @return {const std::list<mime_attach*>&}
*/
const std::list<mime_attach*>& get_attachments(bool enableDecode = true,
const char* toCharset = "gb2312", off_t off = 0);
const char* toCharset = "gb2312", off_t off = 0, bool all = true);
/**
*

View File

@ -3,7 +3,8 @@
#include "acl_cpp/stdlib/pipe_stream.hpp"
namespace acl {
class string;
class string;
class ACL_CPP_API mime_code : public pipe_stream
{

View File

@ -48,7 +48,7 @@ public:
* MIME_CTYPE_IMAGE ( mime_define.hpp )
* @return {int} mime_define.hpp MIME_CTYPE_XXX
*/
int get_ctype() const
int get_ctype(void) const
{
return (m_ctype);
}
@ -63,6 +63,18 @@ public:
return (m_stype);
}
/**
* Content-Type
* @return {const char*} ""
*/
const char* get_ctype_s(void) const;
/**
* Content-Type
* @return {const char*} ""
*/
const char* get_stype_s(void) const;
/**
* ( Content-Transfer-Encoding)
* @return {int} mime_define.hpp MIME_ENC_XXX
@ -194,14 +206,16 @@ public:
*
* @return {int} MIME_CTYPE_XXX
*/
int parent_ctype() const;
int parent_ctype(void) const;
const char* parent_ctype_s(void) const;
/**
* (MIME_STYPE_XXX), MIME_STYPE_OTHER
*
* @return {int} MIME_STYPE_XXX
*/
int parent_stype() const;
int parent_stype(void) const;
const char* parent_stype_s(void) const;
/**
* (MIME_ENC_XXX), MIME_ENC_OTHER

View File

@ -288,6 +288,8 @@ public:
*/
json_node* next_child(void);
const char* operator[] (const char* tag);
/**
* json json
* @return {int}
@ -472,6 +474,22 @@ public:
const std::vector<json_node*>&
getElementsByTags(const char* tags) const;
/**
* json json
* @param tags {const char*} '/'
* json
* { 'root': [
* 'first': { 'second': { 'third': 'test1' } },
* 'first': { 'second': { 'third': 'test2' } },
* 'first': { 'second': { 'third': 'test3' } }
* ]
* }
* root/first/second/third
*
* @return {json_node*} NULL
*/
json_node* getFirstElementByTags(const char* tags) const;
/**
* acl ACL_JSON
* @return {ACL_JSON*}

View File

@ -0,0 +1,3 @@
base_path = ../../..
PROG = json
include ../../Makefile.in

View File

@ -0,0 +1,73 @@
#include "stdafx.h"
/**
* json解析器对于制表符解析问题\t \n等
*/
int main(void)
{
const char* s = "{ 'cmd': 'GET',\r\n"
"'data': { 'count': 2, iptables: [\r\n"
" {'test1': '192.168.1.1'},\r\n"
" {'test2': '192.168.1.2'},\r\n"
" {'test3': '192.168.1.3'},\r\n"
" {'test4': '192.168.1.4'},\r\n"
" {'test5': '192.168.1.5'},\r\n"
" {'test6': '192.168.1.6'},\r\n"
" {'test7': 192 },\r\n"
" {'test8': true}\r\n"
"]}}";
acl::json json(s);
const char* tags = "data/iptables";
acl::json_node* node = json.getFirstElementByTags(tags);
if (node == NULL)
{
printf("no tags: %s\r\n", tags);
return 0;
}
printf("tag: %s, type: %s\r\n", node->tag_name(), node->get_type());
acl::json_node* array = node->get_obj();
if (array == NULL)
{
printf("get_obj null\r\n");
return 0;
}
if (array->is_array() == false)
{
printf("not array: %s\r\n", array->to_string().c_str());
return 0;
}
else
printf("Array: %s\r\n", array->to_string().c_str());
printf("-------------------------------------------------------\r\n");
acl::json_node* child = array->first_child();
while (child)
{
printf("type: %s->%s\r\n", child->get_type(),
child->to_string().c_str());
const char* ptr = (*child)["test1"];
if (ptr)
printf(">>> found, test1: %s\r\n", ptr);
acl::json_node* iter = child->first_child();
while (iter)
{
printf("type: %s, string: %s, tag: %s, txt: %s\r\n",
iter->get_type(), iter->to_string().c_str(),
iter->tag_name(), iter->get_text());
iter = child->next_child();
}
child = array->next_child();
}
return 0;
}

View File

@ -0,0 +1,8 @@
// stdafx.cpp : 只包括标准包含文件的源文件
// json.pch 将成为预编译头
// stdafx.obj 将包含预编译类型信息
#include "stdafx.h"
// TODO: 在 STDAFX.H 中
//引用任何所需的附加头文件,而不是在此文件中引用

View File

@ -0,0 +1,41 @@
// stdafx.h : 标准系统包含文件的包含文件,
// 或是常用但不常更改的项目特定的包含文件
//
#pragma once
//#include <iostream>
//#include <tchar.h>
// TODO: 在此处引用程序要求的附加头文件
#include "acl_cpp/lib_acl.hpp"
#include "lib_acl.h"
#ifdef WIN32
#include <io.h>
#define snprintf _snprintf
#endif
#ifdef DEBUG
// 以下宏定义用来帮助检查变参中的参数类型是否合法
#undef logger
#define logger printf
#undef logger_error
#define logger_error printf
#undef logger_warn
#define logger_warn printf
#undef logger_fatal
#define logger_fatal printf
#undef logger_panic
#define logger_panic printf
extern void __attribute__((format(printf,3,4))) \
dummy_debug(int, int, const char*, ...);
#undef logger_debug
#define logger_debug dummy_debug
#endif

View File

@ -0,0 +1,3 @@
#!/bin/sh
valgrind --tool=memcheck --leak-check=yes -v ./json

View File

@ -0,0 +1,87 @@
Received: by A8-08.weibangong.com (Postfix)
id 7D6035013BA2D9; Thu, 10 Mar 2016 13:37:37 +0800 (CST)
Date: Thu, 10 Mar 2016 13:37:37 +0800 (CST)
From: MAILER-DAEMON@weibangong.com (Mail Delivery System)
Subject: Undelivered Mail Returned to Sender
To: jiangxianzeng@test.weibangong.me
Auto-Submitted: auto-replied
MIME-Version: 1.0
Content-Type: multipart/report; report-type=delivery-status;
boundary="6A6485013BA2D7.1457588257/A8-08.weibangong.com"
Message-Id: <20160310053737.7D6035013BA2D9@A8-08.weibangong.com>
This is a MIME-encapsulated message.
--6A6485013BA2D7.1457588257/A8-08.weibangong.com
Content-Description: Notification
Content-Type: text/plain; charset=us-ascii
This is the mail system at host A8-08.weibangong.com.
I'm sorry to have to inform you that your message could not
be delivered to one or more recipients. It's attached below.
For further assistance, please send mail to postmaster.
If you do so, please include this problem report. You can
delete your own text from the attached returned message.
The mail system
<notification+kjdkwwd-pk5d@facebookmail.com>: Host or domain name not found.
Name service error for name=facebookmail.com type=A: Host found but no data
record of requested type
--6A6485013BA2D7.1457588257/A8-08.weibangong.com
Content-Description: Delivery report
Content-Type: message/delivery-status
Reporting-MTA: dns; A8-08.weibangong.com
X-Postfix-Queue-ID: 6A6485013BA2D7
X-Postfix-Sender: rfc822; jiangxianzeng@test.weibangong.me
Arrival-Date: Thu, 10 Mar 2016 13:37:37 +0800 (CST)
Final-Recipient: rfc822; notification+kjdkwwd-pk5d@facebookmail.com
Original-Recipient: rfc822;notification+kjdkwwd-pk5d@facebookmail.com
Action: failed
Status: 5.4.4
Diagnostic-Code: X-Postfix; Host or domain name not found. Name service error
for name=facebookmail.com type=A: Host found but no data record of
requested type
--6A6485013BA2D7.1457588257/A8-08.weibangong.com
Content-Description: Undelivered Message
Content-Type: message/rfc822
Return-Path: <jiangxianzeng@test.weibangong.me>
Received: from A8-08.weibangong.com (localhost [127.0.0.1])
by A8-08.weibangong.com (Postfix) with ESMTP id 6A6485013BA2D7
for <notification+kjdkwwd-pk5d@facebookmail.com>; Thu, 10 Mar 2016 13:37:37 +0800 (CST)
X-KSVirus-check:0
Received: from A8-08.weibangong.com (unknown [127.0.0.1])
by A8-08.weibangong.com (postfix) with ESMTP id 126905GZRSZO;
Thu, 10 Mar 2016 13:37:37 +0800 (CST)
Received: from localhost (localhost [127.0.0.1])
by A8-08.weibangong.com (Postfix) with ESMTPA id 59C329007C2A63
for <notification+kjdkwwd-pk5d@facebookmail.com>; Thu, 10 Mar 2016 13:37:37 +0800 (CST)
X-RL-SENDER:jiangxianzeng@test.weibangong.me
X-SENDER-IP:103.235.226.67
X-LOGIN-NAME:wmsendmail@weibangong.com
X-SENDER:jiangxianzeng@test.weibangong.me
Received: from localhost (unknown [103.235.226.67])
by A8-08.weibangong.com (postfix) with ESMTP id 1268919VPK3C;
Thu, 10 Mar 2016 13:37:37 +0800 (CST)
From: <jiangxianzeng@test.weibangong.me>
To: "=?UTF-8?B?RmFjZWJvb2s=?=" <notification+kjdkwwd-pk5d@facebookmail.com>
Subject: =?UTF-8?B?6Ieq5Yqo5Zue5aSNOuS9oOWcqCBGYWNlYm9vayDkuIrnmoTmnIvlj4vmr5Tmg7PosaHkuK3opoHlpJo=?=
Date: Thu, 10 Mar 2016 13:37:37 +0800 (CST)
MIME-Version: 1.0
Message-ID: <126861.140003952387840.1457588257.acl@localhost>
Content-Type: text/html;
charset="utf-8"
Content-Transfer-Encoding: quoted-printable
=E9=98=BF=E6=96=AF=E9=A1=BF=E5=8F=91=E6=B0=B4=E7=94=B5=E8=B4=B9
--6A6485013BA2D7.1457588257/A8-08.weibangong.com--

View File

@ -0,0 +1,946 @@
Received: from A8-08.localdomain (localhost [127.0.0.1])
by A8-08.weibangong.com (Postfix) with ESMTP id 4A60750137B1D7
for <jiangxianzeng@test.weibangong.me>; Thu, 10 Mar 2016 05:44:22 +0800 (CST)
Received: from A8-08.localdomain (unknown [127.0.0.1])
by A8-08.localdomain (postfix) with ESMTP id 110147OQEHJZ;
Thu, 10 Mar 2016 05:44:22 +0800 (CST)
Received: from o11.delivery.customeriomail.com (localhost [127.0.0.1])
by A8-08.localdomain (Postfix) with ESMTP id 970862084D8F60
for <jiangxianzeng@test.weibangong.me>; Thu, 10 Mar 2016 05:44:20 +0800 (CST)
X-RL-SENDER:bounces+2008364-7f89-jiangxianzeng=test.weibangong.me@delivery.customeriomail.com
X-SENDER-IP:167.89.32.158
X-LOGIN-NAME:
X-SENDER:bounces+2008364-7f89-jiangxianzeng=test.weibangong.me@delivery.customeriomail.com
Received: from o11.delivery.customeriomail.com (unknown [167.89.32.158])
by A8-08.localdomain (postfix) with ESMTP id 11012463GDWO;
Thu, 10 Mar 2016 05:44:22 +0800 (CST)
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=trello.com;
h=from:to:subject:mime-version:content-type:content-transfer-encoding:list-unsubscribe;
s=smtpapi; bh=ZHamVuPswoj7o8DUqYXhQURTvpE=; b=aqRFginyy+CQnCEmYz
CGTLwk7eggNBmMbbr7E4X4jgn8A3lw4NUaPb6X6ynkL4bkk5mKxje//Q/NHfGvs/
96UJ/Dec/HzpMftY6Y34rwatPXFW9tfOigvGNhPOFn23LmACGobbzKf7ur9aQbIs
y80W6JevwHBVj5mh5geleobhQ=
Received: by filter0884p1mdw1.sendgrid.net with SMTP id filter0884p1mdw1.11841.56E098CA34
2016-03-09 21:42:34.604339435 +0000 UTC
Received: from delivery.customeriomail.com (ovh87.cio.host [192.99.200.192])
by ismtpd0003p1iad1.sendgrid.net (SG) with ESMTP id IHUh-yxLSYySmtlCPySm-w
for <jiangxianzeng@test.weibangong.me>; Wed, 09 Mar 2016 21:42:34.502 +0000 (UTC)
Date: Wed, 09 Mar 2016 21:42:33 +0000
From: Stella from Trello <taco@trello.com>
To: jiangxianzeng@test.weibangong.me
Message-ID: <56e098c9d22f7_5269116325c1754243d8@ns500965.ip-192-99-200.net.mail>
Subject: Introducing Trello's Chrome Extension
Mime-Version: 1.0
Content-Type: multipart/alternative;
boundary="--==_mimepart_56e098c9cfc36_5269116325c17542408c";
charset=UTF-8
Content-Transfer-Encoding: 7bit
List-Unsubscribe: <mailto:NDEzNTI6FwFX2wJkAAJzABcm75caAVJqn1SGFVYYVuBAkAFtOjI5NzExNwA=@unsubscribe.customer.io>,
<http://track.customer.io/unsubscribe/NDEzNTI6FwFX2wJkAAJzABcm75caAVJqn1SGFVYYVuBAkAFtOjI5NzExNwA=>
X-SG-EID: XgixRH9e8+k13ajn1zHda3nCbfmgZzqapmEzS+krPzBqs2Me3oaBOEywQ737POshGyO4z54GVS7nnP
+qqJjhtccx4yHf5dF2gULl+5lSBZBgpcnfmf/RRgNTkEbuiAVU7daKjsLuTuj/7TnqVmQdaf1tVFae
8va1Xhly5Y8JIRNx6cOOLjAAp0p8fLhhsVq4CJCfAs3u+KrtWvS4rCzf66g3yFyfg5/dWeySACspnp
o=
X-SG-ID: YDTqBOjidbCUo/ar1oAtZiP/qF3xTpCk7nO8VYs20xb9UCOXZErqNvw4/64QDOnwVF+RRG9YMTArsd
IbuOxCCRr28L9Ytvu/qdwFBGwYvOAN/T2s7K/BmRAi0JVdHyZu
----==_mimepart_56e098c9cfc36_5269116325c17542408c
Date: Wed, 09 Mar 2016 21:42:33 +0000
Mime-Version: 1.0
Content-Type: text/plain;
charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Content-ID: <56e098c9d0c82_5269116325c175424171@ns500965.ip-192-99-200.net.mail>
Check out
Trello's new Chrome extension, board best practices, plus
management tips.
View this
email in your browser ( http://track.customer.io/deliveries/NDEzNTI6FwFX2wJ=
kAAJzABcm75caAVJqn1SGFVYYVuBAkAFtOjI5NzExNwA=3D ).
( https://trello.com?utm_source=3Dnewsletter&utm_medium=3Demail&utm_campaig=
n=3DFebNewsletter )
**********************
Better Building Blocks
**********************
Structural integrity
is the key to better tools, management, and results.
Build Better Boards
-------------------
Are your boards set
up effectively? Check out some Trello best practices.
Find Out
How ( http://blog.trello.com/trello-board-best-practices/?utm_source=3Dnews=
letter&utm_medium=3Demail&utm_campaign=3DMarNewsletter )
Management Must-Haves
---------------------
Learned wisdom on
the transition from "maker" to "manager."
Learn The
Ropes ( http://blog.trello.com/tips-for-managers-to-help-lead-more-effectiv=
ely/?utm_source=3Dnewsletter&utm_medium=3Demail&utm_campaign=3DMarNewslette=
r )
Avoid Prioritization Pitfalls
-----------------------------
A proven strategy to
make your team more productive.
Stay On
Task ( http://blog.trello.com/manage-teams-with-5-things/?utm_source=3Dnews=
letter&utm_medium=3Demail&utm_campaign=3DMarNewsletter )
The Transparency Turnpike
-------------------------
Why public roadmaps
help you take an engaging journey with your users.
Hit The
Road ( http://blog.trello.com/tips-for-making-a-public-roadmap/?utm_source=
=3Dnewsletter&utm_medium=3Demail&utm_campaign=3DMarNewsletter )
Build In Your Browser
---------------------
Trello's brand new
Chrome extension means more success in less steps.
Check It
Out ( http://blog.trello.com/trello-chrome-extension/?utm_source=3Dnewslett=
er&utm_medium=3Demail&utm_campaign=3DMarNewsletter )
Connect with us:
( https://www.facebook.com/trelloapp )
( https://twitter.com/trello )
( https://www.pinterest.com/trelloapp/ )
( https://www.linkedin.com/company/trello )
( http://blog.trello.com?utm_source=3Dnewsletter&utm_medium=3Demail&utm_cam=
paign=3DMarNewsletter )
Copyright =C2=A9 2016 Trello Inc., All rights reserved.
Unsubscribe ( http://track.customer.io/unsubscribe/NDEzNTI6FwFX2wJkAAJzABcm=
75caAVJqn1SGFVYYVuBAkAFtOjI5NzExNwA=3D ) | view in browser ( http://track.c=
ustomer.io/deliveries/NDEzNTI6FwFX2wJkAAJzABcm75caAVJqn1SGFVYYVuBAkAFtOjI5N=
zExNwA=3D )
----==_mimepart_56e098c9cfc36_5269116325c17542408c
Date: Wed, 09 Mar 2016 21:42:33 +0000
Mime-Version: 1.0
Content-Type: text/html;
charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Content-ID: <56e098c9d1dbf_5269116325c175424212@ns500965.ip-192-99-200.net.mail>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.=
w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns=3D"http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3DU=
TF-8">
<meta name=3D"viewport" content=3D"width=3Ddevice-width">
<title>#ReadySetGoal</title>
<style type=3D"text/css">
#outlook a{
padding:0;
}
.ReadMsgBody{
width:100%;
}
.ExternalClass{
width:100%;
}
.ExternalClass,.ExternalClass p,.ExternalClass span,.ExternalClass =
font,.ExternalClass td,.ExternalClass div{
line-height:100%;
}
body,table,td,p,a,li,blockquote{
-webkit-text-size-adjust:100%;
-ms-text-size-adjust:100%;
}
table,td{
mso-table-lspace:0pt;
mso-table-rspace:0pt;
}
img{
-ms-interpolation-mode:bicubic;
}
body{
margin:0;
padding:0;
background:#EEEEEE;
}
img{
border:0;
height:auto;
line-height:100%;
outline:none;
text-decoration:none;
max-width: 100%;
}
#content-body img {
max-width: 500px!important;
}
table{
border-collapse:collapse !important;
}
body,#bodyTable{
height:100% !important;
margin:0;
padding:0;
width:100% !important;
}
#bodyTable{
font-family:Helvetica Neue, Helvetica, Arial, sans-serif;
min-height:100%;
background:#eeeeee;
color:#444444;
}
.button.clear:hover{
background:rgba(255,255,255,0.3)!important;
}
img{
border:0!important;
}
a{
text-decoration:none;
}
a.blog{
text-decoration:underline!important;
}
h1{
/*@editable*/font-family:Helvetica;
/*@editable*/font-size:36px;
/*@editable*/font-style:normal;
/*@editable*/font-weight:bold;
/*@editable*/text-align:center;
margin:40px auto 20px;
}
h2{
/*@editable*/font-size:28px;
/*@editable*/font-style:normal;
/*@editable*/font-weight:bold;
margin:0px auto 25px;
color:#FFFFFF!important;
}
h3{
font-size:24px;
font-weight:bold;
margin: 30px 50px 0 0;
/*@editable*/letter-spacing:normal;
/*@editable*/text-align:left;
}
a h3{
color:#444444!important;
text-decoration:none!important;
}
#header p{
width:400px;
font-size:22px;
line-height:28px;
margin:5px auto 0;
}
.list p{
padding:15px 40px 15px 20px;
margin:0;
}
.list a{
color:#0079bf;
text-decoration:underline;
}
.titleLink{
text-decoration:none!important;
}
.preheaderContent{
/*@editable*/color:#808080;
/*@editable*/font-size:10px;
/*@editable*/line-height:125%;
}
.preheaderContent a:link,.preheaderContent a:visited,.preheaderCont=
ent a .yshortcuts{
/*@editable*/color:#606060;
/*@editable*/font-weight:normal;
/*@editable*/text-decoration:underline;
}
#content-block {
text-align: left;
padding:10px 40px;
}
p{
font-size:22px;
line-height:28px;
margin: 10px 50px 10px auto;
}
#header img{
width:600px;
}
#socialIconWrap img{
line-height:35px!important;
padding:0px 5px;
}
.footerContent div{
/*@editable*/color:#707070;
/*@editable*/font-family:Arial;
/*@editable*/font-size:12px;
/*@editable*/line-height:125%;
/*@editable*/text-align:center;
max-width:100%!important;
}
.footerContent div a:link,.footerContent div a:visited{
/*@editable*/color:#336699;
/*@editable*/font-weight:normal;
/*@editable*/text-decoration:underline;
}
.footerContent img{
display:inline;
}
#socialLinks img{
margin:10px 2px;
}
#utility{
/*@editable*/border-top:1px solid #dddddd;
}
#utility div{
/*@editable*/text-align:center;
}
#monkeyRewards img{
max-width:160px;
}
#emailFooter{
max-width:100%!important;
}
#footerTwitter a,#footerFacebook a{
text-decoration:none!important;
color:#ffffff!important;
font-size:14px;
}
#emailButton{
border-radius:6px;
background:#70B500!important;
margin:0px auto 60px;
box-shadow:0px 4px 0px #578C00;
}
#socialLinks a{
width:40px;
}
#socialLinks #blogLink{
width:80px!important;
}
#logoWrap{
background:url('https://gallery.mailchimp.com/5cb712992a906406c=
5eae28a7/images/d7a697bc-1cb3-4334-a1c4-2da3f78473a6.jpg') center center / =
600px 50px no-repeat!important;
}
.sectionWrap{
text-align:center;
}
</style>
</head>
<body style=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 10=
0%; height: 100% !important; width: 100% !important; background: #EEEEEE; m=
argin: 0; padding: 0;" bgcolor=3D"#EEEEEE">
<img alt=3D"" src=3D"https://d3k1505f61nl3q.cloudfront.net/i?&amp;e=3Dp=
v&amp;page=3DReadySetGoal&amp;aid=3Demail&amp;p=3Dweb&amp;uid=3Dhttp://trac=
k.customer.io/deliveries/NDEzNTI6FwFX2wJkAAJzABcm75caAVJqn1SGFVYYVuBAkAFtOj=
I5NzExNwA=3D&amp;tv=3Dno-js-0.1.0" style=3D"-ms-interpolation-mode: bicubic=
; height: auto; line-height: 100%; outline: none; text-decoration: none; ma=
x-width: 100%; border: 0;">
<table border=3D"0" cellpadding=3D"0" cellspacing=3D"0" height=3D"1=
00%" width=3D"100%" id=3D"bodyTable" style=3D"-webkit-text-size-adjust: 100=
%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt=
; border-collapse: collapse !important; height: 100% !important; width: 100=
% !important; font-family: Helvetica Neue, Helvetica, Arial, sans-serif; mi=
n-height: 100%; color: #444444; background: #eeeeee; margin: 0; padding: 0;=
" bgcolor=3D"#eeeeee">
<tr>
<td align=3D"center" valign=3D"top" style=3D"-webkit-text-s=
ize-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-ta=
ble-rspace: 0pt;">
<table align=3D"center" border=3D"0" cellspacing=3D"0" =
width=3D"600" id=3D"emailContainer" style=3D"width: 600px !important; min-w=
idth: 600px !important; -webkit-text-size-adjust: 100%; -ms-text-size-adjus=
t: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt; border-collapse: col=
lapse !important;">
<tr>
<td align=3D"center" valign=3D"top" style=3D"-w=
ebkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace:=
0pt; mso-table-rspace: 0pt;">
<!-- BEGIN PREHEADER // -->
<table border=3D"0" cellpadding=3D"0" cells=
pacing=3D"0" width=3D"100%" id=3D"templatePreheader" style=3D"-webkit-text-=
size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-t=
able-rspace: 0pt; border-collapse: collapse !important; margin: 15px 0 10px=
;">
<tr>
<td style=3D"-webkit-text-size-adju=
st: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspa=
ce: 0pt;">
<table align=3D"left" border=3D=
"0" cellspacing=3D"0" width=3D"50%" style=3D"-webkit-text-size-adjust: 100%=
; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt;=
border-collapse: collapse !important;">
<tr>
<td valign=3D"top" clas=
s=3D"preheaderContent" align=3D"left" style=3D"text-align: left !important;=
-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspa=
ce: 0pt; mso-table-rspace: 0pt; color: #808080; font-size: 10px; line-heigh=
t: 125%;">
Check out Trello's n=
ew Chrome extension, board best practices, plus management tips.
</td>
</tr>
</table>
<table align=3D"left" border=3D=
"0" cellspacing=3D"0" width=3D"50%" style=3D"-webkit-text-size-adjust: 100%=
; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt;=
border-collapse: collapse !important;">
<tr>
<td valign=3D"top" alig=
n=3D"right" class=3D"preheaderContent" mc:edit=3D"preheader_content01" styl=
e=3D"text-align: right !important; -webkit-text-size-adjust: 100%; -ms-text=
-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt; color: #8=
08080; font-size: 10px; line-height: 125%;">
<a href=3D"http://e=
m.trello.com/deliveries/NDEzNTI6FwFX2wJkAAJzABcm75caAVJqn1SGFVYYVuBAkAFtOjI=
5NzExNwA=3D" style=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust:=
100%; text-decoration: underline; color: #606060; font-weight: normal;">Vi=
ew this email in your browser</a>.
</td>
</tr>
</table>
</td>
</tr>
</table>
<!-- // END PREHEADER -->
</td>
</tr>
<tr>
<td id=3D"logoWrap" align=3D"bottom" style=3D"=
text-align: center !important; background-image: url('https://gallery.mailc=
himp.com/5cb712992a906406c5eae28a7/images/d7a697bc-1cb3-4334-a1c4-2da3f7847=
3a6.jpg') !important; background-repeat: no-repeat !important; background-s=
ize: 600px 50px; background-position: center center !important; -webkit-tex=
t-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso=
-table-rspace: 0pt;">
<a href=3D"http://em.trello.com/e/c/eyJlbWFp=
bF9pZCI6Ik5ERXpOVEk2RndGWDJ3SmtBQUp6QUJjbTc1Y2FBVkpxbjFTR0ZWWVlWdUJBa0FGdE9=
qSTVOekV4TndBPSIsInBvc2l0aW9uIjowLCJocmVmIjoiaHR0cHM6Ly90cmVsbG8uY29tP3V0bV=
9zb3VyY2U9bmV3c2xldHRlciZ1dG1fbWVkaXVtPWVtYWlsJnV0bV9jYW1wYWlnbj1GZWJOZXdzb=
GV0dGVyIiwibGlua19pZCI6MTExMjI3MzJ9/f76cb781f16105094820efade378556e2e661bc=
1b35ef5b9afbedd6131bdf9ba" style=3D"-webkit-text-size-adjust: 100%; -ms-tex=
t-size-adjust: 100%; text-decoration: none;"><img id=3D"logo" src=3D"https:=
//gallery.mailchimp.com/5cb712992a906406c5eae28a7/images/ca9278a0-af3c-4fd1=
-b3a4-4bf53136a180.jpg" width=3D"172" height=3D"50" style=3D"-ms-interpolat=
ion-mode: bicubic; height: auto; line-height: 100%; outline: none; text-dec=
oration: none; max-width: 100%; margin: 10px auto 20px; border: 0;"></a>
</td>
</tr>
<!-- ////////////////////////////
/////// BEGIN CONTENT ///////
/////////////////////////// -->
<tr>
<td align=3D"center" valign=3D"top" style=3D"-w=
ebkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace:=
0pt; mso-table-rspace: 0pt;">
<table class=3D"sectionWrap" border=3D"0" c=
ellpadding=3D"0" cellspacing=3D"0" width=3D"600" style=3D"overflow: hidden;=
border-radius: 4px; box-shadow: 0px 3px 0px #DDDDDD; max-width: 600px !imp=
ortant; min-width: 600px !important; -webkit-text-size-adjust: 100%; -ms-te=
xt-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt; border-=
collapse: collapse !important; text-align: center; background: #FFFFFF;" id=
=3D"content" bgcolor=3D"#FFFFFF">
<tr>
<td id=3D"header" valign=3D"top" bgco=
lor=3D"#00C2E0" style=3D"max-width: 100% !important; background-size: 600px=
300px; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-tab=
le-lspace: 0pt; mso-table-rspace: 0pt; background: #00C2E0 no-repeat top ce=
nter; padding: 20px 0 0;">
<h1 style=3D"font-family: Helve=
tica; font-size: 36px; font-style: normal; font-weight: bold; text-align: c=
enter; margin: 40px auto 20px;" align=3D"center"><font color=3D"#ffffff">Be=
tter Building Blocks</font></h1>
<p style=3D"-webkit-text-size-a=
djust: 100%; -ms-text-size-adjust: 100%; width: 400px; font-size: 22px; lin=
e-height: 28px; margin: 5px auto 20px;"><font color=3D"#FFFFFF">Structural =
integrity is the key to better tools, management, and results. </font></p>
</td>
</tr>
<!-- Best Practices -->
<tr>
<td style=3D"text-align: left; -web=
kit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0=
pt; mso-table-rspace: 0pt;" align=3D"left">
<img src=3D"https://gallery.mai=
lchimp.com/5cb712992a906406c5eae28a7/images/e1420477-e2b5-421d-8b8f-6a58013=
ab0ec.png" align=3D"left" width=3D"150" height=3D"150" style=3D"display: in=
line-block; -ms-interpolation-mode: bicubic; height: auto; line-height: 100=
%; outline: none; text-decoration: none; max-width: 100%; margin: 40px; bor=
der: 0;">
<h3 style=3D"font-size: 24px; f=
ont-weight: bold; letter-spacing: normal; text-align: left; margin: 30px 50=
px 0 0;" align=3D"left"><font color=3D"#4d4d4d">Build Better Boards</font><=
/h3>
<p style=3D"text-align: left; f=
ont-size: 18px; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%;=
line-height: 28px; margin: 10px 50px 10px auto;" align=3D"left"><font colo=
r=3D"#4d4d4d"> Are your boards set up effectively? Check out some Trello be=
st practices. </font></p>
<table class=3D"button main" bo=
rder=3D"0" cellpadding=3D"14" cellspacing=3D"0" style=3D"display: inline-bl=
ock; font-weight: bold; font-size: 24px; text-align: center; cursor: pointe=
r; color: #FFFFFF; border-radius: 6px; -webkit-text-size-adjust: 100%; -ms-=
text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt; borde=
r-collapse: collapse !important; background: #61BD4F; margin: 10px 0 20px;"=
align=3D"center" bgcolor=3D"#61BD4F">
<tr>
<td align=3D"center" vali=
gn=3D"middle" class=3D"emailButtonContent" style=3D"-webkit-text-size-adjus=
t: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspac=
e: 0pt;">
<a href=3D"http://em.=
trello.com/e/c/eyJlbWFpbF9pZCI6Ik5ERXpOVEk2RndGWDJ3SmtBQUp6QUJjbTc1Y2FBVkpx=
bjFTR0ZWWVlWdUJBa0FGdE9qSTVOekV4TndBPSIsInBvc2l0aW9uIjoxLCJocmVmIjoiaHR0cDo=
vL2Jsb2cudHJlbGxvLmNvbS90cmVsbG8tYm9hcmQtYmVzdC1wcmFjdGljZXMvP3V0bV9zb3VyY2=
U9bmV3c2xldHRlciZ1dG1fbWVkaXVtPWVtYWlsJnV0bV9jYW1wYWlnbj1NYXJOZXdzbGV0dGVyI=
iwibGlua19pZCI6MTIwNzU3NTl9/a468f7c6b4a7af3c919705c828dc45c407948206cf240a3=
73e02d792dbc24c5b" target=3D"_blank" style=3D"text-decoration: none; -webki=
t-text-size-adjust: 100%; -ms-text-size-adjust: 100%; padding: 10px;"><font=
color=3D"white">Find Out How</font></a>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td style=3D"-webkit-text-size-adju=
st: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspa=
ce: 0pt;">
<center><img src=3D"https://gal=
lery.mailchimp.com/5cb712992a906406c5eae28a7/images/d1e4be59-347e-461a-afbc=
-b5db9457425e.png" width=3D"440" height=3D"19" style=3D"display: block; -ms=
-interpolation-mode: bicubic; height: auto; line-height: 100%; outline: non=
e; text-decoration: none; max-width: 100%; margin: 10px auto; border: 0;"><=
/center>
</td>
</tr>
<!-- Lead More Effectively -->
<tr>
<td style=3D"text-align: left; -web=
kit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0=
pt; mso-table-rspace: 0pt;" align=3D"left">
<img src=3D"https://gallery.mai=
lchimp.com/5cb712992a906406c5eae28a7/images/87fc487d-7751-422c-bc53-230e89e=
9d9f3.png" align=3D"left" width=3D"150" height=3D"150" style=3D"display: in=
line-block; -ms-interpolation-mode: bicubic; height: auto; line-height: 100=
%; outline: none; text-decoration: none; max-width: 100%; margin: 40px; bor=
der: 0;">
<h3 style=3D"font-size: 24px; f=
ont-weight: bold; letter-spacing: normal; text-align: left; margin: 30px 50=
px 0 0;" align=3D"left"><font color=3D"#4d4d4d">Management Must-Haves</font=
></h3>
<p style=3D"text-align: left; f=
ont-size: 18px; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%;=
line-height: 28px; margin: 10px 50px 10px auto;" align=3D"left"><font colo=
r=3D"#4d4d4d"> Learned wisdom on the transition from "maker" to "manager."<=
/font></p>
<table class=3D"button main" bo=
rder=3D"0" cellpadding=3D"14" cellspacing=3D"0" style=3D"display: inline-bl=
ock; font-weight: bold; font-size: 24px; text-align: center; cursor: pointe=
r; color: #FFFFFF; border-radius: 6px; -webkit-text-size-adjust: 100%; -ms-=
text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt; borde=
r-collapse: collapse !important; background: #61BD4F; margin: 10px 0 20px;"=
align=3D"center" bgcolor=3D"#61BD4F">
<tr>
<td align=3D"center" vali=
gn=3D"middle" class=3D"emailButtonContent" style=3D"-webkit-text-size-adjus=
t: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspac=
e: 0pt;">
<a href=3D"http://em.=
trello.com/e/c/eyJlbWFpbF9pZCI6Ik5ERXpOVEk2RndGWDJ3SmtBQUp6QUJjbTc1Y2FBVkpx=
bjFTR0ZWWVlWdUJBa0FGdE9qSTVOekV4TndBPSIsInBvc2l0aW9uIjoyLCJocmVmIjoiaHR0cDo=
vL2Jsb2cudHJlbGxvLmNvbS90aXBzLWZvci1tYW5hZ2Vycy10by1oZWxwLWxlYWQtbW9yZS1lZm=
ZlY3RpdmVseS8_dXRtX3NvdXJjZT1uZXdzbGV0dGVyJnV0bV9tZWRpdW09ZW1haWwmdXRtX2Nhb=
XBhaWduPU1hck5ld3NsZXR0ZXIiLCJsaW5rX2lkIjoxMjA3NTc2MH0/212e2c8146ad4c06eb02=
05964a45244684cbe5b62c0b9f368fcda2d0b3f4299b" target=3D"_blank" style=3D"te=
xt-decoration: none; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: =
100%; padding: 10px;"><font color=3D"white">Learn The Ropes</font></a>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td style=3D"-webkit-text-size-adju=
st: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspa=
ce: 0pt;">
<center><img src=3D"https://gal=
lery.mailchimp.com/5cb712992a906406c5eae28a7/images/9bca9ea1-0e78-4770-b6c0=
-3a012c069f0d.png" width=3D"440" height=3D"19" style=3D"display: block; -ms=
-interpolation-mode: bicubic; height: auto; line-height: 100%; outline: non=
e; text-decoration: none; max-width: 100%; margin: 10px auto; border: 0;"><=
/center>
</td>
</tr>
<tr>
<!-- Rule of Five -->
<td style=3D"text-align: left; -web=
kit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0=
pt; mso-table-rspace: 0pt;" align=3D"left">
<img src=3D"https://gallery.mai=
lchimp.com/5cb712992a906406c5eae28a7/images/c793bf7e-ea50-403e-bd5d-695e609=
b7b51.png" align=3D"left" width=3D"150" height=3D"150" style=3D"display: in=
line-block; -ms-interpolation-mode: bicubic; height: auto; line-height: 100=
%; outline: none; text-decoration: none; max-width: 100%; margin: 40px; bor=
der: 0;">
<h3 style=3D"font-size: 24px; f=
ont-weight: bold; letter-spacing: normal; text-align: left; margin: 30px 50=
px 0 0;" align=3D"left"><font color=3D"#4d4d4d">Avoid Prioritization Pitfal=
ls</font></h3>
<p style=3D"text-align: left; f=
ont-size: 18px; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%;=
line-height: 28px; margin: 10px 50px 10px auto;" align=3D"left"><font colo=
r=3D"#4d4d4d">A proven strategy to make your team more productive.</font></=
p>
<table class=3D"button main" bo=
rder=3D"0" cellpadding=3D"14" cellspacing=3D"0" style=3D"display: inline-bl=
ock; font-weight: bold; font-size: 24px; text-align: center; cursor: pointe=
r; color: #FFFFFF; border-radius: 6px; -webkit-text-size-adjust: 100%; -ms-=
text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt; borde=
r-collapse: collapse !important; background: #61BD4F; margin: 10px 0 20px;"=
align=3D"center" bgcolor=3D"#61BD4F">
<tr>
<td align=3D"center" vali=
gn=3D"middle" class=3D"emailButtonContent" style=3D"-webkit-text-size-adjus=
t: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspac=
e: 0pt;">
<a href=3D"http://em.=
trello.com/e/c/eyJlbWFpbF9pZCI6Ik5ERXpOVEk2RndGWDJ3SmtBQUp6QUJjbTc1Y2FBVkpx=
bjFTR0ZWWVlWdUJBa0FGdE9qSTVOekV4TndBPSIsInBvc2l0aW9uIjozLCJocmVmIjoiaHR0cDo=
vL2Jsb2cudHJlbGxvLmNvbS9tYW5hZ2UtdGVhbXMtd2l0aC01LXRoaW5ncy8_dXRtX3NvdXJjZT=
1uZXdzbGV0dGVyJnV0bV9tZWRpdW09ZW1haWwmdXRtX2NhbXBhaWduPU1hck5ld3NsZXR0ZXIiL=
CJsaW5rX2lkIjoxMjA3NTc2MX0/c00cbf93dd655adf97366433147a8c49c334c581399a2c02=
d9ac537960610258" target=3D"_blank" style=3D"text-decoration: none; -webkit=
-text-size-adjust: 100%; -ms-text-size-adjust: 100%; padding: 10px;"><font =
color=3D"white">Stay On Task</font></a>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td style=3D"-webkit-text-size-adju=
st: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspa=
ce: 0pt;">
<center><img src=3D"https://gal=
lery.mailchimp.com/5cb712992a906406c5eae28a7/images/660a7a06-42da-4a49-9db0=
-c2135a480890.png" width=3D"440" height=3D"19" style=3D"display: block; -ms=
-interpolation-mode: bicubic; height: auto; line-height: 100%; outline: non=
e; text-decoration: none; max-width: 100%; margin: 10px auto; border: 0;"><=
/center>
</td>
</tr>
<tr>
<!-- Public Roadmap -->
<td style=3D"text-align: left; -web=
kit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0=
pt; mso-table-rspace: 0pt;" align=3D"left">
<img src=3D"https://gallery.mai=
lchimp.com/5cb712992a906406c5eae28a7/images/9697b8e4-5f46-405b-b336-b1637b8=
a2d9e.png" align=3D"left" width=3D"150" height=3D"150" style=3D"display: in=
line-block; -ms-interpolation-mode: bicubic; height: auto; line-height: 100=
%; outline: none; text-decoration: none; max-width: 100%; margin: 40px; bor=
der: 0;">
<h3 style=3D"font-size: 24px; f=
ont-weight: bold; letter-spacing: normal; text-align: left; margin: 30px 50=
px 0 0;" align=3D"left"><font color=3D"#4d4d4d">The Transparency Turnpike</=
font></h3>
<p style=3D"text-align: left; f=
ont-size: 18px; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%;=
line-height: 28px; margin: 10px 50px 10px auto;" align=3D"left"><font colo=
r=3D"#4d4d4d">Why public roadmaps help you take an engaging journey with yo=
ur users.</font></p>
<table class=3D"button main" bo=
rder=3D"0" cellpadding=3D"14" cellspacing=3D"0" style=3D"display: inline-bl=
ock; font-weight: bold; font-size: 24px; text-align: center; cursor: pointe=
r; color: #FFFFFF; border-radius: 6px; -webkit-text-size-adjust: 100%; -ms-=
text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt; borde=
r-collapse: collapse !important; background: #61BD4F; margin: 10px 0 20px;"=
align=3D"center" bgcolor=3D"#61BD4F">
<tr>
<td align=3D"center" vali=
gn=3D"middle" class=3D"emailButtonContent" style=3D"-webkit-text-size-adjus=
t: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspac=
e: 0pt;">
<a href=3D"http://em.=
trello.com/e/c/eyJlbWFpbF9pZCI6Ik5ERXpOVEk2RndGWDJ3SmtBQUp6QUJjbTc1Y2FBVkpx=
bjFTR0ZWWVlWdUJBa0FGdE9qSTVOekV4TndBPSIsInBvc2l0aW9uIjo0LCJocmVmIjoiaHR0cDo=
vL2Jsb2cudHJlbGxvLmNvbS90aXBzLWZvci1tYWtpbmctYS1wdWJsaWMtcm9hZG1hcC8_dXRtX3=
NvdXJjZT1uZXdzbGV0dGVyJnV0bV9tZWRpdW09ZW1haWwmdXRtX2NhbXBhaWduPU1hck5ld3NsZ=
XR0ZXIiLCJsaW5rX2lkIjoxMjA3NTc2Mn0/c45aea624a7f7b55b5849aca2a8a977670feda61=
e6053b09cfa04b6a4392f7cb" target=3D"_blank" style=3D"text-decoration: none;=
-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; padding: 10px;=
"><font color=3D"white">Hit The Road</font></a>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td style=3D"-webkit-text-size-adju=
st: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspa=
ce: 0pt;">
<center><img src=3D"https://gal=
lery.mailchimp.com/5cb712992a906406c5eae28a7/images/fb6859d0-52cc-492b-8e22=
-1a00326957e4.png" width=3D"440" height=3D"19" style=3D"display: block; -ms=
-interpolation-mode: bicubic; height: auto; line-height: 100%; outline: non=
e; text-decoration: none; max-width: 100%; margin: 10px auto; border: 0;"><=
/center>
</td>
</tr>
<tr>
<!-- Hamid's Chrome Extension -->
<td style=3D"text-align: left; -web=
kit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0=
pt; mso-table-rspace: 0pt;" align=3D"left">
<img src=3D"https://gallery.mai=
lchimp.com/5cb712992a906406c5eae28a7/images/fb492782-cd62-4cbf-a030-1e3e667=
8ed95.png" align=3D"left" width=3D"150" height=3D"150" style=3D"display: in=
line-block; -ms-interpolation-mode: bicubic; height: auto; line-height: 100=
%; outline: none; text-decoration: none; max-width: 100%; margin: 40px; bor=
der: 0;">
<h3 style=3D"font-size: 24px; f=
ont-weight: bold; letter-spacing: normal; text-align: left; margin: 30px 50=
px 0 0;" align=3D"left"><font color=3D"#4d4d4d">Build In Your Browser</font=
></h3>
<p style=3D"text-align: left; f=
ont-size: 18px; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%;=
line-height: 28px; margin: 10px 50px 10px auto;" align=3D"left"><font colo=
r=3D"#4d4d4d">Trello's brand new Chrome extension means more success in les=
s steps.</font></p>
<table class=3D"button main" bo=
rder=3D"0" cellpadding=3D"14" cellspacing=3D"0" style=3D"display: inline-bl=
ock; font-weight: bold; font-size: 24px; text-align: center; cursor: pointe=
r; color: #FFFFFF; border-radius: 6px; -webkit-text-size-adjust: 100%; -ms-=
text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt; borde=
r-collapse: collapse !important; background: #61BD4F; margin: 10px 0 20px;"=
align=3D"center" bgcolor=3D"#61BD4F">
<tr>
<td align=3D"center" vali=
gn=3D"middle" class=3D"emailButtonContent" style=3D"-webkit-text-size-adjus=
t: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspac=
e: 0pt;">
<a href=3D"http://em.=
trello.com/e/c/eyJlbWFpbF9pZCI6Ik5ERXpOVEk2RndGWDJ3SmtBQUp6QUJjbTc1Y2FBVkpx=
bjFTR0ZWWVlWdUJBa0FGdE9qSTVOekV4TndBPSIsInBvc2l0aW9uIjo1LCJocmVmIjoiaHR0cDo=
vL2Jsb2cudHJlbGxvLmNvbS90cmVsbG8tY2hyb21lLWV4dGVuc2lvbi8_dXRtX3NvdXJjZT1uZX=
dzbGV0dGVyJnV0bV9tZWRpdW09ZW1haWwmdXRtX2NhbXBhaWduPU1hck5ld3NsZXR0ZXIiLCJsa=
W5rX2lkIjoxMjA3NTc2M30/094d36d6d6e41b9c620af4fa53421ac5ca69da0412202d5d9868=
6f8110f835c6" target=3D"_blank" style=3D"text-decoration: none; -webkit-tex=
t-size-adjust: 100%; -ms-text-size-adjust: 100%; padding: 10px;"><font colo=
r=3D"white">Check It Out</font></a>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td bgcolor=3D"#FFFFFF" style=3D"-w=
ebkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace:=
0pt; mso-table-rspace: 0pt;">
<img src=3D"https://gallery.mai=
lchimp.com/5cb712992a906406c5eae28a7/images/30c42ed4-88a6-4ecb-b82a-c84475f=
afd87.png" width=3D"600" height=3D"250" style=3D"display: block; -ms-interp=
olation-mode: bicubic; height: auto; line-height: 100%; outline: none; text=
-decoration: none; max-width: 100%; margin: 0; border: 0;">
</td>
</tr>
</table>
</td>
</tr>
<!-- ////////////////////////////
//////////// FOOTER ////////////
/////////////////////////// -->
<tr>
<td style=3D"-webkit-text-size-adjust: 100%; -m=
s-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt;">
<p style=3D"text-align: center; color: #aaa=
aaa; font-weight: bold; -webkit-text-size-adjust: 100%; -ms-text-size-adjus=
t: 100%; font-size: 22px; line-height: 28px; margin: 20px auto 0;" align=3D=
"center">Connect with us:</p>
</td>
</tr>
<tr>
<td id=3D"socialLinks" style=3D"text-align: cen=
ter !important; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%;=
mso-table-lspace: 0pt; mso-table-rspace: 0pt;" align=3D"center !important">
<a href=3D"http://em.trello.com/e/c/eyJlbWF=
pbF9pZCI6Ik5ERXpOVEk2RndGWDJ3SmtBQUp6QUJjbTc1Y2FBVkpxbjFTR0ZWWVlWdUJBa0FGdE=
9qSTVOekV4TndBPSIsInBvc2l0aW9uIjo2LCJocmVmIjoiaHR0cHM6Ly93d3cuZmFjZWJvb2suY=
29tL3RyZWxsb2FwcCIsImxpbmtfaWQiOjExMTIyNzM3fQ/6d8f3ba2e0af2a7e5dc0fbc1c7741=
d016ffdf0b39695d9ba205db588be362ec1" style=3D"-webkit-text-size-adjust: 100=
%; -ms-text-size-adjust: 100%; text-decoration: none; width: 40px;"><img sr=
c=3D"https://gallery.mailchimp.com/5cb712992a906406c5eae28a7/images/e1edb4e=
7-5b33-4c3d-a010-e15b628929af.png" width=3D"40" height=3D"40" style=3D"-ms-=
interpolation-mode: bicubic; height: auto; line-height: 100%; outline: none=
; text-decoration: none; max-width: 100%; margin: 10px 2px; border: 0;"></a>
<a href=3D"http://em.trello.com/e/c/eyJlbWF=
pbF9pZCI6Ik5ERXpOVEk2RndGWDJ3SmtBQUp6QUJjbTc1Y2FBVkpxbjFTR0ZWWVlWdUJBa0FGdE=
9qSTVOekV4TndBPSIsInBvc2l0aW9uIjo3LCJocmVmIjoiaHR0cHM6Ly90d2l0dGVyLmNvbS90c=
mVsbG8iLCJsaW5rX2lkIjoxMTEyMjczOH0/b5222ae2aa92571c4437f8e0d166a8bd602a6c8a=
2e0ce8467df19d19b8cf820e" style=3D"-webkit-text-size-adjust: 100%; -ms-text=
-size-adjust: 100%; text-decoration: none; width: 40px;"><img src=3D"https:=
//gallery.mailchimp.com/5cb712992a906406c5eae28a7/images/24847ca6-6a1d-4069=
-88b5-80e353cebbac.png" width=3D"40" height=3D"40" style=3D"-ms-interpolati=
on-mode: bicubic; height: auto; line-height: 100%; outline: none; text-deco=
ration: none; max-width: 100%; margin: 10px 2px; border: 0;"></a>
<a href=3D"http://em.trello.com/e/c/eyJlbWF=
pbF9pZCI6Ik5ERXpOVEk2RndGWDJ3SmtBQUp6QUJjbTc1Y2FBVkpxbjFTR0ZWWVlWdUJBa0FGdE=
9qSTVOekV4TndBPSIsInBvc2l0aW9uIjo4LCJocmVmIjoiaHR0cHM6Ly93d3cucGludGVyZXN0L=
mNvbS90cmVsbG9hcHAvIiwibGlua19pZCI6MTExMjI3Mzl9/8759b0e32a0e29c02bde22b6ba6=
b1865bd08090d73f581eecb23d52df05adab9" style=3D"-webkit-text-size-adjust: 1=
00%; -ms-text-size-adjust: 100%; text-decoration: none; width: 40px;"><img =
src=3D"https://gallery.mailchimp.com/5cb712992a906406c5eae28a7/images/430ac=
536-4998-4f57-b8e7-747ef53d32af.png" width=3D"40" height=3D"40" style=3D"-m=
s-interpolation-mode: bicubic; height: auto; line-height: 100%; outline: no=
ne; text-decoration: none; max-width: 100%; margin: 10px 2px; border: 0;"><=
/a>
<a href=3D"http://em.trello.com/e/c/eyJlbWF=
pbF9pZCI6Ik5ERXpOVEk2RndGWDJ3SmtBQUp6QUJjbTc1Y2FBVkpxbjFTR0ZWWVlWdUJBa0FGdE=
9qSTVOekV4TndBPSIsInBvc2l0aW9uIjo5LCJocmVmIjoiaHR0cHM6Ly93d3cubGlua2VkaW4uY=
29tL2NvbXBhbnkvdHJlbGxvIiwibGlua19pZCI6MTExMjI3NDB9/9b36165efdfcceea3c9f77c=
6461d1550ace8462f0f0458ce7f5ab2d913a83d4a" style=3D"-webkit-text-size-adjus=
t: 100%; -ms-text-size-adjust: 100%; text-decoration: none; width: 40px;"><=
img src=3D"https://gallery.mailchimp.com/5cb712992a906406c5eae28a7/images/a=
b734e10-e4d9-4829-99c7-421e4daa175f.png" width=3D"40" height=3D"40" style=
=3D"-ms-interpolation-mode: bicubic; height: auto; line-height: 100%; outli=
ne: none; text-decoration: none; max-width: 100%; margin: 10px 2px; border:=
0;"></a>
<a id=3D"blogLink" href=3D"http://em.trello=
..com/e/c/eyJlbWFpbF9pZCI6Ik5ERXpOVEk2RndGWDJ3SmtBQUp6QUJjbTc1Y2FBVkpxbjFTR0=
ZWWVlWdUJBa0FGdE9qSTVOekV4TndBPSIsInBvc2l0aW9uIjoxMCwiaHJlZiI6Imh0dHA6Ly9ib=
G9nLnRyZWxsby5jb20_dXRtX3NvdXJjZT1uZXdzbGV0dGVyJnV0bV9tZWRpdW09ZW1haWwmdXRt=
X2NhbXBhaWduPU1hck5ld3NsZXR0ZXIiLCJsaW5rX2lkIjoxMjA3NTc2NH0/71efcdea7e76305=
6f754ec9f800a1808e8ddcad15edbbfa65e3924be979de006" style=3D"-webkit-text-si=
ze-adjust: 100%; -ms-text-size-adjust: 100%; text-decoration: none; width: =
80px !important;"><img src=3D"https://gallery.mailchimp.com/5cb712992a90640=
6c5eae28a7/images/f470fd65-3f90-477b-802e-8d84567280b7.png" width=3D"80" he=
ight=3D"40" style=3D"-ms-interpolation-mode: bicubic; height: auto; line-he=
ight: 100%; outline: none; text-decoration: none; max-width: 100%; margin: =
10px 2px; border: 0;"></a>
</td>
</tr>
<tr>
<td align=3D"center" valign=3D"top" style=3D"-w=
ebkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace:=
0pt; mso-table-rspace: 0pt;">
<table border=3D"0" align=3D"center" cellpa=
dding=3D"10" cellspacing=3D"0" width=3D"600" id=3D"emailFooter" style=3D"-w=
ebkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace:=
0pt; mso-table-rspace: 0pt; border-collapse: collapse !important; max-widt=
h: 100% !important;">
<tr>
<td valign=3D"top" class=3D"foo=
terContent" style=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: =
100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt;">
<!-- // Begin Module: Stand=
ard Footer \\ -->
<table border=3D"0" cellpad=
ding=3D"10" cellspacing=3D"0" width=3D"100%" style=3D"-webkit-text-size-adj=
ust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rsp=
ace: 0pt; border-collapse: collapse !important;">
<tr>
<td valign=3D"top" =
style=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-ta=
ble-lspace: 0pt; mso-table-rspace: 0pt;">
<br>
<div mc:edit=3D=
"std_footer" style=3D"color: #707070; font-family: Arial; font-size: 12px; =
line-height: 125%; text-align: center; max-width: 100% !important;" align=
=3D"center">
<em>Copyrig=
ht =C2=A9 2016 Trello Inc., All rights reserved.</em>
<br>
</div>
<br>
</td>
</tr>
<tr>
<td colspan=3D"2" v=
align=3D"middle" id=3D"utility" style=3D"-webkit-text-size-adjust: 100%; -m=
s-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt; bor=
der-top-width: 1px; border-top-color: #dddddd; border-top-style: solid;">
<div mc:edit=3D=
"std_utility" style=3D"color: #707070; font-family: Arial; font-size: 12px;=
line-height: 125%; text-align: center; max-width: 100% !important;" align=
=3D"center">
=C2=A0<a hr=
ef=3D"http://em.trello.com/unsubscribe/NDEzNTI6FwFX2wJkAAJzABcm75caAVJqn1SG=
FVYYVuBAkAFtOjI5NzExNwA=3D" class=3D"untracked" style=3D"-webkit-text-size-=
adjust: 100%; -ms-text-size-adjust: 100%; text-decoration: underline; color=
: #336699; font-weight: normal;">Unsubscribe</a> | <a href=3D"http://em.tre=
llo.com/deliveries/NDEzNTI6FwFX2wJkAAJzABcm75caAVJqn1SGFVYYVuBAkAFtOjI5NzEx=
NwA=3D" style=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%=
; text-decoration: underline; color: #336699; font-weight: normal;">view in=
browser</a>=C2=A0
</div>
</td>
</tr>
</table>
<!-- // End Module: Standar=
d Footer \\ -->
</td>
</tr>
</table>
<!-- // End Template Footer \\ -->
</td>
</tr>
</table>
</td>
</tr>
</table>
=C2=A0
=20=20=20=20=20=20=20=20
<img src=3D"http://em.trello.com/e/o/eyJlbWFpbF9pZCI6Ik5ERXpOVEk2RndGWD=
J3SmtBQUp6QUJjbTc1Y2FBVkpxbjFTR0ZWWVlWdUJBa0FGdE9qSTVOekV4TndBPSJ9">
</body>
</html>
----==_mimepart_56e098c9cfc36_5269116325c17542408c--

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,251 @@
Received: from mx1.263.net (mx1sym1 [127.0.0.1])
by mx1.263.net (Postfix) with ESMTP id 053855D3380;
Sat, 7 Aug 2010 13:08:33 +0800 (CST)
X-KSVirus-check:0
X-ABS-CHECKED:1
X-SKE-CHECKED:1
Received: from IOICZLB (mx1sym1 [127.0.0.1])
by mx1.263.net (Postfix) with ESMTP id 31FB513DB2;
Sat, 7 Aug 2010 13:08:31 +0800 (CST)
X-SENDER-IP:116.44.150.6
X-LOGIN-NAME:
X-ATTACHMENT-NUM:1
X-SENDER:stiffenersqio542@robohand.com
X-DNS-TYPE:0
Received: from IOICZLB (unknown [116.44.150.6])
by mx1.263.net (Postfix) whith ESMTP id 167674B1WM2;
Sat, 07 Aug 2010 13:08:31 +0800 (CST)
Received: from 116.44.150.6 by mail.global.frontbridge.com; Sat, 7 Aug 2010 14:07:25 +0900
Message-ID: <000d01cb35ee$6cb79410$6400a8c0@stiffenersqio542>
From: "Liliana Chan" <stiffenersqio542@robohand.com>
To: <zsxql@263.net>
Subject: Angel Awards
Date: Sat, 7 Aug 2010 14:07:25 +0900
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="----=_NextPart_000_0006_01CB35EE.6CB79410"
X-Priority: 3
X-MSMail-Priority: Normal
X-Mailer: Microsoft Outlook Express 6.00.2900.2180
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
This is a multi-part message in MIME format.
------=_NextPart_000_0006_01CB35EE.6CB79410
Content-Type: text/plain;
format=flowed;
charset="iso-8859-1";
reply-type=original
Content-Transfer-Encoding: 7bit
Liliana Chan
Human Resources Coordinator
Human Resources
ASPCA®
520 8th Avenue, 7th Floor
New York, NY 10018
stiffenersqio542@robohand.com
P: 673-154-1717, ext. 52133
F: 082-845-5137
The information contained in this e-mail, and any attachments hereto, is from The American Society for the Prevention of Cruelty to Animals® (ASPCA®) and is intended only for use by the addressee(s) named herein and may contain legally privileged and/or confidential information. If you are not the intended recipient of this e-mail, you are hereby notified that any dissemination, distribution, copying or use of the contents of this e-mail, and any attachments hereto, is strictly prohibited. If you have received this e-mail in error, please immediately notify me by reply email and permanently delete the original and any copy of this e-mail and any printout thereof.
------=_NextPart_000_0006_01CB35EE.6CB79410
Content-Type: application/zip;
name="List for Printing - 1st and 2nd Qtrs.zip"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="List for Printing - 1st and 2nd Qtrs.zip"
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
cy5leGVQSwUGAAAAAAEAAQBWAAAA4CgAAAAA
------=_NextPart_000_0006_01CB35EE.6CB79410--

View File

@ -268,6 +268,27 @@ static void mime_test1(acl::mime& mime, const char* path, bool htmlFirst)
}
printf(">>>> saved attach file ok ...\r\n");
//////////////////////////////////////////////////////////////////////
// ±éÀúËùÓнڵã
printf("------------------------------------------------------\r\n");
acl::string tmp;
int i = 0;
const std::list<acl::mime_node*>& nodes = mime.get_mime_nodes();
for (std::list<acl::mime_node*>::const_iterator cit2 = nodes.begin();
cit2 != nodes.end(); ++cit2)
{
printf("ctype: %s, stype: %s, begin: %ld, end: %ld\r\n",
(*cit2)->get_ctype_s(), (*cit2)->get_stype_s(),
(long) (*cit2)->get_bodyBegin(),
(long) (*cit2)->get_bodyEnd());
tmp.format("var/node-%d-body.txt", i++);
(*cit2)->save(tmp);
printf(">>>save to file: %s\r\n", tmp.c_str());
}
printf("------------------------------------------------------\r\n");
//////////////////////////////////////////////////////////////////////
// 将解析后的邮件再重新组合并保存在磁盘上

View File

@ -159,10 +159,6 @@ static void mime_node_free(MIME_NODE *node)
acl_vstring_free(node->buffer);
if (node->boundary)
acl_vstring_free(node->boundary);
#ifdef SAVE_BODY
if (node->body)
acl_vstring_free(node->body);
#endif
acl_myfree(node);
}

View File

@ -15,8 +15,6 @@ struct MAIL_ADDR
char *comment;
};
//#define SAVE_BODY
struct MIME_NODE
{
ACL_RING children; /**< 子结点集合 */
@ -61,9 +59,6 @@ struct MIME_NODE
char bound_term[3];
ACL_VSTRING *buffer; /**< headers, quoted-printable body */
#ifdef SAVE_BODY
ACL_VSTRING *body;
#endif
ACL_RING node; /**< 当前结点 */
off_t header_begin; /**< 结点头开始位置 */

View File

@ -607,8 +607,6 @@ static int mime_state_head(MIME_STATE *state, const char *s, int n)
return n;
}
#if 1
// 分析 multipart 部分体, 当匹配到一个完整的分隔符后则表明该部分数据体分析完毕
static int mime_bound_body(MIME_STATE *state, const char * const boundary,
MIME_NODE *node, const char *s, int n, int *finish)
@ -621,9 +619,6 @@ static int mime_bound_body(MIME_STATE *state, const char * const boundary,
off_t last_lf_pos = node->last_lf_pos;
const char *bound_ptr = node->bound_ptr;
unsigned char ch;
#ifdef SAVE_BODY
const unsigned char *startn = NULL;
#endif
for (; cp < end; cp++) {
ch = *cp;
@ -637,29 +632,13 @@ static int mime_bound_body(MIME_STATE *state, const char * const boundary,
curr_off++;
if (bound_ptr == NULL) {
if (ch != *boundary) {
#ifdef SAVE_BODY
ADDCH(node->body, ch);
#endif
if (ch != *boundary)
continue;
}
#ifdef SAVE_BODY
startn = cp;
#endif
bound_ptr = boundary;
}
if (ch != *bound_ptr) {
#ifdef SAVE_BODY
// 说明之前的匹配失效,需要重新匹配,
// 但必须将之前匹配的字符拷贝
if (bound_ptr > boundary) {
APPEND(node->body, boundary,
bound_ptr - boundary);
}
#endif
bound_ptr = NULL;
} else if (*++bound_ptr == 0) {
/* 说明完全匹配 */
@ -679,13 +658,6 @@ static int mime_bound_body(MIME_STATE *state, const char * const boundary,
node->body_data_end--;
}
#ifdef SAVE_BODY
if (startn > (const unsigned char *) s) {
/* 将匹配之前的数据拷贝 */
APPEND(node->body, (const char*) s,
(const char*) startn - s);
}
#endif
bound_ptr = NULL;
cp++;
break;
@ -700,136 +672,15 @@ static int mime_bound_body(MIME_STATE *state, const char * const boundary,
return (int) (n - ((const char*) cp - s));
}
#else
// 分析 multipart 部分体, 当匹配到一个完整的分隔符后则表明该部分数据体分析完毕
static int mime_bound_body(MIME_STATE *state, const char *boundary,
MIME_NODE *node, const char *s, int n, int *finish)
{
const unsigned char *cp, *end = (const unsigned char*) s + n;
#ifdef SAVE_BODY
const unsigned char *startn = NULL;
#endif
size_t bound_len = strlen(boundary);
// printf(">>>size: %ld\r\n", (long) ACL_VSTRING_SIZE(node->body));
for (cp = (const unsigned char *) s; cp < end; cp++) {
// 记录下 \r\n 的位置
if (*cp == '\r')
node->last_cr_pos = state->curr_off;
else if (*cp == '\n')
node->last_lf_pos = state->curr_off;
state->curr_off++;
if (node->bound_ptr != NULL) {
if (*cp != *node->bound_ptr) {
#ifdef SAVE_BODY
// 说明之前的匹配失效,需要重新匹配,
// 但必须将之前匹配的字符拷贝
if (node->bound_ptr > boundary) {
APPEND(node->body, boundary,
node->bound_ptr - boundary);
}
#endif
node->bound_ptr = NULL;
} else if (*++node->bound_ptr == 0) {
/* 说明完全匹配 */
*finish = 1;
node->body_end = state->curr_off
- (off_t) strlen(state->curr_bound);
node->body_data_end = node->body_end;
// 因为 body_end 记录的是某个结点最后的位置,
// 其中会包含, 根据协议附加的 \r\n所以真实
// 数据的结束位置 body_data_end 是去掉这些数据
// 后的位置
if (node->last_lf_pos + (off_t) bound_len
== state->curr_off - 1)
{
node->body_data_end--;
if (node->last_cr_pos + 1 == node->last_lf_pos)
node->body_data_end--;
}
#ifdef SAVE_BODY
if (startn > (const unsigned char *) s) {
/* 将匹配之前的数据拷贝 */
APPEND(node->body, (const char*) s,
(const char*) startn - s);
}
#endif
node->bound_ptr = NULL;
cp++;
break;
} else
continue;
}
// --> node->bound_ptr == NULL
if (*cp != *boundary) {
#ifdef SAVE_BODY
ADDCH(node->body, *cp);
#endif
continue;
}
node->bound_ptr = boundary + 1;
/* 说明完全匹配 */
if (*node->bound_ptr == 0) {
node->body_end = state->curr_off
- (off_t) strlen(state->curr_bound);
node->body_data_end = node->body_end;
// body_end 记录的是某个结点最后的位置,其中会包含
// 根据协议附加的 \r\n所以真实数据的结束位置
// body_data_end 是去掉这些数据后的位置
if (node->last_lf_pos + (off_t) strlen(boundary)
== node->state->curr_off - 1)
{
node->body_data_end--;
if (node->last_cr_pos + 1 == node->last_lf_pos)
node->body_data_end--;
}
*finish = 1;
node->bound_ptr = NULL;
cp++;
break;
}
#ifdef SAVE_BODY
startn = cp;
#endif
}
return (int) (n - ((const char*) cp - s));
}
#endif
// 分析邮件体或 multipart 部分体
static int mime_state_body(MIME_STATE *state, const char *s, int n)
{
int finish = 0;
#ifdef SAVE_BODY
if (state->curr_node->body == NULL)
state->curr_node->body = acl_vstring_alloc(1024);
#endif
if (state->curr_bound == NULL) {
/* 如果没有分隔符,则说明是文本类型,即只有正文内容 */
#ifdef SAVE_BODY
APPEND(state->curr_node->body, s, n);
#endif
state->curr_off += n;
/* 因为 curr_off 指向下一个偏移位置,所以
@ -1074,8 +925,10 @@ static struct MIME_STATUS_MACHINE status_tab[] = {
int mime_state_update(MIME_STATE *state, const char *ptr, int n)
{
const char *s = ptr;
int ret;
while (n > 0) {
int ret = status_tab[state->curr_status].callback(state, s, n);
ret = status_tab[state->curr_status].callback(state, s, n);
if (state->curr_status == MIME_S_TERM)
return 1;
acl_assert(ret >= 0);

View File

@ -618,7 +618,8 @@ static bool has_content_id(MIME_NODE* node)
}
const std::list<mime_attach*>& mime::get_attachments(bool enableDecode /* = true */,
const char* toCharset /* = "gb2312" */, off_t off /* = 0 */)
const char* toCharset /* = "gb2312" */, off_t off /* = 0 */,
bool all /* = true */)
{
if (m_pAttaches == NULL)
m_pAttaches = NEW std::list<mime_attach*>;
@ -628,6 +629,9 @@ const std::list<mime_attach*>& mime::get_attachments(bool enableDecode /* = true
if (m_pMimeState == NULL)
return (*m_pAttaches);
#define EQ !strcasecmp
#define CHECK(t) (EQ((t), "message") || EQ((t), "image") || EQ((t), "application"))
ACL_ITER iter;
mime_attach* attach;
MIME_NODE* node;
@ -640,7 +644,14 @@ const std::list<mime_attach*>& mime::get_attachments(bool enableDecode /* = true
enableDecode, toCharset, off);
m_pAttaches->push_back(attach);
}
else if (all && node->ctype_s && CHECK(node->ctype_s))
{
attach = NEW mime_attach(m_pFilePath, node,
enableDecode, toCharset, off);
m_pAttaches->push_back(attach);
}
}
return (*m_pAttaches);
}

View File

@ -57,12 +57,22 @@ mime_node::mime_node(const char* emailFile, const MIME_NODE* node,
m_bodyEnd = node->body_data_end + off;
}
mime_node::~mime_node()
mime_node::~mime_node(void)
{
delete m_headers_;
delete m_pParent;
}
const char* mime_node::get_ctype_s(void) const
{
return m_pMimeNode->ctype_s ? m_pMimeNode->ctype_s : "";
}
const char* mime_node::get_stype_s(void) const
{
return m_pMimeNode->stype_s ? m_pMimeNode->stype_s : "";
}
const char* mime_node::header_value(const char* name) const
{
ACL_ITER iter;
@ -273,6 +283,22 @@ int mime_node::parent_stype() const
return (m_pMimeNode->parent->stype);
}
const char* mime_node::parent_ctype_s(void) const
{
if (m_pMimeNode->parent == NULL)
return "";
const char* ptr = m_pMimeNode->parent->ctype_s;
return ptr ? ptr : "";
}
const char* mime_node::parent_stype_s(void) const
{
if (m_pMimeNode->parent == NULL)
return "";
const char* ptr = m_pMimeNode->parent->stype_s;
return ptr ? ptr : "";
}
int mime_node::parent_encoding() const
{
if (m_pMimeNode->parent == NULL)

View File

@ -65,9 +65,9 @@ bool queue_file::create(const char* home, const char* queueName,
memset(&tv, 0, sizeof(tv));
gettimeofday(&tv, NULL);
safe_snprintf(m_partName, sizeof(m_partName),
"%08x%08x%08x%08x%08x",
"%u_%lu_%08x_%08x_%u",
(unsigned int) getpid(),
(unsigned int) acl::thread::thread_self(),
(unsigned long) acl::thread::thread_self(),
(unsigned int) tv.tv_sec,
(unsigned int) tv.tv_usec,
(unsigned int) __counter);

View File

@ -271,7 +271,8 @@ redis_result* redis_client::get_redis_object(dbuf_pool* pool)
char ch;
if (conn_.read(ch) == false)
{
logger_error("read first char error, server: %s", addr_);
logger_warn("read first char error: %s, server: %s",
last_serror(), addr_);
return NULL;
}

View File

@ -164,11 +164,24 @@ redis_client_cluster& redis_client_cluster::set_password(
{
// 允许 pass 为空字符串且非空指针,这样就可以当 default 值被设置时,
// 允许部分 redis 节点无需连接密码
if (addr && *addr && pass)
if (addr == NULL || *addr == 0 || pass == NULL || *pass == 0)
return *this;
string key(addr);
key.lower();
passwds_[key] = pass;
for (std::vector<connect_pool*>::iterator it = pools_.begin();
it != pools_.end(); ++it)
{
string key(addr);
redis_client_pool* pool = (redis_client_pool*) (*it);
key = pool->get_addr();
key.lower();
passwds_[key] = pass;
std::map<string, string>::const_iterator cit =
passwds_.find(key);
if (cit != passwds_.end() || !strcasecmp(addr, "default"))
pool->set_password(pass);
}
return *this;

View File

@ -114,6 +114,11 @@ bool json_node::is_null(void) const
bool json_node::is_object(void) const
{
if (node_me_->type == ACL_JSON_T_OBJ)
return true;
else
return false;
if (node_me_->tag_node == NULL)
return false;
if (node_me_->tag_node->type == ACL_JSON_T_OBJ)
@ -315,6 +320,20 @@ json_node* json_node::next_child(void)
return child;
}
const char* json_node::operator[](const char* tag)
{
json_node* iter = first_child();
while (iter)
{
const char* ptr = iter->tag_name();
if (ptr != NULL && strcasecmp(ptr, tag) == 0)
return iter->get_text();
iter = next_child();
}
return NULL;
}
int json_node::depth(void) const
{
return node_me_->depth;
@ -472,6 +491,22 @@ const std::vector<json_node*>& json::getElementsByTags(const char* tags) const
return nodes_query_;
}
json_node* json::getFirstElementByTags(const char* tags) const
{
ACL_ARRAY* a = acl_json_getElementsByTags(json_, tags);
if (a == NULL)
return NULL;
ACL_JSON_NODE* n = (ACL_JSON_NODE*) acl_array_index(a, 0);
acl_assert(n);
json_node* node = NEW json_node(n, const_cast<json*>(this));
const_cast<json*>(this)->nodes_query_.push_back(node);
acl_json_free_array(a);
return node;
}
ACL_JSON* json::get_json(void) const
{
return json_;