利用邮件发表octopress博客
看完这篇文章,我想大伙应该就可以实现通过email直接在octopress博客上进行发文。好处相当明显,你不可能永远带着你配置有octopress的电脑,只要手里有手机发邮件,就没有问题。真正做到anytime
anywhere.
写文章的初衷是,本网站是我和我太太
共同经营的博客。很多时候,她写好了文章,委托我发表时,苦于手中的工作windows电脑,发布相当不易。就开始设想有没有这么个功能,用email发布博客。答案是有。在和@lucifr交流后,发现@masukomi的方法很靠谱,可以使用,于是在不懂任何环境配置的情况下,瞎猫碰到死老鼠地运气和从windows 95
就开始养成的反复安装,反复测试的精神的鼓励下,开始了摸索。
这篇文章适用于在自己域名上布置的octopuses博客,只需rake generate
就能在nginx上完全反映出内容的变化。如果是用github的朋友,还需多加上rake deploy
和相应的git commit
。实际上从我之前所写的Octopress博客从零开始出发,到这篇文章为止,是可以做到零脑损建立octopress博客的。
和原来发布方式有个不同的地方是,原来的博文地址都是中文拼音,这次更给力,地址用上中文了。另外,在windows远程登录ssh设置时看到的都是乱码,实际上不影响的,换台mac,就没有问题。
jekymail配置
{% codeblock %}
git clone git://github.com/masukomi/JekyllMail.git /home/wwwroot/jekyllmail
cd /home/wwwroot/jekyllmail
rvm --default use 1.9.2
apt-get install libxslt-dev libxml2-dev
gem install nokogiri
bundle install
{% endcodeblock %}
进入jekyllmail文件夹,修改_config.yml
,具体内容如下:
{% codeblock %}
blogs:
- jekyll_repo: /home/wwwroot/blog #这是我服务器上布置的octopress博客文件夹
source_dir: /home/wwwroot/blog/source #这个文件夹下包括_posts, _includes等
pop_server: pop.gmail.com
pop_user: xxx #自定义的邮件接收地址(也就是xxx@gmail.com)
pop_password: yyy #自定义的邮件登录密码
secret: 123! #secret作用为让jekyllmail区别邮件是否为你想要发送的博文,自己设个吧
markup: markdown
site_url: http://colors4.us #这里是我的网址
commit_after_save: true
{% endcodeblock %}
邮件发送博文牵涉到两个邮件,发送的邮件和接收的邮件,jekyllmail会自己登录到接守的邮件上去检查是否有需要发送的博客。所以,我建议两个都用
gmail,确认设置中已经打开了pop3支持和utf-8发送。
是不是超级简单。我们现在可以测试一下是否有用。进入自己的gmail信箱给xxx@gmail.com
发新邮件,邮件题目subject
如下,更详细的情况可参考程序作者@masukomi的git页面:
{% codeblock %}
这里是博文的题目中文亦可 || secret: 123! / author: linpx / categories: test ok /comments: true #categories这里很特殊,各种目直接用空格隔开就行了,不要添逗号
{% endcodeblock %}
邮件的内容直接拷入已经写好的markdown格式的文章即可。我建议书写格式去除rich formatting
,改用plain text
(这是
gmail内置的功能)。然后点击发送。
{% codeblock jekyllmail folder %}
ruby jekyllmail.rb
{% endcodeblock %}
如果你能够在/home/wwwroot/blog/source/_posts
中看到你刚才发过去的邮件,那么你的jekymail配置就是成功了。(这
里我首次测试是不成功的,百思不得其解,后来发现发的测试邮件在第一时间被我另一个设好crontab的服务器给接走鸟。-_-!!!)
ubuntu下cron设置
很明显,要让博文自动发送,必须有自动机制,程序作者程序作者@masukomi
也建议用cron。cron是linux下的定时器,定时运行程序。我在这里的设置相当乱,因为我对cron不熟悉,能用的原因是我一个一个试出来的,笨方法,大家别学。
- cron在运行的时候,是不会采用我们已经有的环境的。所以很多情况下,我们直接运行ruby
xxx.rb可以,但是在cron下是不行的,因为没有定义rubi环境。这个很重要,我花了3个小时才捉摸出来。 - ubuntu下的cron设置很容易,在任何目录下运行
crontab -e
就行,存盘出来后应该就是已经放入到系统运行中去啦。 - cron的语法必须要了解,大家可以看看这个页面。
我直接给出我可以用的设置,修改文件夹位置后,引用即可。输入crontab -e
,加到最后一行。内容中涉及到gem
和rvw
的地址,用which gem
和which rvm
来确定。
{% codeblock %}
-
-
-
-
- /bin/echo check if cron works >> /home/wwwroot/1.log #此命令为每隔一分钟写入log文件,目的用于测试cron是否正常工作,确认后可直接删除。
*/5 * * * * cd /home/wwwroot/jekyllmail && ./run_jekyllmail.sh #每隔5分钟登录检查邮箱,是否有博文,强迫症轻度患者建议改为每一分钟。
- /bin/echo check if cron works >> /home/wwwroot/1.log #此命令为每隔一分钟写入log文件,目的用于测试cron是否正常工作,确认后可直接删除。
-
-
-
- */2 * * * cd /home/wwwroot/jekyllmail && ./build_site.sh #每隔2小时做一次rake generate
{% endcodeblock %}
cron运行时时不带环境的,所以我们必须在jekyllmail
下的两个文件run_jekyllmail.sh
和build_site.sh
定义环境。分别设定如下:
{% codeblock %}
!/bin/sh
[[ -s $HOME/.rvm/scripts/rvm ]] && source $HOME/.rvm/scripts/rvm # Load RVM into a shell session as a function
export LANG=en_US.UTF-8
export GEM_HOME=/usr/local/rvm/gems/ruby-1.9.2-p290
export GEM_PATH=/usr/local/rvm/gems/ruby-1.9.2-p290:/usr/local/rvm/gems/ruby-1.9.2-p290@global
export PATH=/usr/local/rvm/gems/ruby-1.9.2-p290/bin:/usr/local/rvm/gems/ruby-1.9.2-p290@global/bin:/usr/local/rvm/rubies/ruby-1.9.2-p290/bin:/usr/local/rvm/bin:$PATH #各机子环境有所不同,确认后代入
bundle exec ruby jekyllmail.rb
{% endcodeblock %}
以及
{% codeblock %}
!/bin/sh
[[ -s $HOME/.rvm/scripts/rvm ]] && source $HOME/.rvm/scripts/rvm # Load RVM into a shell session as a function
export LANG=en_US.UTF-8
export GEM_HOME=/usr/local/rvm/gems/ruby-1.9.2-p290
export GEM_PATH=/usr/local/rvm/gems/ruby-1.9.2-p290:/usr/local/rvm/gems/ruby-1.9.2-p290@global
export PATH=/usr/local/rvm/gems/ruby-1.9.2-p290/bin:/usr/local/rvm/gems/ruby-1.9.2-p290@global/bin:/usr/local/rvm/rubies/ruby-1.9.2-p290/bin:/usr/local/rvm/bin:$PATH
cd /home/wwwroot/blog/ #你的octopuses文件夹目录
bundle exec rake generate
{% endcodeblock %}
通过cron定时进行rake generate
必须补充一下,如果你的网页是放在github上,还需来个rake deploy
。
暂时结语
上述方法不是最优的,其实我希望可以做到@masukomi所写的Serving Octopress From a Self-hosted Git Repository
(中文版可参考@lucifr所写博客服务器端 Octopress 搭建及移动方案),文中的新博客文章放到特定文件夹后会主动触发rake generate
,在我看来,这远比用cron被动,反复rake来的即时和漂亮。我在做测试时,失败了,我会在以后继续跟进这个方向,有新的进展,肯定贴出。
如果对octopress这么多命令行没啥把握的话,不用怕。知难而上,做出来才爽啊。很多时候,在执行命令的时候,就直接给提示哪儿出错了。我们需要做得就是把错误信息google一下就行啦。因为出现的错误,肯定在别人处出现过,也肯定被解决过。而在寻找解决方法的过程,本身就是一种学习。另外,得有发散思维,一条程序线下来,出错了,有多种可能性,写下来,一个个设计试验来确定是否出错,排除。
博客整到现在还是很开心的。学到东西了,还能留下文字,如果帮助到大伙就更好了。这就是交流的好处吧。欢迎大伙在下面评论中留下各种问题,只要我知道的,会非常乐意互相沟通。