設您有一個可以工作的 Ruby 應用程序,并且需要向其添加電子郵件傳遞功能。這可能與用戶身份驗證或任何其他類型的事務性電子郵件有關,這沒有什么區別。本教程旨在幫助您實現使用 Ruby 發送電子郵件。
用 Ruby 發送電子郵件的選項
大多數情況下,你可以從三個選項中選擇一個。
最簡單的方法是使用 Net: : SMTP 類。它提供了通過 SMTP 發送電子郵件的功能。該選項的缺點是 Net: : SMTP 缺少撰寫電子郵件的功能。你可以自己創建,但這需要時間。
第二種選擇是使用專用的 Ruby gem,如 Mail、 Pony 或其他。這些解決方案使您能夠以簡單有效的方式處理電子郵件活動。Action Mailer 是一個完美的電子郵件解決方案,通過 Rails 的棱鏡。而且,很有可能,這將是你的選擇。
第三個選項是類 Socket。通常,這個類允許您設置流程之間或流程內部的通信。因此,電子郵件發送也可以用它來實現。然而,事實是 Socket 并沒有為您提供廣泛的功能,您也不太可能想要使用它。
現在,讓我們嘗試使用所描述的每個解決方案發送電子郵件。
如何通過 Net: : SMTP 在 Ruby 中發送電子郵件
根據我的經驗,在一個普通的 web 應用程序中使用這個選項是不常見的。但是,如果您在某些物聯網設備上使用 mruby (Ruby 語言的一種輕量級實現) ,那么通過 Net: : SMTP 發送電子郵件可能是合適的。此外,如果在無服務器計算中使用,例如 AWS Lambda,它也會這樣做。首先查看這個腳本示例,然后我們將詳細介紹它。
Ruby 露比
brrequire 'net/smtp'brmessage=<<END_OF_MESSAGEbrFrom: YourRubyApp <info@yourrubyapp.com>brTo: BestUserEver <your@bestuserever.com>brbrSubject: Any email subject you wantbrbrDate: Tue, 02 Jul 2019 15:00:34 +0800brbrLorem Ipsum
這是一個通過 SMTP 發送文本電子郵件的簡單示例(可以在這里找到官方文檔)。您可以看到四個標題: 發件人、收件人、主題和日期。請記住,您必須將它們與電子郵件正文中的空行分開。同樣重要的是連接到 SMTP 服務器。
Net::SMTP.start('your.smtp.server', 25) do |smtp|
Start (‘ your.smtp.server’,25) do | smtp |
自然,這里將顯示您的數據,而不是“ your.smtp.server”,并且25是默認端口號。如果需要,可以指定其他詳細信息,如用戶名、密碼或身份驗證方案(普通、登錄和 cram _ md5)。它可能看起來如下:
`Net::SMTP.start('your.smtp.server', 25, ‘localhost’, ‘username’, ‘password’ :plain) do |smtp|`
在這里,您將使用純文本格式的用戶名和密碼連接到 SMTP 服務器,客戶機的主機名將被標識為 localhost。
之后,可以使用 send _ message 方法并將發送方和接收方的地址指定為參數。
Start (‘ Net: : SMTP.start (‘ your.SMTP.server’,25) do | SMTP |’)的塊形式將自動關閉 SMTP 會話。
在 Ruby Cookbook 中,使用 Net: : SMTP 庫發送電子郵件被稱為極簡主義,因為您必須手動構建電子郵件字符串。盡管如此,這并不像你想象的那樣沒有希望。讓我們看看如何用 HTML 內容增強電子郵件,甚至添加附件。
在網上發送 HTML 電子郵件: : SMTP
查看這個引用消息部分的腳本示例。
Ruby
message=<<END_OF_MESSAGEbrFrom: YourRubyApp <info@yourrubyapp.com>brTo: BestUserEver <your@bestuserever.com>brMIME-Version: 1.0brContent-type: text/htmlbrbrSubject: Any email subject you wantbrbrDate: Tue, 02 Jul 2019 15:00:34 +0800brbrA bit of plain text.brbr<strong>The beginning of your HTML content.</strong>brbr<h1>And some headline, as well.</h1>brbrEND_OF_MESSAGE
除了消息體中的 HTML 標記之外,我們還有兩個額外的頭: MIME-Version 和 Content-type。MIME 指的是 MIME。它是 Internet 電子郵件協議的擴展,允許您在單個消息體中組合不同的內容類型。MIME-Version 的值通常為1.0。它指示消息是 MIME 格式的
至于 Content-type 頭,一切都很清楚。在我們的示例中,有兩種類型-HTML 和純文本。另外,確保使用定義的邊界分隔這些內容類型。
除了 MIME-Version 和 Content-type,您可以使用其他 MIME 頭:
內容-傳輸-編碼-表示二進制到文本的編碼方案(7位、 Quoted-printable、 base64、8位或二進制)。
在網上發送帶附件的電子郵件: : SMTP
- Content-Disposition-指定表示樣式(內聯或附件)
讓我們添加一個附件,例如 PDF 文件。在這種情況下,我們需要將 Content-type 更新為 multipart/mix。另外,使用 pack (“ m”)函數用 base64編碼對附加文件進行編碼。
Ruby
require 'net/smtp'brfilename="/tmp/Attachment.pdf"brfile_content=File.read(filename)brencoded_content=[file_content].pack("m") # base64brmarker="AUNIQUEMARKER"
之后,你需要定義你的電子郵件的三個部分。
第1部分-主要標題
part1=<<END_OF_MESSAGEbrFrom: YourRubyApp <info@yourrubyapp.com>brTo: BestUserEver <your@bestuserever.com>brSubject: Adding attachment to emailbrMIME-Version: 1.0brContent-Type: multipart/mixed; boundary=#{marker}br--#{marker}brEND_OF_MESSAGE
第2部分-消息行動
part2=<<END_OF_MESSAGEbrContent-Type: text/htmlbrContent-Transfer-Encoding:8bitbrA bit of plain text.br<strong>The beginning of your HTML content.</strong>br<h1>And some headline, as well.</h1>br--#{marker}brEND_OF_MESSAGE
第三部分-附件
part3=<<END_OF_MESSAGEbrContent-Type: multipart/mixed; name="#{filename}"brContent-Transfer-Encoding:base64brContent-Disposition: attachment; filename="#{filename}"br#{encoded_content}br--#{marker}--brEND_OF_MESSAGE
現在,我們可以把所有的部分放在一起,并最終確定劇本。這就是它看起來的樣子:
Ruby
brrequire 'net/smtp'brfilename="/tmp/Attachment.pdf"brfile_content=File.read(filename)brencoded_content=[file_content].pack("m") # base64brmarker="AUNIQUEMARKER"brpart1=<<END_OF_MESSAGEbrFrom: YourRubyApp <info@yourrubyapp.com>brTo: BestUserEver <your@bestuserever.com>brSubject: Adding attachment to emailbrMIME-Version: 1.0brContent-Type: multipart/mixed; boundary=#{marker}
我可以發送電子郵件給多個收件人在網絡: : SMTP?
當然,你可以. send _ message 期望第二個和隨后的參數包含收件人的電子郵件。例如:
Ruby
Net::SMTP.start('your.smtp.server', 25) do |smtp|br smtp.send_message message,br 'info@yourrubyapp.com',br 'your@bestuserever1.com',br ‘your@bestuserever2.com’,br ‘your@bestuserever3.combrend
發送電子郵件的最佳 Ruby Gems
在 Ruby 生態系統中,您可以找到特定的電子郵件 gems,它們可以改善您的電子郵件發送體驗。
Ruby Mail
該庫旨在提供一個單點訪問管理所有電子郵件相關活動,包括發送和接收電子郵件。
Pony
您可能聽說過一個關于用一個命令發送電子郵件的童話故事。抓緊你們的帽子,因為它是真的,由小馬寶石提供。
ActionMailer
這是最流行的寶石發送電子郵件在 Rails 上。如果你的應用程序寫在上面,ActionMailer 肯定會出現。它允許您使用郵件類和視圖發送電子郵件
使用郵件陷阱測試使用 Net: : SMTP 的電子郵件發送
設置非常簡單。進入演示收件箱后,復制 SMTP“設置”選項卡上的 SMTP 憑據并將其插入到代碼中。或者,您可以在 Integrations 部分獲得一個簡單消息的即用模板。只要選擇一種編程語言或框架,你的應用程序是建立。
Ruby
require 'net/smtp'brmessage=<<END_OF_MESSAGEbrFrom: YourRubyApp <info@yourrubyapp.com>brTo: BestUserEver <your@bestuserever.com>brSubject: Any email subject you wantbrDate: Tue, 02 Jul 2019 15:00:34 +0800brLorem IpsumbrEND_OF_MESSAGEbrbrNet::SMTP.start('smtp.mailtrap.io', 587, '<username>', '<password>', :cram_md5) do |smtp|br smtp.send_message message,
如果一切正常,您將在郵件陷阱演示收件箱中看到您的消息。此外,您可以嘗試檢查您的 HTML 內容和附件的電子郵件。
您剛剛閱讀了關于如何使用 Ruby 測試和發送電子郵件的完整教程。希望您喜歡!
PI
來源:快舔包我很肥
框架
WebAPI Contrib:幫助你提高 ASP.NET Web API 能力的開源項目集合。
應用框架(Application Frameworks)
應用模板(Application Templates)
人工智能(Artificial Intelligence)
程序集處理(Assembly Manipulation)
資源(Assets)
認證和授權(Authentication and Authorization)
自動構建(Build Automation)
緩存(Caching)
CLI
CLR
CMS
代碼分析和度量(Code Analysis and Metrics)
編譯器(Compiler)
壓縮(Compression)
持續集成(Continuous Integration)
加密(Cryptography)
數據庫(Database)
數據庫驅動(Database Drivers)
反編譯(Decompilation)
部署(Deployment)
DirectX
分布式計算(Distributed Computing)
文檔(Documentation)
電子商務和支付(E-Commerce and Payments)
環境管理(Environment Management)
ETL
游戲(Game)
地理信息系統(Gis)
Git工具(Git Tools)
圖形(Graphics)
GUI
HTML 和 CSS(HTML and CSS)
HTTP
IDE
圖像處理(Image Processing)
安裝工具(Install Tools)
國際化(Internationalization)
互操作(Interoperability)
IoC
日志(Logging)
機器學習和數據科學(Machine Learning and Data Science)
Markdown 處理(Markdown Processors)
郵件(Mail)
數學(Mathematics)
多媒體(Media)
度量(Metrics)
微框架(Micro Framework)
雜項(Misc)
MVVM
Office
ORM
包管理(Package Management)
Profiler
推送通知(Push Notifications)
隊列(Queue)
響應式編程(Reactive Programming)
計劃調度(Scheduling)
SDK 和 API 客戶端(SDK and API Clients)
搜索(Search)
序列化(Serialization)
狀態機(State machines)
靜態網站生成(Static Site Generators)
風格指南(Style Guide)
模板引擎(Template Engine)
測試(Testing)
交易(Trading)
Visual Studio 插件(Visual Studio Plugins)
Web 框架(Web Frameworks)
Web 服務器(Web Servers)
WebSocket
Windows 服務(Windows Services)
通訊框架(Communication Frameworks)
其他列表(Other Lists)
看完本文有收獲?請轉發分享給更多人!!!歡迎大家點贊,留言討論,喜歡這篇文章可以分享給更多人,關注我每天更新分享有關程序員、科技、編程之類的文章!!!愛你們,,么么噠,,讓我們一起愉快的玩耍把!!!
文共5560字,預計學習時長14分鐘
圖源:unsplash
在使用Ruby編寫web應用程序時,創始人David HeinemeierHansson說,他只不過是將以往應用程序的通用部分復制粘貼到新程序中。
包括他在內,所有程序員都喜歡解決難題。嘗試解決工作領域內獨有難題的唯一方法,是構建一個抽象層,并清除腦海中所有關于基礎web程序的細節。使用Rails可以專注解決困難部分,消減重復性工作。Rails命令十分神奇,但我們必須了解每個命令的功能和編寫過程。
Rails是什么?
Rails是一種web應用框架。根據模型-視圖-控制器(MVC)模式,它包括了創建數據庫支持的web應用程序時所需的所有內容。MVC將應用分為三層:模型、視圖和控制器,每一層都有特定任務。
模型-視圖-控制器(MVC)結構示意圖
模型層
模型層代表領域模型(如Account、Product、Person、Post等),概述應用程序中特有的業務邏輯。
在Rails中,數據庫支持的模型類源于 ActiveRecord::Base。Active Record支持用戶將數據庫行的數據表示為對象,并使用業務邏輯方法修飾這些數據對象。大多數Rails模型由數據庫支撐,模型也可以是Ruby普通類或實現由 Active Model模塊提供的一組接口的Ruby類。
控制層
控制層的功能在于處理傳入的HTTP請求以及給出適當響應。通常這一層意味著返回HTML,但Rails控制器還可以生成XML、JSON、PDF、移動專用視圖及其他格式。
控制器加載和操作模型,并呈現視圖模板,以便生成適當的HTTP響應。在Rails中,傳入要求由Action Dispatch發送至相應控制器,控制類來自 ActionController::Base。Action Dispatch和Action Controller一起綁定于Action Pack中。
圖源:unsplash
視圖層
視圖層由“模板”組成,主要負責提供應用程序資源的適當描述。模板可以有多種格式,但大多數視圖模板都是帶有內嵌Ruby代碼的HTML(ERB 文件)。視圖通常生成控制器響應,或生成電子郵件正文。在Rails中,視圖生成由Action View處理。
開發一款新型Rails應用
首先從頭構建一個應用程序,這步之前要確保系統內裝有Ruby、RubyGems和Bundler。打開終端導航到一個有權限創建文件的目錄。先要做的是安裝Rails并通過運行railsnew <project name>命令構建一個新型Rails應用程序。
要從頭開始創建只支持API的Rails,創建時--api應在Rails應用程序名稱之后:railsnew <my_app_name> --database=postgresql --api (使用Postgresql數據庫配置應用程序更為容易,但別忘了在運行命令前安裝這一數據庫)。例如:rails new Gallery --database=postgresql –api。
通過使用 --api 旗標,Rails能夠刪除許多默認功能和中間件(大多是涉及無用的瀏覽器)。控制器繼承ActionController::API而非ActionController::Base,生成器會跳過生成視圖。為只支持API的Rails構建設置資源無須作任何改變。
將所有所需gem添加至Gemfile中后開始運行bundle install。
· 初始化數據庫:rails db:create
· 運行Rails服務器:rails s
Rails生成
Rails團隊的首要目標是高效地構建核心應用程序功能。Rails系統擁有大量生成器,能幫助用戶完成一些手動作業。生成器除了節省時間,還有一些其他優點:
· 生成器能夠為應用程序測試套件設置基本規格。它們會為用戶提供一些基本例子而非編寫復雜的邏輯測試。
· 經設置,生成器的運行方式保持不變,這樣便能標準化代碼并幫助用戶更有效地開發,原因在于用戶不必過多擔心手寫代碼時可能會出現的拼寫、語法錯誤或其他相關漏洞。
· 生成器遵循Rails最佳操作,包括使用RESTful命名模式、刪除重復代碼、使用部分和許多其他最佳類型設計模式。
然而,某些生成器會創建相當多的代碼。如果不使用某個代碼,它就會造成應用程序代碼不必要的混亂,從而給以后的程序員帶來困擾。所以何時使用生成器最好呢?所有Rails生成器作為命令輸入終端,并遵循下列語法:
rails generate <name of generator> <options>--no-test-framework
--no-test-framework 是一個旗標,意在提醒生成器不要為新生成模型和控制器等創建任何測試。當用戶運行自己的Rails應用程序時則不需要旗標,這十分有助于快速建立測試套件。
為了提高效率,Rails將generate 方法簡化為g,因此上述CLI命令可以簡化為:
rails g <name of generator> <options>--no-test-framework
圖源:unsplash
下列是Rails提供的主要生成器。筆者將分別舉例說明:
遷移生成器
Rails有一組遵守規范的優質遷移生成器,能夠有效管理數據庫模式。繪制域模型后可以進行下一步。首先使用案例庫應用程序中的數據庫遷移并更新 painters 表。運用下列命令在表中添加一列,將其命名為portrait:
railsg migration add_portrait_to_painters portrait:string --no-test-framework
終端顯示創建了遷移文件20200928055457_add_portrait_to_painters.rb.。由于遷移文件名不得重復,生成器會在文件名前加上時間戳。神奇的事情發生了——打開db/migrat 目錄中創建的文件,它現在應該是這樣:
class AddPortraitToPainters < ActiveRecord::Migration[6.0]
def change
add_column :painters, :portrait,:string
end
end
注意到生成器的作用了嗎?它自動感知到用戶想添加一個新的列,構建了add_column 方法調用。這是如何做到的?
實踐證明,命名遷移文件的方法至關重要。通過在名稱前加上add_文本,它向遷移生成器發送了一個信號,即這種模式更改的目的是向表中添加一列/多列。
那么它是如何知道用戶想在哪個表上添加的呢?它將_painters 文本附加到遷移名稱的末尾,以此告訴Rails用戶想更改的表格是 painters 表。最后,通過在命令末尾添加 portrait:string 文本告知生成器新的列的名稱為portrait,數據類型為 string。
用戶可以通過運行rails db:migrate 更新數據庫模式,該模式也會反映出這次變更。
刪除列則可以運行另外一個遷移:
railsg migration remove_portrait_from_painters portrait:string
如果打開此遷移文件則會看到下列代碼:
class RemovePortraitToPainters < ActiveRecord::Migration[6.0]
def change
remove_column :painters, :portrait,:string
end
end
運行rails db:migrate 后,模式也會得到更新。當需要運行任何未決遷移時可以使用這一命令。
· railsdb:migrate:reset:它會刪除數據庫信息,在新的數據庫運行遷移并重新加載種子數據。
· railsdb:seed:將數據從文件:db/seeds.rb加載到數據庫中。這種方法對用Rails項目所需的初始數據填充數據庫十分有用。
· railsdb:rollback:回滾上次執行的遷移。它會撤銷上一次遷移,接著用戶便可編輯文件并重新運行 rails db:migrate 。注意,進行過程中謹慎使用這一命令,因為它極具破壞性,很有可能造成數據丟失。運行時一定確保自己完全清楚運行后的結果。
模型生成器
這是一種經常使用的生成器類型。它適用于編寫創建模型和關聯數據庫表所需的核心代碼,且不會使應用程序過于復雜。一般來說需要模型名稱(單數和首字母大寫)和模型參數。
接下來為帶有 name、bio和 genre列的Painter 應用程序添加一個新模型,可以通過以下CLI命令使用模型生成器:
railsg model Painter name:string genre:string bio:text
如果數據類型為字符串,則不需要在列名后指定類型,因為它是默認數據類型。因此如下:
railsg model Painter name genre bio:text
因其水平較高,這一步已經創建了:
· 添加一個表格和name、genre和 bio列的數據庫遷移
· 繼承ApplicationRecord (自Rails 5起)的模型文件
我們接下來創建另一個屬于Painter的模型Painting:
railsg model Painting name image painter:belongs_to
切記首先生成具有has_many宏命令的代碼;在運行遷移時只有帶有belongs_to 的代碼有用,否則會得到錯誤代碼:
ActiveRecord::StatementInvalid:PG::UndefinedTable: ERROR: relation "<some table name>" doesnot exist
運行這一生成器會創建出一個遷移文件和 Painter 和Painting模型。這一特定的生成器創建了一些具有單命令的不同的功能,且僅用最簡單的代碼就生成出來。接著轉向自己的模型,確保建立適當關系(has_many, belongs_to)。
下一步是創建一個遷移:rails db:create 和 rails db:migrate來遷移表格。用戶可以在控制臺中測試連接,只需要運行rails c并創建一些新的例子,不論正確與否都可以測試驗證;接下來測試關聯度(如Painter.all.first.painting能夠檢查第一個painter的painting)
圖源:unsplash
控制生成器
運行rails g controller 命令會提供一個控制文件(用于添加適當操作)和相應的視圖文件夾:
railsg controller paintings
資源生成器
如果用戶在在創建API過程中使用前端MVC架構,或只想手動創建視圖,resource生成器是編寫代碼的一個優選。創建Painting資源:
railsg resource Painting name image painter:belongs_to
因為沒有為name和image 編寫數據類型,因此默認情況下它是一個字符串。添加 painter:belongs_to 來指定兩個表格的關系,并在paintings表格中設置一列 painter_id。也可以使用 references編寫上述命令(結果一樣):
railsg resource Painting name image painter:references
這是為不同模型編寫相同命令的另一個例子:
railsg resource Answer content correct_answer:boolean question:belongs_to
憑借生成器,目前的應用程序擁有什么?
· 一個遷移文件,能夠在生成器中為傳遞給它的屬性創建一個新的數據庫表
· 繼承ApplicationRecord的模型文件(從Rails 5開始,見上述注意事項)
· 繼承了ApplicationController的控制器文件
· 不帶有視圖模板文件的視圖目錄
· 視圖helper文件
· 用于該控制器的特定JavaScripts的Coffeescript文件
· 用于控制器樣式的 scss文件
· routes.rb文件內的完整資源調用
resource生成器是一種智能生成器,創建全功能資源所需的一些核心功能,同時不會導致過多代碼膨脹。
路由
圖源:unsplash
最后一項可能不太常見。通常resources:paintings被視作為一個“魔法”路由,它包含在應用程序中執行CRUD所需的全部RESTful路由。那么resources:paintings會轉化成什么?用濾波器運行 rake routes 會比較簡單,這樣就只會呈現paintings的路由:
rake routes | grep painting
resources自動創建每個路由并使其對控制器可用。打開paintings_controller.rb文件會很有趣:路由列表中出現的操作都不存在。它創建的代碼非常少,只需添加應用程序需要的功能。
Scaffold生成器
rails g scaffold User username:string
正確的命令可以創建有用的文件,設置路由和宏命令。希望本文能讓你理解Rails的神奇之處,MVC的定義和命令執行。
留言點贊關注
我們一起分享AI學習與發展的干貨
如轉載,請后臺留言,遵守轉載規范
*請認真填寫需求信息,我們會在24小時內與您取得聯系。