Ruby on rails 生成电子邮件地址图像或可以';不容易擦伤

Ruby on rails 生成电子邮件地址图像或可以';不容易擦伤,ruby-on-rails,ruby,email,ruby-on-rails-3,Ruby On Rails,Ruby,Email,Ruby On Rails 3,我正在为我的Rails项目寻找一个更好的文本到图像的解决方案,以取代当前的方法,即每次创建或更新新记录时使用ImageMagick生成png 我想防止大量的数据和滥用提供的电子邮件地址。我想知道是否有一个API来生成文本或使用javascript、SVG等,除了Flash以外的任何东西 我正在寻找比我目前的方法更好的解决方案: def create_new_email_image if email_changed? path_to_images = '/images/

我正在为我的Rails项目寻找一个更好的文本到图像的解决方案,以取代当前的方法,即每次创建或更新新记录时使用ImageMagick生成png

我想防止大量的数据和滥用提供的电子邮件地址。我想知道是否有一个API来生成文本或使用javascript、SVG等,除了Flash以外的任何东西

我正在寻找比我目前的方法更好的解决方案:

  def create_new_email_image

    if email_changed?

      path_to_images = '/images/emails'

      puts "Connecting to AWS..."
      config = YAML.load(File.open("#{RAILS_ROOT}/config/s3_credentials.yml"))[RAILS_ENV]
      AWS::S3::Base.establish_connection!(
        :access_key_id     => config['access_key_id'],
        :secret_access_key => config['secret_access_key']
      )

      puts "Finding S3 bucket..."
      begin
        bucket = AWS::S3::Bucket.find config['bucket_name']
      rescue AWS::S3::NoSuchBucket
        AWS::S3::Bucket.create config['bucket_name']
        bucket = AWS::S3::Bucket.find config['bucket_name']
      end

      images_path = "#{RAILS_ROOT}/tmp/"
      file_name = "#{id}.png"
      #file_name = "5056.png"
      file_path = images_path + "/"+ file_name

      File.delete file_path if File.exists? file_path

      img = Magick::Image.new(400, 22) { self.background_color = 'transparent' }
      img.format = 'PNG'

      text = Magick::Draw.new
      text.annotate(img, 0, 0, 1, 0, "#{email}") {
          self.gravity = Magick::WestGravity
          self.pointsize = 18
          self.fill = '#000000'
          self.kerning = -1
          self.font_weight = Magick::BoldWeight
          }

      img.write file_path

      if AWS::S3::S3Object.exists? file_name, bucket.name + path_to_images
        puts "file exists (deleting)"
        AWS::S3::S3Object.delete file_name, bucket.name + path_to_images, :force => true
      end

      AWS::S3::S3Object.store file_name, 
         File.open(file_path), 
         bucket.name + path_to_images, 
         :content_type => 'image/png',
         :access => :public_read,
         :reload => true

      `rm #{file_path}`
    end
  end
Rails提供了一个

mail\u to“me@domain.com"
# => 
邮寄至“me@domain.com“,”我的电子邮件“,:encode=>”javascript“
#=>eval(解码组件(“%64%6f%63…%27%29%3b”))
邮寄至“me@domain.com“,”我的电子邮件“,:encode=>”十六进制“
# => 
邮寄至“me@domain.com,nil,:replace_at=>,:replace_dot=>,:class=>“email”
# => 
邮寄至“me@domain.com“,”我的电子邮件“,:cc=>”ccaddress@domain.com",
:subject=>“这是一封示例电子邮件”
# => 

:encode=>“hex”
:encode=>“javascript”
选项就是您要查找的选项。

我也遇到了同样的问题。以下是我的解决方案:

def text_to_image(text,options={})
    return if text.blank?
    filename=get_text_file_path(text)
    unless File.exists?(filename)
      gc = Magick::Draw.new
      gc.fill = options[:color] unless options[:color].blank?
      gc.pointsize options[:size] unless options[:size].blank?
      gc.font=options[:font] unless options[:font].blank?
      gc.gravity = Magick::CenterGravity
      gc.text(0,0, text)
      metrics=gc.get_type_metrics(text)
      image = Magick::Image.new(metrics.width, metrics.height){
        self.background_color = 'transparent'
        }
      gc.draw(image)
      image.write(filename)
    end
  end

我在保存后使用
回调来更新电子邮件属性的图形缓存。

为什么要替换当前的工作解决方案?我当前的解决方案似乎有点过头了&我想也许有更好的方法。我一直在使用各种各样的Javascript编码电子邮件地址。使用Rail的助手随机交替使用不同的地址模糊处理方法,这将是一种很好的阻止刮取尝试的方法。
def text_to_image(text,options={})
    return if text.blank?
    filename=get_text_file_path(text)
    unless File.exists?(filename)
      gc = Magick::Draw.new
      gc.fill = options[:color] unless options[:color].blank?
      gc.pointsize options[:size] unless options[:size].blank?
      gc.font=options[:font] unless options[:font].blank?
      gc.gravity = Magick::CenterGravity
      gc.text(0,0, text)
      metrics=gc.get_type_metrics(text)
      image = Magick::Image.new(metrics.width, metrics.height){
        self.background_color = 'transparent'
        }
      gc.draw(image)
      image.write(filename)
    end
  end