Ruby_send 通过电子邮件抓取的结果
Ruby_send the result of scraping through email
使用 Ruby,我的应用程序:
- 检查页面状态是否为 200
- 解析 PDF 文件
- 通过电子邮件发送抓取的结果
测试了代码的所有部分后,一切正常,除了一件事,发送的邮件不包含我的抓取结果;
问题是什么,是否与代码最后部分可能无法识别的变量@monscrape有关?
我的代码:
require 'open-uri'
require "net/http"
require 'rubygems'
require 'pdf/reader'
require 'mail'
options = { :address => "smtp.gmail.com",
:port => 587,
:domain => 'gmail.com',
:user_name => 'mail@gmail.com',
:password => 'pwd',
:authentication => 'plain',
:enable_starttls_auto => true
}
lien= "http://www.example.com"
url = URI.parse(lien)
req = Net::HTTP.new(url.host, url.port)
res = req.request_head(url.path)
if res.code == "200"
io = open('http://www.example.com')
reader = PDF::Reader.new(io)
reader.pages.each do |page|
res = page.text
@monscrape = res.scan(/text[\s\S]*text/)
end
Mail.defaults do
delivery_method :smtp, options
end
Mail.deliver do
to 'mail@hotmail.com'
from 'Author <mail@gmail.com>'
subject 'testing sendmail'
html_part do
content_type 'text/html; charset=UTF-8'
body '<h1>Please find below the scrape <%= @monscrape %></h1>'
end
end
else
puts "the link doenst work"
end
你不能使用
res = req.request_head(url.path)
当 url.path
returns ""
。 request_head
期望路径至少为 "/"
。这意味着您需要修复正在传递的 URL 以便它至少具有根路径“/”。
url = URI.parse('http://www.example.com')
url.path # => ""
req.request_head(url.path)
*** ArgumentError Exception: HTTP request path is empty
对比
url = URI.parse('http://www.example.com/')
url.path # => "/"
req.request_head(url.path)
#<Net::HTTPOK 200 OK readbody=true>
第二个问题是您试图阅读 不是 PDF 文件的 PDF 文件。 Example.com returns HTML,也就是文字。您不能使用:
io = open('http://www.example.com')
reader = PDF::Reader.new(io)
正在尝试 returns "PDF does not contain EOF marker"。
当您请求 URL 时,了解网站返回的 objects/resources 类型非常重要。您不能声明它们 willy-nilly 并期望代码可以毫无错误地接受它。
问题是 Mail.deliver
块是使用 instance_eval
求值的。因此,本地实例 @variables
对 Mail
块不可见。
所以 @monscrape
将永远是 nil
在 Mail.deliver
块内。
一种解决方案是改用本地 (non-instance) 变量:
monscrape = "test"
Mail.deliver do
...
body "<h1>Please find below the scrape #{monscrape}</h1>"
...
end
另请注意,Mail
不支持 ERB(!),因此您不能在正文中使用类似 <%= monscrape %>
的内容。您必须像使用带双引号 "
而不是单引号 '
.
的字符串扩展一样对待普通字符串
在此处查看更多讨论和选项:
Why can't the Mail block see my variable?
使用 Ruby,我的应用程序:
- 检查页面状态是否为 200
- 解析 PDF 文件
- 通过电子邮件发送抓取的结果
测试了代码的所有部分后,一切正常,除了一件事,发送的邮件不包含我的抓取结果;
问题是什么,是否与代码最后部分可能无法识别的变量@monscrape有关?
我的代码:
require 'open-uri'
require "net/http"
require 'rubygems'
require 'pdf/reader'
require 'mail'
options = { :address => "smtp.gmail.com",
:port => 587,
:domain => 'gmail.com',
:user_name => 'mail@gmail.com',
:password => 'pwd',
:authentication => 'plain',
:enable_starttls_auto => true
}
lien= "http://www.example.com"
url = URI.parse(lien)
req = Net::HTTP.new(url.host, url.port)
res = req.request_head(url.path)
if res.code == "200"
io = open('http://www.example.com')
reader = PDF::Reader.new(io)
reader.pages.each do |page|
res = page.text
@monscrape = res.scan(/text[\s\S]*text/)
end
Mail.defaults do
delivery_method :smtp, options
end
Mail.deliver do
to 'mail@hotmail.com'
from 'Author <mail@gmail.com>'
subject 'testing sendmail'
html_part do
content_type 'text/html; charset=UTF-8'
body '<h1>Please find below the scrape <%= @monscrape %></h1>'
end
end
else
puts "the link doenst work"
end
你不能使用
res = req.request_head(url.path)
当 url.path
returns ""
。 request_head
期望路径至少为 "/"
。这意味着您需要修复正在传递的 URL 以便它至少具有根路径“/”。
url = URI.parse('http://www.example.com')
url.path # => ""
req.request_head(url.path)
*** ArgumentError Exception: HTTP request path is empty
对比
url = URI.parse('http://www.example.com/')
url.path # => "/"
req.request_head(url.path)
#<Net::HTTPOK 200 OK readbody=true>
第二个问题是您试图阅读 不是 PDF 文件的 PDF 文件。 Example.com returns HTML,也就是文字。您不能使用:
io = open('http://www.example.com')
reader = PDF::Reader.new(io)
正在尝试 returns "PDF does not contain EOF marker"。
当您请求 URL 时,了解网站返回的 objects/resources 类型非常重要。您不能声明它们 willy-nilly 并期望代码可以毫无错误地接受它。
问题是 Mail.deliver
块是使用 instance_eval
求值的。因此,本地实例 @variables
对 Mail
块不可见。
所以 @monscrape
将永远是 nil
在 Mail.deliver
块内。
一种解决方案是改用本地 (non-instance) 变量:
monscrape = "test"
Mail.deliver do
...
body "<h1>Please find below the scrape #{monscrape}</h1>"
...
end
另请注意,Mail
不支持 ERB(!),因此您不能在正文中使用类似 <%= monscrape %>
的内容。您必须像使用带双引号 "
而不是单引号 '
.
在此处查看更多讨论和选项:
Why can't the Mail block see my variable?