5 votes

comment envoyer un graphique par courriel en Ruby sans l'enregistrer sur le disque ?

J'utilise Ruby script et la gemme "mail" pour envoyer des e-mails.

Question - Comment envoyer un graphique par e-mail en Ruby sans l'enregistrer sur le disque ? Est-ce possible ? Quel outil graphique recommanderiez-vous et la gemme "mail" supporterait-elle d'une manière ou d'une autre l'envoi en continu ? (Si c'est possible/facile, des exemples de lignes de code seraient les bienvenus.....

10voto

joelparkerhenderson Points 10128

Votre réponse complète.

Pour des raisons de simplicité, nous utilisons un graphique PNG en Ruby pur. Une application réelle utiliserait probablement le SVG, un code natif rapide ou une API graphique.

#!/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

5voto

Coren Points 3679

Je ne vois pas pourquoi tu ne pourrais pas. Sur documentation du courrier vous pouvez voir cet exemple de code :

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!

Il suffit de remplacer la cible de :content => ... avec le contenu de votre fichier en mémoire. Et cela devrait être suffisant. Il n'est pas vraiment nécessaire d'avoir des pièces jointes enregistrées, même temporairement, sur le disque puisqu'elles sont ré-encodées en base64 et ajoutées à la fin de votre courrier.

Pour la deuxième partie de votre question, il existe de nombreuses librairies de traçage/graphiques. Voir cette question o ce livre par exemple.

Il n'y a pas vraiment de librairie supérieure aux autres pour ce genre de questions. Il y a de nombreuses librairies pour de nombreux usages différents et vous devez choisir ce qui correspond le mieux à vos besoins et à vos contraintes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X