设您有一个可以工作的 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小时内与您取得联系。