Как отправить график по электронной почте в Ruby без сохранения на диск? - PullRequest
4 голосов
/ 20 марта 2012

Я использую скрипт Ruby и гем "mail" для отправки писем.

Вопрос - Как можно было отправить график по электронной почте в Ruby без сохранения на диск? Это возможно? Какой графический инструмент вы бы порекомендовали, и будет ли "почтовый" гем поддерживать как-то это? (или если это необходимо, вы должны сначала сохранить на диск) Если это возможно / просто, примеры кода должны быть хорошими ...

Ответы [ 2 ]

7 голосов
/ 24 марта 2012

Ваш полный ответ.

Для простоты используется чистый PNG-граф Ruby; реальное приложение, скорее всего, будет использовать SVG, или быстрый нативный код, или API графиков.

#!/usr/bin/env ruby
=begin

How to send a graph via email in Ruby without saving to disk
Example code by Joel Parker Henderson at SixArm, joel@sixarm.com

    http://stackoverflow.com/questions/9779565

You need two gems:

    gem install chunky_png
    gem install mail

Documentation:

    http://rdoc.info/gems/chunky_png/frames
    https://github.com/mikel/mail

=end


# Create a simple PNG image from scratch with an x-axis and y-axis.
# We use ChunkyPNG because it's pure Ruby and easy to write results;
# a real-world app would more likely use an SVG library or graph API.

require 'chunky_png'
png = ChunkyPNG::Image.new(100, 100, ChunkyPNG::Color::WHITE)
png.line(0, 50, 100, 50, ChunkyPNG::Color::BLACK)  # x-axis
png.line(50, 0, 50, 100, ChunkyPNG::Color::BLACK)  # y-axis

# We do IO to a String in memory, rather than to a File on disk.
# Ruby does this by using the StringIO class which akin to a stream.
# For more on using a string as a file in Ruby, see this blog post:
# http://macdevelopertips.com/ruby/using-a-string-as-a-file-in-ruby.html

io = StringIO.new
png.write(io) 
io.rewind

# Create a mail message using the Ruby mail gem as usual. 
# We create it item by item; you may prefer to create it in a block.

require 'mail'
mail = Mail.new
mail.to = 'alice@example.com'
mail.from = 'bob@example.com'
mail.subject = 'Hello World'

# Attach the PNG graph, set the correct mime type, and read from the StringIO

mail.attachments['graph.png'] = {
  :mime_type => 'image/png', 
  :content => io.read 
}

# Send mail as usual. We choose sendmail because it bypasses the OpenSSL error.
mail.delivery_method :sendmail
mail.deliver
5 голосов
/ 22 марта 2012

Я не понимаю, почему ты не мог.В почтовой документации вы можете увидеть этот пример кода:

mail = Mail.new do
  from     'me@test.lindsaar.net'
  to       'you@test.lindsaar.net'
  subject  'Here is the image you wanted'
  body     File.read('body.txt')
  add_file :filename => 'somefile.png', :content => File.read('/somefile.png')
end

mail.deliver!

Вам просто нужно заменить цель :content => ... содержимым файла в памяти.И этого должно быть достаточно.Нет никакой необходимости сохранять вложения, даже временно, на диск, поскольку они перекодируются в base64 и добавляются в конце вашего письма.

Во второй части вашего вопроса есть много сюжета / графика.там вокругСм. этот вопрос или эту библиотеку , например.

На самом деле не существует ни одной библиотеки над другими для такого рода вопросов.Существует множество библиотек для разных целей, и вам нужно выбрать то, что больше соответствует вашим потребностям и ограничениям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...