国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Ruby > 正文

Ruby實現郵件主動推送的觸發程序

2020-02-24 15:39:50
字體:
來源:轉載
供稿:網友

說到郵件,相信大家都非常的熟悉,不管是在工作中還是在日常生活中都是很常見的,別著急,今天跟著武林技術頻道小編帶大家來了解Ruby實現郵件主動推送的觸發程序吧!

1、客戶端輪詢
2、服務器主動推送。

首先熟悉一下,收發郵件的協議:
Net::SMTP(發送郵件)
Net::POP3(接收郵件)
Net::IMAP(接收郵件)

網上很多用pop3收郵件的例子,但是用pop3收郵件只能獲取收件箱里面所有郵件,郵件是否已讀等標記無法獲取,使用imap協議則避免了這個尷尬,imap不僅能獲得一個郵件的詳細信息(比如是否已讀,是否回復),它還允許用戶更改郵件的標記,但是目前支持imap協議的郵件服務器并不多,我知道的只有21cn和gmail,下面的例子中使用了代理 、SSL認證多個內容,請大家參考。

imap郵件,都是按需索取,也就是說,當你得到一個Message的對象時,其實里面什么信息都沒有,當你在這個對象里用get方法取得信息時,比如getSubject,那么Message對象會重新訪問郵件服務器來得到這個消息的 ,所以在得到所有所需信息之前,不可以關閉目錄,更不可以斷開連接。?如果實在想在關閉目錄或者連接后操作Message對象的話,需要使用Folder對象的fetch方法得到所需信息。

一:客戶端輪詢

下邊用pop3和imap顯示一下輪詢訪問獲取郵件的例子:

POP3輪詢:

復制代碼 代碼如下:

loop do
require 'net/pop'
pop = Net::POP3.new('EMAILSERVICE')
pop.start('USENAME', 'PASSWORD')???????????
if pop.mails.empty?
? puts 'No mail.'
else
? pop.each_mail do |m|
??? m.pop do |chunk|??
????? p chunk
??? end
? end
? puts "#{pop.mails.size} mails popped."
end
pop.finish
sleep(10)
end

?

imap輪詢:

?

復制代碼 代碼如下:

loop do
require 'net/imap'
imap = Net::IMAP.new('EMAILSERVICE')
imap.login "USERNAME", "PASSWORD"
imap.examine('INBOX')
imap.search(["BEFORE", "29-Oct-2014", "SINCE", "28-Oct-2014"]).each do |message_id|
?? envelope = imap.fetch(message_id, "ENVELOPE")[0].attr["ENVELOPE"]
?? puts "#{envelope.from[0].name}: /t#{envelope.subject}"
end
sleep(10)
end

?

二:服務器主動推送

下邊實現一種服務器主動推送方式:(IMAP.IDLE)

這是一種介于pull和Persistent TCP/IP之間的技術:long polling(長輪詢)。原理是客戶端每次對服務的請求都被服務端hold住,等到有message返回或time out之后,會再次主動發起請求,等待message的到達。這種模式不需要保持心跳,也不需要持續TCP的占用,比較適合頁面端及時消息的推送。

?

復制代碼 代碼如下:

SERVER = 'EMAILSERVICE'
USERNAME = 'USERNAME'
PW = 'PASSWORD'
require 'net/imap'

?

# Extend support for idle command. See online.
# http://www.ruby-forum.com/topic/50828
# https://gist.github.com/jem/2783772
# but that was wrong. see /opt/ruby-1.9.1-p243/lib/net/imap.rb.
class Net::IMAP
? def idle
??? cmd = "IDLE"
??? synchronize do
????? @idle_tag = generate_tag
????? put_string(@idle_tag + " " + cmd)
????? put_string(CRLF)
??? end
? end

? def say_done
??? cmd = "DONE"
??? synchronize do
????? put_string(cmd)
????? put_string(CRLF)
??? end
? end

? def await_done_confirmation
??? synchronize do
????? get_tagged_response(@idle_tag, nil)
????? puts 'just got confirmation'
??? end
? end
end

class Remailer
? attr_reader :imap

? public
? def initialize
??? @imap = nil
??? @mailer = nil
??? start_imap
? end

? def tidy
??? stop_imap
? end

? def print_pust
?????? envelope = @imap.fetch(-1, "ENVELOPE")[0].attr["ENVELOPE"]
?????? puts "From:#{envelope.from[0].name}/t Subject: #{envelope.subject}"
? end

? def bounce_idle
??? # Bounces the idle command.
??? @imap.say_done
??? @imap.await_done_confirmation
??? # Do a manual check, just in case things aren't working properly.
??? @imap.idle
? end

? private
? def start_imap
??? @imap = Net::IMAP.new('pop.i-click.com')
??? @imap.login USERNAME, PW
??? @imap.select 'INBOX'

??? # Add handler.
??? @imap.add_response_handler do |resp|
????? if resp.kind_of?(Net::IMAP::UntaggedResponse) and resp.name == "EXISTS"
??????? @imap.say_done
??????? Thread.new do
????????? @imap.await_done_confirmation
????????? print_pust
????????? @imap.idle
??????? end
????? end
??? end
??? @imap.idle
? end

? def stop_imap
??? @imap.done
? end

end

begin
? Net::IMAP.debug = true
? r = Remailer.new
? loop do
??? puts 'bouncing...'
??? r.bounce_idle
??? sleep 15*60
??? #一般設置15分鐘無操作保持長鏈接
? end
ensure
? r.tidy
end

以上就是我們為各位朋友們總結的Ruby實現郵件主動推送的觸發程序,各位朋友們對于上面的內容還算滿意嗎?

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 繁峙县| 平塘县| 宝坻区| 汨罗市| 澎湖县| 县级市| 明溪县| 景德镇市| 阿拉善盟| 淮北市| 宜兰县| 宜兴市| 微山县| 固始县| 永州市| 宁远县| 东台市| 西贡区| 柳州市| 石台县| 铁岭市| 同仁县| 长岛县| 南部县| 扬州市| 三明市| 赤壁市| 广元市| 高雄县| 玛多县| 施秉县| 澄迈县| 洛阳市| 武宁县| 剑川县| 什邡市| 板桥市| 兰坪| 武邑县| 理塘县| 绿春县|