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: [email protected]
To: [email protected]
Subject: t,y

ms

EOF

Net::SMTP.start(‘serverIP’, portnumber) do |smtp|
smtp.send_message msgstr,
[email protected]’,
[email protected]

end

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

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.

Am 10.07.2013 19:38, schrieb dJD col:

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 thannet/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 => ‘[email protected]’,
:from => ‘[email protected]’,
:body => content
)

Regards,
Marcus

EOF

Net::SMTP.start(‘serverIP’, portnumber) do |smtp|
smtp.send_message msgstr,
[email protected]’,
[email protected]

end

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

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

Just want to point out something quick:

On Jul 10, 2013, at 10:38 AM, dJD col [email protected] wrote:

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.

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.

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.

Douglas S. 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:

Class: IO (Ruby 1.9.3)

Good luck,
Doug

Thanks for the tip!!