<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>hjf_coding (HJF_coding)</title>
    <link>https://ruby-china.org/hjf_coding</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>如何调用 C 的动态库扩展</title>
      <description>&lt;p&gt;&lt;strong&gt;环境&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;linux  Centos 6.6
ruby 2.1.1
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="目标"&gt;目标&lt;/h2&gt;
&lt;p&gt;在 linux 环境下  通过 ruby 调用可执行文件、动态库 .so 文件&lt;/p&gt;
&lt;h2 id="安装gem"&gt;安装 gem&lt;/h2&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;gem &lt;span class="nb"&gt;install &lt;/span&gt;dl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一、ruby 调用可执行文件&lt;br&gt;
    1:做好的文件代码  如 test.c 文件  编译后的  test_ruby 需要赋予可执行文件权限   命令：&lt;code&gt;chmod 700 test_ruby&lt;/code&gt;&lt;br&gt;
    2:使用&lt;code&gt;system()&lt;/code&gt;函数调用 linux 命令   方式与在 shell 中使用是一样的&lt;/p&gt;

&lt;p&gt;&lt;em&gt;参考文件&lt;/em&gt;&lt;br&gt;
        &lt;a href="http://blog.csdn.net/renwotao2009/article/details/51892300" rel="nofollow" target="_blank"&gt;http://blog.csdn.net/renwotao2009/article/details/51892300&lt;/a&gt;&lt;br&gt;
        &lt;a href="http://www.jb51.net/article/59939.htm" rel="nofollow" target="_blank"&gt;http://www.jb51.net/article/59939.htm&lt;/a&gt;&lt;br&gt;
        &lt;a href="http://www.2cto.com/os/201309/246511.html" rel="nofollow" target="_blank"&gt;http://www.2cto.com/os/201309/246511.html&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;二、ruby 调用动态库文件 (关键要知道你要调用的动态库文件的功能  参数  就是要知道接口是什么)&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bash &lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; sum.c &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
double sum(double *arry, int len)
{
        double ret = 0;
        int i;
        for(i = 0; i &amp;lt; len; i++){
                ret = ret + arry[i];
        }
        return ret;
}
double split(double num)
{
        double ret = 0;
        ret = num / 2;
        return ret;
}
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;bash &lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; gcc &lt;span class="nt"&gt;-o&lt;/span&gt; libsum.so &lt;span class="nt"&gt;-shared&lt;/span&gt; sum.c
bash &lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; sum.rb &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
require 'dl'
require 'dl/import'
module LibSum
        extend DL::Importer
        dlload './libsum.so'
        extern 'double sum(double*, int)'
        extern 'double split(double)'
end
a = [2.0, 3.0, 4.0]
sum = LibSum.sum(a.pack("d*"), a.count)
p LibSum.split(sum)
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;bash &lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; ruby sum.rb &lt;span class="c"&gt;#=&amp;gt;4.5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;参考文件&lt;/em&gt;&lt;br&gt;
        &lt;a href="http://ju.outofmemory.cn/entry/142961" rel="nofollow" target="_blank"&gt;http://ju.outofmemory.cn/entry/142961&lt;/a&gt;&lt;br&gt;
        &lt;a href="http://www.kuqin.com/rubycndocument/" rel="nofollow" target="_blank"&gt;http://www.kuqin.com/rubycndocument/&lt;/a&gt;&lt;br&gt;
        &lt;a href="http://www.kuqin.com/rubycndocument/man/addlib/index.html" rel="nofollow" target="_blank"&gt;http://www.kuqin.com/rubycndocument/man/addlib/index.html&lt;/a&gt;&lt;br&gt;
        &lt;a href="http://www.kuqin.com/rubycndocument/man/addlib/dl.html" rel="nofollow" target="_blank"&gt;http://www.kuqin.com/rubycndocument/man/addlib/dl.html&lt;/a&gt;&lt;br&gt;
        &lt;a href="https://ruby-china.org/topics/20644" rel="nofollow" target="_blank"&gt;https://ruby-china.org/topics/20644&lt;/a&gt;&lt;br&gt;
        &lt;a href="https://ruby-china.org/topics/7728" rel="nofollow" target="_blank"&gt;https://ruby-china.org/topics/7728&lt;/a&gt;&lt;br&gt;
        &lt;a href="http://ruby-doc.org/stdlib-1.9.3/libdoc/dl/rdoc/DL.html#method-c-dlopen" rel="nofollow" target="_blank"&gt;http://ruby-doc.org/stdlib-1.9.3/libdoc/dl/rdoc/DL.html#method-c-dlopen&lt;/a&gt;  &lt;/p&gt;</description>
      <author>hjf_coding</author>
      <pubDate>Thu, 28 Feb 2019 16:01:54 +0800</pubDate>
      <link>https://ruby-china.org/topics/38168</link>
      <guid>https://ruby-china.org/topics/38168</guid>
    </item>
    <item>
      <title>说说多人协作遇到的坑</title>
      <description>&lt;h2 id="多人协作的坑（一）"&gt;多人协作的坑（一）&lt;/h2&gt;
&lt;p&gt;一个项目要想如期高效的完成 往往离不开多个人的协作，一旦涉及到多人协作，因为个人编码风格、水平的不同就会留下一些坑，这种情况如果在培训、和实施到位的情况下是可以避免的。下面就说说在遇到的坑和我的一些愚见。&lt;/p&gt;
&lt;h2 id="统一标准编码风格"&gt;统一标准编码风格&lt;/h2&gt;
&lt;p&gt;客观上来说，每个人的编码风格都不相同，怎么才能保证在同一个项目上代码的风格、可读性和质量呢？可行的办法就是由公司牵头做一个公司标准，强制大家学习、和使用。一个大牛必然有其特殊的风格 但是他们的风格可以帮助他们编写高质量、可读性好的代码。我认为这是一个 IT 从业者应该学习的。&lt;/p&gt;

&lt;p&gt;统一的标准、风格意味着你写的代码别人都知道这是按照上面方式进行编辑的，小到可以从这个变量的命名知道你这个变量是用来做什么的 生命周期大体在什么范围，大到知道这个你的代码功能模块是怎么划分的。这样就大大减少了交流、和维护成本。&lt;/p&gt;

&lt;p&gt;在项目上，从原则上来说自己开发的模块总是由自己来进行维护的，但是当你有急事的时候，代码也需要紧急维护，那么遵循标准编写的代码至少能让你找到你一个能帮你处理问题的人  否者就只能自己来处理。还有一种情况是，当你和别人模块交互的时候  要编写接口，没有一个统一的格式 你会频繁的询问别人  这个是什么意思，这个怎么没有反应。如果是这样，那么恭喜你 你一天可能会有一半的时间在处理这些问题，那么真正能解决问题的时间有多少，解决完问题之后还剩多少学习时间。这样下去你会讨厌这份工作，认为待下去迟早要废掉，但是如果你不遵循大家的标准，那么你离废掉就不远了。&lt;/p&gt;
&lt;h2 id="数据更新"&gt;数据更新&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;针对实例数据，不要直接调用系统提供的方法，数据的更新一定要通过别人提供的方法进行更新！&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;针对实例数据，不要直接调用系统提供的方法，数据的更新一定要通过别人提供的方法进行更新！&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;针对实例数据，不要直接调用系统提供的方法，数据的更新一定要通过别人提供的方法进行更新！&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;举个例子  在 rails 框架中 采用 MongoDB 数据库&lt;/p&gt;

&lt;p&gt;Mongoid 提供了很多的更细方法去更新数据库的数据&lt;/p&gt;

&lt;p&gt;A 模型更新 B 模型的数据但是  由于 A、B 模型分属不同的模块，由不同的人进行管理，这时候 在对 A 模型数据进行更新的时候采用 Mongoid 提供的方法 update_attributes 更新 B 模型的数据，好了  现在已经出现设计上的 bug 了   B 模型不是你管的  你怎么知道在更新 B 模型数据的时候有没有去更新其他模块的数据  你不知道对吧。&lt;/p&gt;

&lt;p&gt;为了解决这种因为要同步不同模块数据的问题  我们应该采用的是消息或者同步调用接口的方式去进行数据的更新。至于是采用消息的方式还是 接口的方式由具体的业务决定。考虑长期情况下 如果只有一个模块需要同步更新  没有理由去创建消息进行更新，虽然消息是个好东西，但是多了一层消息调用 就意味着出错的可能性多了一些。毕竟我们往往觉得别人写的代码是垃圾  手动滑稽&lt;/p&gt;</description>
      <author>hjf_coding</author>
      <pubDate>Fri, 20 Jul 2018 15:55:12 +0800</pubDate>
      <link>https://ruby-china.org/topics/37200</link>
      <guid>https://ruby-china.org/topics/37200</guid>
    </item>
    <item>
      <title>你所不知的 Sublime    编码不止 更新不止</title>
      <description>&lt;p&gt;声明：本文是针对 Sublime 3 而写&lt;/p&gt;
&lt;h2 id="Sublime text 基本介绍"&gt;Sublime text 基本介绍&lt;/h2&gt;
&lt;p&gt;Sublime Text 是一个代码编辑器（Sublime Text 2 是收费软件，但可以无限期试用），也是 HTML 和散文先进的文本编辑器。Sublime Text 是由程序员 Jon Skinner 于 2008 年 1 月份所开发出来，它最初被设计为一个具有丰富扩展功能的 Vim。&lt;/p&gt;

&lt;p&gt;Sublime Text 具有漂亮的用户界面和强大的功能，例如代码缩略图，Python 的插件，代码段等。还可自定义键绑定，菜单和工具栏。Sublime Text 的主要功能包括：拼写检查，书签，完整的 Python API，Goto 功能，即时项目切换，多选择，多窗口等等。Sublime Text 是一个跨平台的编辑器，同时支持 Windows、Linux、Mac OS X 等操作系统。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;引用：百度百科 - &lt;a href="https://baike.baidu.com/item/Sublime%20Text" rel="nofollow" target="_blank" title=""&gt;Sublime text&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="插件安装方法"&gt;插件安装方法&lt;/h2&gt;
&lt;p&gt;插件的安装方法现在我已知的有两种  一种是通过 package control 在线安装、一种是下载插件包 拖入插件目录  离线安装&lt;/p&gt;
&lt;h3 id="通过package control 在线安装"&gt;通过 package control 在线安装&lt;/h3&gt;
&lt;p&gt;这种插件安装的方法是先安装 package 再安装需要的插件  比如安装支持 ES6 和 React 语法高亮的 babel&lt;/p&gt;
&lt;h4 id="在线安装Pcakage Control"&gt;在线安装 Pcakage Control&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;按住 Ctrl + ` 弹出 console (注意热键冲突)&lt;/li&gt;
&lt;li&gt;输入下面代码运行
&lt;code&gt;
import urllib.request,os,hashlib; h = '6f4c264a24d933ce70df5dedcf1dcaee' + 'ebe013ee18cced0ef93d5f746d80ef60'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)
&lt;/code&gt;
&amp;gt; 引用：&lt;a href="https://packagecontrol.io/installation" rel="nofollow" target="_blank" title=""&gt;Package Control&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2017/154f66a8-2df7-463d-8f81-3a34641063f9.png!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="插件安装"&gt;插件安装&lt;/h2&gt;
&lt;p&gt;最近在学习 React  在使用 Sublime 的时候发现 不支持 jsx 和 ES6 语法高亮  于是想找一个插件来支持这两样语法，然后在网上找了一下 找到了 babel&lt;/p&gt;
&lt;h3 id="汉化安装"&gt;汉化安装&lt;/h3&gt;
&lt;p&gt;插件名：ChineseLocalization&lt;br&gt;
安装完之后在帮助菜单栏下 选择中文简体&lt;/p&gt;
&lt;h3 id="Babel"&gt;Babel&lt;/h3&gt;&lt;h4 id="安装"&gt;安装&lt;/h4&gt;
&lt;p&gt;package control -&amp;gt; install package -&amp;gt; babel&lt;/p&gt;
&lt;h4 id="插件配置"&gt;插件配置&lt;/h4&gt;
&lt;p&gt;该插件不需要配置  只需要在编辑 js、jsx 文件时选择 Babel 为解析语法就行&lt;/p&gt;
&lt;h5 id="使用前"&gt;使用前&lt;/h5&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2017/5e39cca2-6566-41df-963a-6cac4a6044e5.png!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h5 id="使用后"&gt;使用后&lt;/h5&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2017/9ae4375f-8ccc-41d3-a8d8-ebe0d642d308.png!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="Go环境"&gt;Go 环境&lt;/h3&gt;
&lt;p&gt;两种方式支持 go 环境  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;安装 go，并且添加 go 编译配置文件  工具=&amp;gt;编译系统=&amp;gt;新建编译系统  "go.sublime-build"&lt;/p&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"cmd"&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;"go.exe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"run"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"$file"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"C:/Go/bin"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"file_regex"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^[ ]*File &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;(...*?)&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;, line ([0-9]*)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"selector"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"source.go"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"encoding"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"utf-8"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;安装插件 gosublime &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="Python环境支持"&gt;Python 环境支持&lt;/h3&gt;
&lt;p&gt;安装 python，并且添加 go 编译配置文件  工具=&amp;gt;编译系统=&amp;gt;新建编译系统  "python3.sublime-build"&lt;/p&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"cmd"&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;"python.exe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"-u"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"$file"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"D:/Soft/Python/Python3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"file_regex"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^[ ]*File &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;(...*?)&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;, line ([0-9]*)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"selector"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"source.python"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"PYTHONIOENCODING"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"utf8"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意 若果不添加 &lt;code&gt;"env": { "PYTHONIOENCODING": "utf8" }&lt;/code&gt;控制台会输出中文乱码&lt;/p&gt;
&lt;h3 id="Sublime插件安装问题"&gt;Sublime 插件安装问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;没有可用于安装的软件包错误&lt;br&gt;
出现此错误可能是本地插件包控制器版本过低选择此插件更新一下插件就好目前遇到的就是这个情况&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>hjf_coding</author>
      <pubDate>Sat, 21 Oct 2017 22:08:43 +0800</pubDate>
      <link>https://ruby-china.org/topics/34416</link>
      <guid>https://ruby-china.org/topics/34416</guid>
    </item>
    <item>
      <title>Net::SMTP 的使用方法 和一些参数说明</title>
      <description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;首先我要说一下我是在阿里云上用 ruby 的 Net::SMTP 类发送邮件的。下面我把我在阿里云上遇到的坑说一下&lt;/p&gt;
&lt;h2 id="端口问题"&gt;端口问题&lt;/h2&gt;
&lt;p&gt;可能是为保护阿里云还是怎么的，阿里云限制使用 25 端口，于是刚开始的时候怎么发邮件都发不了。最后我发现除了 25 端口 还可以用一些邮件服务商提供的 587 端口发送邮件 例如：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;smtp.gamil.com(不推荐使用  速度很慢 连接不稳定)&lt;/li&gt;
&lt;li&gt;smtp.qq.com&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="Ruby  Net::SMTP基本介绍"&gt;Ruby  Net::SMTP 基本介绍&lt;/h2&gt;
&lt;p&gt;Net::SMTP 主要有 new、start 这两个方法   &lt;a href="http://ruby-doc.org/stdlib-2.0.0/libdoc/net/smtp/rdoc/Net/SMTP.html" rel="nofollow" target="_blank" title=""&gt;英文文档&lt;/a&gt;      &lt;a href="http://www.runoob.com/ruby/ruby-sending-email.html" rel="nofollow" target="_blank" title=""&gt;中文文档 (菜鸟教程)&lt;/a&gt; &lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Net&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;SMTP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;authtype&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="new方法"&gt;new 方法&lt;/h2&gt;
&lt;p&gt;new(address, port = nil)&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Net&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;SMTP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="start方法"&gt;start 方法&lt;/h2&gt;
&lt;p&gt;start(address, port = nil, domain= 'localhost', user = nil, secret = nil, authtype = nil)&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;msgstr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;END_OF_MESSAGE&lt;/span&gt;&lt;span class="sh"&gt;
From: Your Name &amp;lt;your@mail.address&amp;gt;
To: Destination Address &amp;lt;someone@example.com&amp;gt;
Subject: test message
Date: Sat, 23 Jun 2001 16:26:43 +0900
Message-Id: &amp;lt;unique.message.id.string@example.com&amp;gt;

This is a test message.
&lt;/span&gt;&lt;span class="no"&gt;END_OF_MESSAGE&lt;/span&gt;

&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'net/smtp'&lt;/span&gt;
&lt;span class="no"&gt;Net&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;SMTP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'your.smtp.server'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_message&lt;/span&gt; &lt;span class="n"&gt;msgstr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'from@address'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'to@address'&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="实例"&gt;实例&lt;/h2&gt;&lt;h3 id="测试端口开放情况"&gt;测试端口开放情况&lt;/h3&gt;
&lt;p&gt;在进行发送邮件之前先测试相应端口有没有开 使用 telnet 命令  阿里云 ECS 25 端口被禁  需要申请打开   其他相应端口需要在安全组中配置规则  即使端口打开了  也可能需要看一下有没有被防火墙给墙了。如果出现  Net::OpenTimeout 错误  那么多半是被墙了 或者端口根本没开  具体的的报错代码去看相应的 SMTP 的文档&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ telnet smtp.qq.com 587
$ telnet smtp.qq.com 25
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以 qq 邮箱为例&lt;/p&gt;
&lt;h3 id="获取qq邮箱SMTP客户端验证"&gt;获取 qq 邮箱 SMTP 客户端验证&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;img src="https://l.ruby-china.com/photo/2017/48623ffe-f86b-4a9f-a9b3-19e3a3795b3a.png!large" title="" alt=""&gt;&lt;/li&gt;
&lt;li&gt;&lt;img src="https://l.ruby-china.com/photo/2017/6c5d6165-f8d6-4967-a7ec-eb0d0472696a.png!large" title="" alt=""&gt;&lt;/li&gt;
&lt;li&gt;&lt;img src="https://l.ruby-china.com/photo/2017/16401e9c-55c1-4e12-8564-104e370be4fc.png!large" title="" alt=""&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;下面的对应位置的 secret 和 authtype 都是假的需要换成你们自己的 QQ 号和 QQ 邮箱 SMTP 客户端验证码 &lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"这是一个测试用例"&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'net/smtp'&lt;/span&gt;
&lt;span class="no"&gt;Net&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;SMTP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"smtp.qq.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;587&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"qq.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"QQ号"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"SMTP客户端验证码"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_message&lt;/span&gt; &lt;span class="n"&gt;msgstr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'from@address'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'to@address'&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>hjf_coding</author>
      <pubDate>Thu, 13 Apr 2017 01:41:17 +0800</pubDate>
      <link>https://ruby-china.org/topics/32768</link>
      <guid>https://ruby-china.org/topics/32768</guid>
    </item>
  </channel>
</rss>
