Execute commands within SMTP email code: send content in variables and not actual variables

I am trying to send an email using the code below. I am able to send the
email but I need the code to do the following:

*in the body of the email I need the content of Document.txt which is
stored in "ms". Right now in the body of the email I send there is "ms"
and not the content in "ms".

*Also in the subject I want to be able have the values of the variables
t and y. At the moment the subject of the email sent has t and y and not
the values.

Please let me know if I am not clear on what I am trying to achieve and
I will try my best to make it clear.

#!/usr/bin/env ruby

require 'net/smtp'

   File.open("/home/path/Document.txt","r") do |file|
   ms=file

     File.open 'email2.txt' do |file|
     y= file.find { |line| line =~ /San/ }
     t=y.scan /San: (\w+)/i

     x= file.find { |line| line =~ /verity/ }
     s=x.scan /verity: (\d+)/i

msgstr = <<EOF

···

From: m@example.com
To: d@example.com
Subject: t,y

ms

EOF

Net::SMTP.start('serverIP', portnumber) do |smtp|
    smtp.send_message msgstr,
                 'm@example.com',
                 'd@example.com'

end

--
Posted via http://www.ruby-forum.com/.

I was able to print the values of the variables t and s

Subject t,s

by using #{t},#{s}

I am not able to print the value of ms yet.

Please let me know if you have ideas.

···

--
Posted via http://www.ruby-forum.com/.

I am trying to send an email using the code below. I am able to send the
email but I need the code to do the following:

*in the body of the email I need the content of Document.txt which is
stored in "ms". Right now in the body of the email I send there is "ms"
and not the content in "ms".

*Also in the subject I want to be able have the values of the variables
t and y. At the moment the subject of the email sent has t and y and not
the values.

That's only basic string handling. As Douglas already pointed out,
you should have a look at string interpolation.

Assuming your files are not very big, you might want to avoid working
with file handles and nested blocks for now and just read the complete
files into variables, e.g. with File.read:

   content = File.read('/path/Document.txt')

Generally, you should use better variable names than `y', `t' and
the likes, which would improve readability a lot (same is true for
using correct indentation).

For a clearer structure: first, read all the necessary information
from the files and prepare the different parts of the message,
storing them in `from', `subject', `title', `body', ... variables.

Then, send the message.

BTW: I like the `pony' gem better than `net/smtp' for sending mail.
      It would look something like this:

require 'pony'

# set these only once
Pony.options = {
   :via => :smtp,
   :via_options => {
     :address => 'smtpserver',
     :port => '587'
   }
}

# do things...

# send an email
Pony.mail(
   :to => 'you@example.com',
   :from => 'me@example.com',
   :body => content
)

Regards,
Marcus

#!/usr/bin/env ruby

require 'net/smtp'

    File.open("/home/path/Document.txt","r") do |file|
    ms=file

      File.open 'email2.txt' do |file|
      y= file.find { |line| line =~ /San/ }
      t=y.scan /San: (\w+)/i

      x= file.find { |line| line =~ /verity/ }
      s=x.scan /verity: (\d+)/i

msgstr = <<EOF
From: m@example.com
To: d@example.com
Subject: t,y

ms

EOF

Net::SMTP.start('serverIP', portnumber) do |smtp|
     smtp.send_message msgstr,
                  'm@example.com',
                  'd@example.com'

end

You are missing some `end' keywords here, aren't you?

···

Am 10.07.2013 19:38, schrieb dJD col:

--
<https://github.com/stomar/&gt;

Just want to point out something quick:

  File.open("/home/path/Document.txt","r") do |file|
  ms=file

This does not read the contents of Document.txt. All it does is assign the file handle to the local variable ms. What you probably want at this point is:

  ms = file.read

However, as was previously pointed out, just doing

  ms = FIle.read("/home/path/Document.txt")

Is a lot simpler at this stage.

Further:

msgstr = <<EOF
...
ms

EOF

When you get to the ms in your message body, it's just a string at that point. As was pointed out. you need to interpolate it:

msgstr = <<EOF

#{ms}

EOF

The Pony gem was mentioned, I'm partial to the mail gem. Either is fine, but also learning to use the lower level std lib module is good too, for understanding. Pony and mail make things easier, but underneath they're using Net::SMTP as well.

···

On Jul 10, 2013, at 10:38 AM, dJD col <lists@ruby-forum.com> wrote:

i try to update nginx then i use the command apt-get update it show an
error
apt-get update
E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource
temporarily unavailable)
E: Unable to lock the list directory

···

--
Posted via http://www.ruby-forum.com/.

Interpolation is your answer. If #{t} and #{s} worked, then something
along similar lines ought to work as well. The only question is what
object is the variable ms pointing at? Looks like an open File handle, and
since the class File includes the IO module, maybe this will help you:

Good luck,
Doug

···

On Wed, Jul 10, 2013 at 2:19 PM, dJD col <lists@ruby-forum.com> wrote:

I was able to print the values of the variables t and s

Subject t,s

by using #{t},#{s}

I am not able to print the value of ms yet.

Please let me know if you have ideas.

--
Posted via http://www.ruby-forum.com/\.

You are missing some `end' keywords here, aren't you?

Thanks good info!! I appreciate. Yeah I have the 'end' Keywords on my
code...point noted on indentation. Will look at pony as well.

···

--
Posted via http://www.ruby-forum.com/\.

tamouse m. wrote in post #1115087:

When you get to the ms in your message body, it's just a string at that
point. As was pointed out. you need to interpolate it:

msgstr = <<EOF

#{ms}

EOF

The Pony gem was mentioned, I'm partial to the mail gem. Either is fine,
but also learning to use the lower level std lib module is good too, for
understanding. Pony and mail make things easier, but underneath they're
using Net::SMTP as well.

Thanks..interpolation now works because I am now reading the file!
thanks.

···

--
Posted via http://www.ruby-forum.com/\.

Douglas Seifert wrote in post #1115072:

Interpolation is your answer. If #{t} and #{s} worked, then something
along similar lines ought to work as well. The only question is what
object is the variable ms pointing at? Looks like an open File handle,
and
since the class File includes the IO module, maybe this will help you:

http://ruby-doc.org/core-1.9.3/IO.html

Good luck,
Doug

Thanks for the tip!!

···

--
Posted via http://www.ruby-forum.com/\.