腾讯企业邮箱如何设置IMAP、POP3/SMTP及其SSL加密方式

如何设置IMAP、POP3/SMTP及其SSL加密方式?

如果您的电子邮件客户端支持SSL,可以在设置中选择使用SSL。

通用配置参数:
(我们已经默认都支持这些协议,用户无需自己手动开启这些服务器与端口)

POP3/SMTP协议
接收邮件服务器:pop.exmail.qq.com ,使用SSL,端口号995
发送邮件服务器:smtp.exmail.qq.com ,使用SSL,端口号465
海外用户可使用以下服务器
接收邮件服务器:hwpop.exmail.qq.com ,使用SSL,端口号995
发送邮件服务器:hwsmtp.exmail.qq.com ,使用SSL,端口号465

IMAP协议
接收邮件服务器:imap.exmail.qq.com ,使用SSL,端口号993
发送邮件服务器:smtp.exmail.qq.com ,使用SSL,端口号465
海外用户可使用以下服务器
接收邮件服务器:hwimap.exmail.qq.com ,使用SSL,端口号993
发送邮件服务器:hwsmtp.exmail.qq.com ,使用SSL,端口号465

账户名:您的企业邮箱账户名,账户名需要填写完整的邮件地址
密码:您的企业邮箱密码
电子邮件地址:您的企业邮箱的完整邮件地址

centos7 vsftp 虚拟用户配置

搞过好多遍了,每次都要花不少时间确认一些小问题,所以做个笔记,供以后参考
1. 安装 vsftpd
yum install vsftpd
chkconfig vsftpd on
2. 测试端口外网可访问性,用telnet就可以测试,如果不可访问,请确认vsftp端口已经监听,并且iptable 或者firewall配置正确,同时如果用的是阿里云之类的云主机,确认云平台的安全策略是否已经开发21端口
3. 创建用户
useradd virtual -s /sbin/nologin
4. 修改/etc/vsftpd.conf
修改:
anonymous_enable=NO
local_enable=YES
chroot_local_user=YES
新增:
guest_enable=YES
guest_username=virtual
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd/user_conf
5. 修改 /etc/pam.d/vsftpd,删除原有内容,新增:
auth required pam_userdb.so db=/etc/vsftpd/vsftpd_login
account required pam_userdb.so db=/etc/vsftpd/vsftpd_login
6. 创建账号
1)创建账号文件 login.txt:aaaa是密码,1111是密码
aaaa
111111
2)  db_load -T -t hash -f /etc/vsftpd/login.txt /etc/vsftpd/vsftpd_login.db
7. 创建虚拟账号
mkdir  /etc/vsftpd/user_conf
vi aaaa
编辑内容,注意虚拟账号的目录一定要在默认user loc目录下,默认目录是/var/ftp/
local_root=/var/ftp/aaaa/
write_enable=YES
anon_umask=022
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
8. 配置完成重启服务
systemctl restart vsftpd

VSC下clang-format的自动格式化配置

遇到的问题:clang-format  启动自动格式化后,每次自动换行的宽度太窄,导致大量的自动换行,影响代码美观。

解决:

以默认的.clang-format 配置文件为模板,修改ColumnLimit参数:

Language: Cpp
ColumnLimit: 120

最后将.clang-format  文件放到工程的根目录下,重新开启VSC,生效。
其中 Language的设置如下:

Language (LanguageKind)
Language, this format style is targeted at.

Possible values:

LK_None (in configuration: None) Do not use.
LK_Cpp (in configuration: Cpp) Should be used for C, C++.
LK_Java (in configuration: Java) Should be used for Java.
LK_JavaScript (in configuration: JavaScript) Should be used for JavaScript.
LK_ObjC (in configuration: ObjC) Should be used for Objective-C, Objective-C++.
LK_Proto (in configuration: Proto) Should be used for Protocol Buffers (https://developers.google.com/protocol-buffers/).
LK_TableGen (in configuration: TableGen) Should be used for TableGen code.
LK_TextProto (in configuration: TextProto) Should be used for Protocol Buffer messages in text format (https://developers.google.com/protocol-buffers/).

相关的选项含义可以参考这里:http://releases.llvm.org/3.6.0/tools/clang/docs/ClangFormatStyleOptions.html

ios之multipath TCP

之前研究过这个,今天有人问起,回想了半天才想起来具体的技术细节,所以作下简要笔记,已备下次回顾之用。

在IOS7以后的版本中,当iphone连接硬件wifi热点,跟硬件建立tcp socket连接时,怎么才能同时保证可以通过手机自身的4G上internet,在android上这个是做不到的,但iphone可以,这场景就用到multipath TCP。

具体细节可以参考这个 http://www.cnblogs.com/yulang314/p/5065305.html

xcrun导致的pod更新失败

系统升级到最新的sierra后,执行pod update 失败:

zcj-macair:qinmi alex$ pod update
-bash: /usr/local/bin/pod: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby: bad interpreter: No such file or directory
zcj-macair:qinmi alex$ brew install ryby
Updating Homebrew...
==> Using the sandbox
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
Error: git cannot be built with any available compilers.
Install GNU's GCC
  brew install gcc

Error: Git must be installed and in your PATH!
Error: No available formula with the name "ryby" 
==> Searching for similarly named formulae...
Error: No similarly named formulae found.
==> Searching taps...
Error: No formulae found in taps.

按照提示安装对应的程序时,进一步提示错误,发现是xcrun错误。

更新xcrun环境:xcode-select –install
更新ruby:brew install ruby
更新pod:gem install cocoapods

ssh强制密钥登陆

在网路上有大量的扫描程序和爬虫在扫描肉鸡,其中一个最常用的方式就是扫描ssh权限。这种肉鸡主要用来【翻腔】或者DDOS或者挖矿等,总之是可以牟利的。

新注册的vps,还没多久就发现:

There were 2816 failed login attempts since the last successful login.

而避免被暴力的一种简单的方法就是强制密钥登陆。

  1. 创建密钥对
    ssh-keygen -t rsa -b 4096 -C “your_email@example.com”
    按照流程走完后会在 ~/.ssh目录下看到id_rsa, id_rsa.pub文件 第一个是私有密钥 第二个是公有密钥。
  2. 将公钥的*.pub内容写入:.ssh/authorized_keys
    如果没有目录创建目录。
  3. 修改服务器配置 /etc/ssh/sshd_config
    PasswordAuthentication no 默认yes,改为no。是否允许使用基于密码的认证。
    (建议但非必选)
    GSSAPICleanupCredentials yes 默认no,改为yes。是否在用户退出登录后自动销毁用户凭证缓存
  4. 修改完后重启sshd服务
然后私钥就可以用来在客户端登录时使用,如果密钥没密码,就可以实现无密码登录了

APNs调试工具Knuff介绍

作为一个ios开发者,在你调试APNs时,正常的情况下你需要弄好证书给到后台的同事上线到测试环境,然后才能开始测试调试推送的相关功能。

如果这个过程遇到证书错误,后台代码错误,苹果变更接口等,等到能调试ios的功能,需要等到好久的时间。

那么ios可以独立调试APNs的相关功能吗?当然可以,Knuff就是一款简洁简单的推送调试工具。下面的以MAC的为介绍对象,其他平台的请自行理解。

软件界面如下:

Knuff功能说明

Custom:自定义模式,可以自行选择证书,我们测试自己的应用,就用这个模式

Knuff iOS: Knuff iOS表示使用Knuff的证书,直接推送给Knuff配套的ios应用。

Choose:选择推送的push证书,我们需要选择我们证书,关于如何生成正确的证书,请自行google。

Production:选择证书后,就会出现这个选择,production表示appstore证书,推送给appstore版本的APP。

Sandbox:表示开发调试的非AppStore版本。

Priority:测试时可随意选择。

Payload:表示要推送的报文,具体字段含义这里就不展开了,请自行了解。

Token:device token,在注册苹果 APNs服务时获取的。参考代码如下:

注册服务

[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings
                                                                             settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge)
                                                                             categories:nil]];

[[UIApplication sharedApplication] registerForRemoteNotifications];

回调事件
调用didRegisterForRemoteNotificationsWithDeviceToken

至此我们就可以开始测试了,通过这个工具我们就能轻易的测试我们的device token是否正确,测试我们生成的证书是否正确。给自己发送任意想测试的payload。

have fun!

APNs php客户端及静默推送

简介

关于APNs的工作原理,网上有大量的文章,建议学习apple的官方文档。通过APNs我们就可以通过服务器想APP推送想要的内容和事件。从而实现通知或者激活应用的目的。本文我们讲介绍如何搭建php的APNs推送以及如何实现静默推送。

APNs PHP 客户端

经过多方的验证,目前推荐这个:
https://github.com/immobiliare/ApnsPHP

证书

想要通过苹果服务器推送信息,必须要有合法的证书。很多人在推送这部分花了很多时间,很多情况是没搞清楚失败到底是代码的问题还是证书的问题。所以,我们需要先验证证书的合法和正确性。

推送时,我们要制作推送证书,我们要选择正确的类型,具体的制作过程可自行搜索,最终的证书类型如下:

先前我的文章推荐过Knuff,经过深入的实践,这里我推荐Easy APNS Provider,可以从MAC store下载。相比较Knuff,EAP更加的稳定强大。通过工具我们就可以先行验证证书的正确性,避免后面定位问题浪费更多的时间。

在MAC上用客户端向苹果发送推送服务器请求时,我们选择上面安装的证书就可以了。

PHP服务器证书

上面我们讲了怎么选择正确的客户端证书,当我们使用php 服务器推送时,我们还要做些额外的工作:

  • 打开“钥匙串”程序,(证书助理->从证书颁发机构请求证书),只填邮箱和常用名称,ca不用填,然后保存.certSigningRequest文件到磁盘。
  • 在iOS Dev Center 点击App IDs进入App ID列表。
  • 为 App 开启 Push Notification 功能。(推送证书分为两个版本,一个是Development版,一个是Production版,分别对应开发证书和发布证书。)
  • 上传刚才生成的.certSigningRequest文件,生成aps_development.cer推送证书,双击安装。
  • 打开“钥匙串”程序,(选择登录与我的证书选项后)找到IOS Push Services那条。
  • 右键导出,存储为cert.p12,(输入密码P*d),然后将该证书的折叠打开,导出“专用密钥”。存储为key.p12
  • 接下来打开终端执行下面的命令,生成的ck.pem就是我们在php脚本中要使用的证书。
#生成cert.pem
openssl pkcs12 -clcerts -nokeys -out cert.pem -in cert.p12
#生成key.pem(先输出导出key.p12时设置的密码P*d, 然后设置一个新的密码,如pushpwd,这个密码后面php推送时要设置)
openssl pkcs12 -nocerts -out key.pem -in key.p12
#合并成ck.pem
cat cert.pem key.pem > ck.pem

APNs PHP客户单配置

这个软件包的最新版本支持HTTP2,如果你的PHP的版本支持HTTP2,建议优先使用。开发包里面自带了几个sample,简单配置后基本就可以使用。这里我们以sample_push.php为测试对象。

如图所示,配置要点如下:
* 目标环境:sandbox还是production,对于appstore下载的目标,请选择ENVIRONMENT_PRODUCTION,对于开发中的版本,清选择ENVIRONMENT_SANDBOX
* 证书:填写证书的相对路径,这里最好时按照上面的步骤验证通过的证书
* 在上面的步骤中我们生成pem证书时,要求一个最少4位的密码,所以这个地方一定要设置密码,否则connect会失败
* device token:这里是我们要推送的目标的token。

测试通过的返回如下:

Fri, 13 Jan 2017 13:31:35 +0100 ApnsPHP[15355]: INFO: Trying tls://gateway.sandbox.push.apple.com:2195... Fri, 13 Jan 2017 13:31:35 +0100 ApnsPHP[15355]: INFO: Connected to tls://gateway.sandbox.push.apple.com:2195. Fri, 13 Jan 2017 13:31:35 +0100 ApnsPHP[15355]: INFO: Sending messages queue, run #1: 1 message(s) left in queue. Fri, 13 Jan 2017 13:31:35 +0100 ApnsPHP[15355]: STATUS: Sending message ID 1 [custom identifier: Message-Badge-3] (1/3): 167 bytes. Fri, 13 Jan 2017 13:31:36 +0100 ApnsPHP[15355]: INFO: Disconnected.

device token

在上面我们提到了设备的device token,那么调试阶段如何获取这个token呢?在我们发起了注册请求后,系统会触发相应的消息回调。相关的参考代码如下:

-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    //读取APNS token
    NSString* _deviceToken = [[[[deviceToken description]
                                stringByReplacingOccurrencesOfString: @"<" withString: @""]
                               stringByReplacingOccurrencesOfString: @">" withString: @""]
                              stringByReplacingOccurrencesOfString: @" " withString: @""];
    QMLogDebug(@"apns token:%@",_deviceToken);
    NSUserDefaults * userDefault = [NSUserDefaults standardUserDefaults];
    [userDefault setObject:_deviceToken forKey:APNSTOKEN];
    [userDefault synchronize];
}

上面的deviceToken就获取了我们需要的token。

静默推送

ios最新的版本中已经支持了静默推送,静默推送时,客户端会收到消息,执行相应的动作,但不会做任何给用户的提示。在普通的推送中我们可以通过如下的代码实现静默推送的效果:

{
  "aps" : {
    "badge" : 0
  }
}

但是苹果还是专门定义了一个开关来表示静默推送 “content-available” : 1,由于此开关优先级较低,在静默推送的报文中不能出现alert,sound 等,否则就会变成普通推送。

静默推送的payload如下:

{
  "aps" : {
    "content-available" : 1
  }
}

静默推送的前提:
1. 只有app还在后台运行时,才能收到静默推送,否则推送了也没有用
2. 跟普通推送类似,苹果对频率和到达性都不做保证。

参考

How to generate a Push Notification certificate and download the Entrust Root Authority certificate

基于certbot的letsencrypt安装使用

# 起因

  • 前面的文章讲过,运营商环节会在用户加载内容的时候,在流中进行注入frame ,强行展示广告。
  • 如果你的server是给App提供web api的接口,由于苹果ATS的执行,你不得不所有接口都升级成HTTPS。

免费ssl证书

首选当时letsencrypt了,官方网站是:https://letsencrypt.org. 网上大把文章,但按照本人一贯的习惯还是去官网,避免被过时的信息误导,反而浪费更多的时间。
官方推荐的是cetrbot:https://certbot.eff.org/
根据本人的系统,实际的文档路径:https://certbot.eff.org/#centosrhel7-nginx

letsencrypt

安装

首先需要安装certbot:
默认centos7是不支持certot,你需要先安装EPEL:https://fedoraproject.org/wiki/EPEL#How_can_I_use_these_extra_packages.3F
实际的安装包为:https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
下载后安装rpm。然后执行:

sudo yum install certbot

一路‘y’,安装完成:

Installed:
  certbot.noarch 0:0.9.3-1.el7

Dependency Installed:
  dialog.x86_64 0:1.2-4.20130523.el7                 pyOpenSSL.x86_64 0:0.13.1-3.el7                     python-cffi.x86_64 0:1.6.0-5.el7
  python-chardet.noarch 0:2.2.1-1.el7_1              python-enum34.noarch 0:1.0.4-1.el7                  python-idna.noarch 0:2.0-1.el7
  python-ipaddress.noarch 0:1.0.16-2.el7             python-ndg_httpsclient.noarch 0:0.3.2-1.el7         python-parsedatetime.noarch 0:1.5-3.el7
  python-ply.noarch 0:3.4-10.el7                     python-psutil.x86_64 0:2.2.1-1.el7                  python-pycparser.noarch 0:2.14-1.el7
  python-requests.noarch 0:2.6.0-1.el7_1             python-six.noarch 0:1.9.0-2.el7                     python-urllib3.noarch 0:1.10.2-2.el7_1
  python-zope-component.noarch 1:4.1.0-1.el7         python-zope-event.noarch 0:4.0.3-2.el7              python-zope-interface.x86_64 0:4.0.5-4.el7
  python2-acme.noarch 0:0.9.3-1.el7                  python2-certbot.noarch 0:0.9.3-1.el7                python2-configargparse.noarch 0:0.11.0-1.el7
  python2-cryptography.x86_64 0:1.3.1-3.el7          python2-dialog.noarch 0:3.3.0-6.el7                 python2-mock.noarch 0:1.0.1-9.el7
  python2-pyasn1.noarch 0:0.1.9-7.el7                python2-pyrfc3339.noarch 0:1.0-2.el7                pytz.noarch 0:2012d-5.el7

Complete!

开始

在已经有webserver运行的情况下,certbot推荐我们使用“webroot”插件。可以实现在不暂停web服务的情况下更新证书。

webroot:不需要停机你的web服务

certbot certonly --webroot -w AAA -d BBB

BBB是你要支持的域名,AAA是BBB当前已经可以访问的目录。

standalone:需要停机你当前服务器的80端口的服务

certbot certonly --standalone  -d xxx.com

以上每一条命令生成一个对立的目录,如果是多个域名就是合在一起的一个文件。如果要每个域名都生成独立的目录和文件,就要执行多次。

成功后:

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/xxx/fullchain.pem. Your cert
   will expire on 2017-03-18. To obtain a new or tweaked version of
   this certificate in the future, simply run certbot again. To
   non-interactively renew *all* of your certificates, run "certbot
   renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

手动在nginx的conf中配置相关的路径就可以了:

ssl_certificate /etc/letsencrypt/live/xxx/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/xxx/privkey.pem;

续期

certbot renew

撤销

[root@rxblog certbot-0.22.2]# ./certbot revoke --cert-path /etc/letsencrypt/archive/xxx.com/cert1.pem
Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Would you like to delete the cert(s) you just revoked?
-------------------------------------------------------------------------------
(Y)es (recommended)/(N)o: Y

-------------------------------------------------------------------------------
Deleted all files relating to certificate iwwenbo.com.
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Congratulations! You have successfully revoked the certificate that was located
at /etc/letsencrypt/archive/iwwenbo.com/cert1.pem

-------------------------------------------------------------------------------

OK,暂时告一段落。

关于苹果前后台定位的使用

其实主要就是要理解这两个函数的功能和适用场景:
startUpdatingLocation
startMonitoringSignificantLocationChanges

可以参看苹果的这个demo:https://developer.apple.com/library/content/samplecode/Regions/Introduction/Intro.html
理解了,自己改动下,就能实现强大的后台定位

2016.12.25:
了解更多的细节,可以参看这里,全部确认到了,基本就搞定了:
https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/LocationAwarenessPG/CoreLocation/CoreLocation.html

linker command failed with exit code 1 (use -v to see invocation)

最近在重构之前的代码,所以在本地游多个分支,经常出现如下的问题:
linker command failed with exit code 1 (use -v to see invocation)

之前也是基本重新update下pod基本就ok,今天发现之前ok的提交到git的代码,拉到本地又出现这个问题了,所有有必要弄清楚根源,避免每次都各种莫名尝试浪费时间。

从其中的一条错误提示入手:

ld: warning: directory not found for option ‘-L/Users/xxx/Library/Developer/Xcode/DerivedData/xxx-gttrbsolrpknxhbtjxulraplunas/Build/Products/Debug-iphonesimulator/AFNetworking’

在这个路径下确实发现缺少东西,对于目前成功编译的项目,我们手动删除目标后,再此编译,发现也提示这个错误这个很奇怪,按理应该成功才对。所以初步的原因是这个目标对象对应的pod库没有。那么是什么时候生成的呢,我们进一步分析。

在尝试了pod install和update后,目标并没有生成,所以pod阶段只是创建关联project。应该还是在编译阶段生成的。

按照正常的流程,应该是build时生成相应的target的库,现在却没有生成,进一步在网上搜索,看到“Build Active Architecture Only”
这个选项,当为 YES时,表示只编译当前的architecture版本。所以改为yes后,便可以生成当前 architecture的库了。

所以失败的原因是,这个选项为NO时默认生成所有的target的库,但是是按默认顺序的,还并没有来的及生成当前的目标库,所以link时就失败了。改为YES,相当于当前平台更改为了最高优先级,所以就直接生成了。

NSManageObjectContext – Class is not key value coding-compliant for the key @count

最近把ios的代码升级到了ios10和xcode8 ,出现了大量:

NSManageObjectContext – Class is not key value coding-compliant for the key @count

解决:
参考:http://stackoverflow.com/questions/39511997/nsmanageobjectcontext-class-is-not-key-value-coding-compliant-for-the-key-cou

更新RestKit:
pod ‘RestKit’, :git => ‘https://github.com/RestKit/RestKit.git’, :commit => ‘9cbba9eb1b490c3c5e2873c8fba8e9c0fec1bf07’

更新后会有新的错误,依照提示修复就可以了。

centos开启swap

os:centos6
type:vps
1. 创建用于交换分区的文件
2. 设置交换分区文件
3. 立即启用交换分区文件
4. 设置开机时自启用swap分区,需要修改文件/etc/fstab中的swap行,添加记录。

dd if=/dev/zero of=/data/swap bs=1M count=4096
mkswap /data/swap
swapon /data/swap
/data/swap swap swap defaults 0 0

centos7 firewall设置

原文:https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Using_Firewalls.html#sec-Introduction_to_firewalld1

参考译文:http://blog.csdn.net/steveguoshao/article/details/45999645

查看运行状态

firewall-cmd --state

获取支持的区域列表

firewall-cmd --get-zones

查看区域开放端口:

firewall-cmd --zone=public --list-all

添加端口

firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=3306/tcp --permanent

重启服务

firewall-cmd --reload

mysql批量备份脚本

如何实现自动备份数据路里面所有业务表的功能:

#!/bin/bash
echo "Dump mysql databases..."

DB_USER=xxx
DB_PASSWORD=xxx

DB_LIST=$(echo "show databases;" | mysql -u${DB_USER} -p${DB_PASSWORD})
for db in ${DB_LIST}
do
  if [ $db != "Database" ] && [ $db != "mysql" ] &&
      [ $db != "phpmyadmin" ] && [ $db != "information_schema" ] &&
      [ $db != "performance_schema" ]; then
    echo "  backup "$db
    mysqldump -u${DB_USER} -p${DB_PASSWORD} $db > ./$db.sql
  fi
done