Ruby_send 通过电子邮件抓取的结果

Ruby_send the result of scraping through email

使用 Ruby,我的应用程序:

测试了代码的所有部分后,一切正常,除了一件事,发送的邮件不包含我的抓取结果;

问题是什么,是否与代码最后部分可能无法识别的变量@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 求值的。因此,本地实例 @variablesMail 块不可见。

所以 @monscrape 将永远是 nilMail.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?