使用Postfix,Dovecot和Mysql配置邮件服务器

由于学习的需要,我要配置个本地邮件服务器.虽然找到了一篇很详细的资料,但是在配置过程中还是遇到了这样那样的问题. 写篇文章记下来自己的学习过程,毕竟好记性不如烂笔头嘛.

# 详细教程

Google 一下便找到了一个十分详细的教程,分享给大家:How To Configure a Mail Server Using Postfix, Dovecot, MySQL, and SpamAssasin (opens new window) 教程虽然很详细,但难免有不理解和差错的地方.下面就讲下我遇到的问题:

# Dovecot 证书问题

教程上设置的证书位置是:

ssl_cert = </etc/ssl/certs/dovecot.pem
ssl_key = </etc/ssl/private/dovecot.pem
1
2

但实际上是空的 需要手动 copy 过去,默认存储的位置是:

ssl_cert = /etc/dovecot/dovecot.pem
ssl_key = /etc/dovecot/private/dovecot.pem
1
2

# 查看日志发现读取配置出错

出错信息如下:

dovecot: lmtp(11504): Fatal: Error reading configuration: Invalid settings: postmaster_address setting not given
1

查到相关资料Invalid settings: postmaster_address setting not given (opens new window) 简单来说就是在/etc/dovecot/dovecot.conf文件内添加一行 postmaster_address=postmaster at DOMAIN 即可

# 重启 Dovecot

当我们执行 service dovecot restart 时,发现根本没有这个 service.
其实 dovecot 已经在运行了,我们只需执行 dovecot reload 即可

# 邮件无法发送

日志输出如下:

B0E4F26077E: to=<root@example.jp>, orig_to=<root>, relay=none, delay=6780, delays=6780/0/0.09/0, dsn=5.4.4, status=bounced (Host or domain name not found. Name service error for name=example.jp type=AAAA: Host not found)
1

这个问题是因为 Postfix 默认启用了 IPv6 并且优先级比 IPv4 要高,所以需要在配置文件 /etc/postfix/main.cf里面设置 inet_protocols = ipv4 这样就关闭 IPv6 了.即可解决问题.

大概就是遇到这么多问题了,最后祝愿大家圣诞节快乐~

扇贝单词助手发布

最近受菊苣binux (opens new window)的要求,希望能开发一款扇贝网的单词助手 (opens new window),可以标记任意页面上已经背过的单词.项目源码在Github (opens new window). 然后我就趁着国庆就开坑了,binux 也给了我很多参考资料.因为之前也开发过 Chrome 的扩展,所以对 Chrome 提供的 API 比较熟悉.这里就介绍下使用的相关的 JavaScript 的知识吧~

# Promise

Promise 是用来处理大量的异步操作,因为异步操作不能直接 return 返回值,必须进行回调.所以就会导致很多异步操作在一起不断的进行嵌套,这样实在是很不优雅的代码书写方式.代码首先是用来给人读的,其次才是可以运行.使用 Promise 就可以把多个异步操作的返回值以数组的形式返回来,然后再进行回调.语言描述不好,还是上例子吧.

function get_cookie(site, name) {
  return new Promise(function(resolve, reject) {
    chrome.cookies.get({ url: site, name: name }, function(cookies) {
      if (cookies) {
        var data = cookies.name + '=' + cookies.value;
        resolve(data);
      } else {
        reject();
      }
    });
  });
}
1
2
3
4
5
6
7
8
9
10
11
12

Chrome 的 API 全部是异步操作,所以我一开始使用 return 的时候并没有得到值.把回调函数封装到一个 Promise 对象里面,然后传入两个参数 resolve,reject 分别代表异步操作成功执行或失败需要调用的函数.

var site1 = 'http://pan.baidu.com/';
var name1 = 'BDUSS';
var site2 = 'http://pcs.baidu.com/';
var name2 = 'pcsett';
Promise.all([get_cookie(site1, name1), get_cookie(site2, name2)]).then(
  function(value) {
    console.log(value);
  },
  function() {}
);
1
2
3
4
5
6
7
8
9
10

这里我们需要调用两次异步操作,一般情况的话需要函数嵌套,但是使用 Promise 对象的话,只需要在 then 里面需要写上 resolve 和 reject 需要的执行函数, 传入的 value 就是两次异步操作的返回值数组.然后就可以进行相关的处理.代码就变得清晰有条理.

# 参考

Promise 文档 (opens new window)

Promise.all (opens new window)

Archlinux折腾笔记

四月也算过去了一大半了,经过了一个月的奔波与折腾,总算安顿好自己了.在学校本地找了一个还算不错的实习. 阴差阳错的选择了 Web 开发工程师的职位,其实我最想做的是后端开发,前端也还是比较喜欢的.但是我有个很大的 缺点就是不会设计... 不会设计的前端开发工程师很鸡肋的,每次网站开发都是同学出设计图我来做的.这样不行的, 我必须能独当一面才算能在公司站得住脚.

近况就是这些,接下来就是记录下自己在 Archlinux 下折腾的东西.方便自己以后查询使用.

# Linux 下视频截图制作动态 GIF

观看视频遇到经典的镜头当然得录下来做成 GIF~ 首先需要安装 imagemagick 这个软件包才行

mplayer -vo png -ss 00:08:28 -frames 200 123.mp4
mogrify -resize 848x480 *.png
convert -delay 4  *.png ry.gif
1
2
3

第一句话是利用 mplayer 输出 png 格式图片,从 8 分 28 秒开始,截图 200 帧,也可以换成

mplayer -vo png:z=1 -ss 00:08:28 -endpos 8  123.mp4
1

这样就是截取 8 秒,png 后面的 z=1 是压缩比例从 0 到 9 压缩程度递增,压缩速度也递增. 第二行便是修改尺寸,毕竟 720p 的 GIF 实在是吃不消啊.然后第三行变把这些 png 生成 GIF 了.

# sudo 设置环境变量

有时候程序需要使用 root 权限,但当我使用 sudo 的时候结果发现这时候程序又使用 root 用户的配置文件了.
现在的需求就是程序使用 root 权限运行但是执行时候读取 HOME 变量还是当前用户.
Run_X11_apps_using_sudo (opens new window) wiki 上有清楚的讲解这样的解决办法.