Ruby实现发送邮件的两个方法
其实只要你任性的可以,用telnet也是可以发邮件的哦。不过本猫没那么任性,还是用KISS原则来发邮件吧。本篇博文只介绍了如何发邮件,但没涉及收邮件的事,以后如有机会会单独开一篇博文介绍。
Ruby通过smtp发邮件有2种操作手段,一是直接用Net::SMTP来发送,比较底层。如果还要发送附件,则需要额外gem:mailfactory,而mailfactory又依赖于包mime-types。即便如此如果邮件服务器连接需要ssl,则还需要require文件smtp-tls.rb,而这个rb文件需要openssl包的支持啊!第二种方法是直接使用高层的gem包mail,包含添加附件的功能,不过该gem也依赖于mime-types包,这个包专门用来描述邮件文件格式的,俗称多用途互联网邮件扩展类型啊。下面依次介绍下每种方法。
方法一:使用Net::SMTP
正常的非加密连接的smtp端口号为25,如果是加密则可能为587或465,要看具体的邮件服务器的说明。开始用的是QQ的邮件服务器,但老是不稳定,遂换为hotmail的,但hotmail需要ssl连接。按上面所述需要openssl包。麻烦开始了:rubygems.org用gem死活连不上,后来将openssl.gem直接下载到本地,用geminstall-lopenssl.gem安装,发现require还是出错,需要nativeext:openssl.so动态库扩展,进入openssl的ext源代码目录用make编译提示出错:IgnoreOpenSSLbrokenbyApple,提示我用其他的openssl库路径,我用毛啊!是不支持MacOSX吗?但是检查了系统中是安装过openssl的:
/private/etc/openssl /private/etc/openssl/cert.pem /usr/bin/openssl /usr/lib/pkgconfig/openssl.pc /usr/local/Cellar/openssl
动态库也是存在的,但不是ruby的c_ext!
apple@kissAir:ruby_src$locatelibssl.dylib /Applications/Xcode6-Beta4.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/lib/libssl.dylib /Applications/Xcode6-Beta4.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/lib/libssl.dylib /opt/com.bitaxis/lib/libssl.dylib /opt/local/lib/libssl.dylib /usr/lib/libssl.dylib /usr/local/Cellar/openssl/1.0.1e/lib/libssl.dylib
神马情况?考虑到tk对ruby的问题(见我另一篇在macOSX下ruby使用tk的博文),我怀疑该ruby版本本身不支持原生openssl,这个版本是我在ruby-lang下载的ruby-2.1.5源代码编译并且安装的!遂用rvm下载了其ruby-2.1.5版本,一试竟然可以鸟!但随后发现hotmail.com的加密连接还是连不上,又换回QQ邮箱,用非加密的smtp,25端口连接。这回基本可以稳定发送了,如果换位163的邮箱测试发现更加稳定,上未重构的代码:
#!/usr/bin/ruby #encoding:utf-8
require'net/smtp' require'./smtp-tls.rb' require'mailfactory'
#SendersandRecipients from_name='localhost' from_mail='12345678@qq.com' to_name='ks' to_mail='88888888@qq.com'
#ServersandAuthentication #smtp_host ='smtp.qq.com' smtp_host='smtp.163.com' smtp_port = 25#46558725 #smtp_domain='qq.com' smtp_domain ='localhost.localdomain' smtp_user="wangyi@163.com" smtp_pwd="xxxxxxxx" #smtp_user ="12345678@qq.com" #smtp_pwd ='xxxxxxxx'
#Thesubjectandthemessage t=Time.now subj='1331thinkpadtesthopy' msg_body="sendmsgfromruby.\n"
#Thedate/timeshouldlooksomethinglike:Thu,03Jan200612:33:22-0700 msg_date=t.strftime("%a,%d%b%Y%H:%M:%S+0800")
#Composethemessagefortheemail