1. 程式人生 > >ruby用來發送網際網路郵件

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直接下載到本地,用gem install -l openssl.gem安裝,發現require還是出錯,需要native ext:openssl.so動態庫擴充套件,進入openssl的ext原始碼目錄用make編譯提示出錯:Ignore OpenSSL broken by Apple

,提示我用其他的openssl庫路徑,我用毛啊!是不支援Mac OS X嗎?但是檢查了系統中是安裝過openssl的:

/private/etc/openssl

/private/etc/openssl/cert.pem

/usr/bin/openssl

/usr/lib/pkgconfig/openssl.pc

/usr/local/Cellar/openssl

動態庫也是存在的,但不是ruby 的c_ext!

[email protected]: ruby_src$locate libssl.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的問題(見我另一篇在mac OS X下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'

#Senders and Recipients
from_name = 'localhost'
from_mail = '[email protected]'
to_name = 'ks'
to_mail = '[email protected]'

#Servers and Authentication
#smtp_host   = 'smtp.qq.com'
smtp_host = 'smtp.163.com'
smtp_port   =  25 #465 587 25
#smtp_domain = 'qq.com'
smtp_domain  = 'localhost.localdomain'
smtp_user = "[email protected]"
smtp_pwd = "xxxxxxxx"
#smtp_user   = "[email protected]"
#smtp_pwd    = 'xxxxxxxx'

#The subject and the message
t = Time.now
subj = '1331 thinkpad test hopy'
msg_body = "send msg from ruby.\n"

#The date/time should look something like: Thu, 03 Jan 2006 12:33:22 -0700
msg_date = t.strftime("%a, %d %b %Y %H:%M:%S +0800")

#Compose the message for the email
#如果使用mailfactory傳送則實際用不著msg格式了
msg = <<END_OF_MESSAGE
Date: #{msg_date}
From: #{from_name} <#{from_mail}>
To: #{to_name} <#{to_mail}>
Subject: #{subj}

#{msg_body} 
END_OF_MESSAGE

mail = MailFactory.new
mail.to = to_mail
mail.from = from_mail
mail.subject = subj
mail.text = msg_body
mail.attach(File.expand_path("./mail.rb"))   #傳送附件

#smtp = Net::SMTP.new(smtp_host,587)
#smtp.enable_starttls
#Net::SMTP.start(smtp_host, smtp_port, smtp_domain, smtp_user, smtp_pwd, :plain) do |smtp|
Net::SMTP.start(smtp_host,smtp_port,smtp_domain, smtp_user, smtp_pwd, :login) do |smtp|  
  #smtp.send_message msg, smtp_user, to_mail
  #mail.to = to_mail
  #puts smtp.methods
  #smtp.enable_starttls
  smtp.send_message(mail.to_s,smtp_user,to_mail)
end 


    方法二:使用ruby gem:mail(未完待續)

mail是一個比較高階的郵件庫,包含了傳送附件的功能。不過下載下來本地安裝後開始報錯提示refuse port 25之類的錯誤。開始我以為是許可權不夠,用sudo執行後,發現在執行require 'mail'命令時又報錯!發現當初安裝時未以sudo許可權安裝,先gem uninstall mail.gem,然後重新安裝:sudo gem install mail.gem,此時在sudo和普通許可權下require 'mail'都正常鳥:

#!/usr/bin/ruby

require 'mail'

smtp = { :address => 'smtp.163.com', :port => 25, :domain => '163.com', \
	:user_name => '[email protected]', :password => 'xxxxxxxx',\
	:enable_starttls_auto => true, :openssl_verify_mode => 'none' }
Mail.defaults { delivery_method :smtp, smtp }
mail = Mail.new do
  from '[email protected]'
  to '[email protected]'
  subject 'test mail'
  body 'body:hello send mail way 2 :)'
  add_file File.expand_path("./mail2.rb")
end
mail.deliver!

有一個小問題,就是開始smtp中user_name和from裡設定的傳送郵件賬戶不一樣,導致老是傳送失敗,這裡都改成[email protected]就可以了。但在方法一中可以不一樣哦。還有2種方法中domain改成’localhost‘等其他值也能傳送成功,好像沒啥關係。

    最後要說的是,2種方法都是用的非加密的方式連線,即郵件伺服器允許非ssl方式連線,如果郵件伺服器只能加密連線上面程式碼就不能用。至於這時該如何寫程式碼,若知道的各位童鞋請不吝賜教哦。

相關推薦

ruby網際網路郵件

    其實只要你任性的可以,用telnet也是可以發郵件的哦。不過本貓沒那麼任性,還是用KISS原則來發郵件吧。本篇博文只介紹瞭如何發郵件,但沒涉及收郵件的事,以後如有機會會單獨開一篇博文介紹。     ruby通過smtp發郵件有2種操作手段,一是直接用Net::SMT

flask 電子郵件進階實踐-模板163郵件

接收 編寫 radi ren 電子 http 子郵件 **kwargs doctype 電子郵件進階實踐 下面來學習構建郵件的HTML正文,並使用模板組織內容。 一封電子郵件的正文可以是純文本(text/plain),也可以是HTML格式的文本(text/html)。處

Kettle郵件

1、整個作業圖: 2、郵件控制元件介紹: 位址列: 伺服器欄: 需要注意的是:驗證裡面的密碼是IMAP/SMTP的授權碼,需要到郵箱介面"設定"裡面去開啟"IMAP/SMTP服務"並且獲取授權碼。其他郵箱步驟也一樣。 SMTP伺服器以及埠號需要去查詢各個郵箱的本身的伺服器名稱和

Linux自動向指定郵件

mailLinux自動向指定用戶發送郵件 實現Linux向用戶發送指定主題和指定內容的郵件,可以用mailx軟件,mailx是UNIX系統上用來處理郵件的工具,使用它可以發送,讀取郵件。一、安裝mailx[[email protected] ~]# yun -y install mailx二、

iOS-打電話、短信、郵件【指定QQQQ消息】

ios 郵件內容 取消 bar 內容 tex 是否 ext else 1.發短信 頭文件 #import <MessageUI/MessageUI.h> 頭部代理 @interface ViewController ()<MFMessageCompo

在Exchange中刪除戶誤郵件

exchange刪除誤發送的郵件有時候員工會誤發送郵件,需要使用此命名去刪除1、Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E20102、get-mailbox -identity cary.qin | search-mailbox -Searc

qmail處理戶權限被盜用大量垃圾郵件

tex soft 分享圖片 郵件地址 www sans 頁面 image san 1、登錄https://www.spamhaus.org,查詢IP是不是在黑名單裏 點擊 Blocklist Removal Center 打開頁面後輸入IP 點擊 lookup 查詢

javaMail郵件

tin ref exception rec 文本 test utf-8 mail urn 電子郵件協議 SMTP是推協議,負責用戶代理向郵件服務器或郵件服務器與郵件服務器間發送郵件;POP3、IMAP是拉協議,負責用戶代理從郵件服務器讀取郵件。 如何寫一封郵件 javaM

zabbix配置通過遠端命令郵件

1.安裝好zabbix後,在/var/log/zabbix可以檢視日誌。 2.主機通過zabbix-get檢查  yum install zabbix-get -y zabbix-get  -s 客戶主機  -k  命令 比如檢視某個程序佔用的記憶體大

async/ await非同步

昨天看了一篇vue的教程,作者用async/ await來發送非同步請求,從服務端獲取資料,程式碼很簡潔,同時async/await 已經被標準化,是時候學習一下了。   先說一下async的用法,它作為一個關鍵字放到函式前面,用於表示函式是一個非同步函式,因為async就是非同步的意思, 非同步函式也就意

javaqq郵件

java.net 技術分享 div nal todo auto style not page 1.需要一個額外的jar::https://java.net/projects/javamail/pages/Home 下載javax.mail.jar包 2.對發送的賬號開啟S

java通過smtp電子郵件

instance 獲取 ins dma 使用html標簽 ssl cnblogs 使用 ack package com.sm.modules.oa.web; import javax.mail.Session; import javax.mail.Transport;

exchange 2010 郵件對方無法收到

exchange 2010 無法發送郵件大家好,有段時間沒有發博客了,實在抱歉。多余的話不多說了,言歸正傳。前2天有客戶遇到個了棘手的問題,向我求助。下面我把此問題及處理方法分享給大家,希望對大家有所幫助環境信息:exchange 2010 sp3(共2臺服務器:1臺CAS\HUB、1臺MBX),沒有高可用問

centos 7設置smtp163郵件

linux smtp mail 163查看系統是否存在mail命令[[email protected]/* */ ]# rpm -qa |grep mail[[email protected]/* */ ]# yum install -y mailx //沒有的話進行yum安裝編輯

JAVA一個XML格式的HTTP請求

response ops pri source methods mar 桌面 reader ase 1 import java.io.BufferedInputStream; 2 import java.io.BufferedReader; 3 imp

Centos 6.5 服務器下面配置郵件客戶端 報警郵件

postfix crontab 郵件報警 監控以Centos 系統為例,確保服務器可以正常連接外網Centos 6.5 下面默認 安裝 postfix查看rpm -qa | grep postfixpostfix-2.6.6-2.2.el6_1.x86_64配置郵件客戶端set [email pr

利用URLConnectionPOST和GET請求

出現異常 spa 一個 tle span new 發送 緩沖 all URL的openConnection()方法將返回一個URLConnection對象,該對象表示應用程序和 URL 之間的通信鏈接。程序可以通過URLConnection實例向該URL發送請求、讀取URL

利用a鏈接電子郵件

api mailto 題目 %20 標題 地址 tab 用戶 bsp 實例代碼: <a href="mailto:[email protected][email protected]&amp;subject=你好%20我是">發送

Exchange 2013 刪除誤郵件

limited 發送 ces import png nag lis images ges 在AD新建全局---安全組,並添加到相應的權限組 在ECP上新建角色組,填加角色mailbox import export,添加管理成員 刪除郵件之前先保存他的郵件到特定賬戶Searc

監控服務器ssh登錄,並報警郵件

賬戶 參數 相關 con import format Coding head time 最近想監控下雲主機的ssh登錄情況,所以開始寫ssh登錄報警監控。實現方式並不難。 一:郵箱申請開啟SMTP 在郵箱中選擇“設置”-----&