2012-03-19 2 views
4

Я использую скрипт Ruby и почтовый ящик для отправки писем.Как отправить график по электронной почте в Ruby без сохранения на диск?

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

+0

Я думаю, что дополнительная информация была бы полезна. Что вы подразумеваете под «графиком» - вещь с узлами и ребрами, графическое представление некоторых функциональных данных, что-то совершенно другое? С каких данных вы начинаете? Почему сохранение на диске проблемы? – dantswain

+0

@ dantswain Re graph Я имел в виду что-то, что создает простой граф, например, гистограмму, в результате чего входной сигнал может быть хешем значений X, Y или что-то еще. В одном конкретном случае. Так выглядит что-то вроде графика http://www.germane-software.com/software/SVG/SVG%3A%3AGraph/. Библиотека SVG, на которую ссылается ссылка Corens ниже, выглядит отлично. – Greg

+0

Похоже, что ответ Корена на правильном пути. – dantswain

ответ

7

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

Для простоты используется чистый график 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, [email protected] 

    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 = '[email protected]' 
mail.from = '[email protected]' 
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

Не понимаю, почему вы не смогли. В mail's documentation, вы можете увидеть этот пример кода:

mail = Mail.new do 
    from  '[email protected]' 
    to  '[email protected]' 
    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 и добавлены в конце вашей почты.

Для второй части вашего вопроса есть много графических/графических библиотек. См., Например, this question или this lib.

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