Help with emailing attachments with Ruby...

Discussion in 'Ruby' started by grooveska, Jun 1, 2007.

  1. grooveska

    grooveska Guest

    I am working on a script that will send an email with a .csv file
    attachment. I can get everything set correctly, and the email gets
    sent properly. The problem is with the attachments. This maybe a MIME
    thing instead of something wrong with my script. My script is based
    on an example from Hal Fulton's The Ruby Way book. If anyone has any
    suggestions or see something I did wrong I would greatly appreciate
    it. Below is my script. Below that is what the email I receive looks
    like.

    Thanks!

    ***Begin Script***

    require 'time'
    require 'net/smtp'
    require 'date'

    ##################################################################
    # This portion of the code assembles the filenames of the files #
    # to be attached in the email #
    ##################################################################

    time = Time.now #set time object to the current time
    month = time.month #grab the number of the month from the
    current time
    day = time.day #grab the day of the current time
    year = time.year #grab the year of the current time

    month = month + 1 #to match the format of Ian's file names

    if month < 10 #formatting
    fullmonth = "0" + month.to_s
    else
    fullmonth = month.to_s
    end

    if day < 10
    fullday = "0" + day.to_s
    else
    fullday = day.to_s
    end #end of formatting

    filename1 = "pagecount-" + year.to_s + fullmonth + fullday + ".csv"
    #assemble file name

    #####################################
    # Attach files and send the email #
    ####################################

    def text_plus_attachment (subject, body, filename)
    marker = "MIME_boundary"
    middle = "--#{marker}\n"
    ending = "--#{middle}--\n"
    content = "Content-Type: Multipart/Related; " + "boundary=#{marker};
    " + "typw=text/plain"
    head1 = <<-EOF
    MIME-Version: 1.0
    #{content}
    Subject: #{subject}
    EOF
    binary = File.read(filename)
    encoded = [binary].pack("m") # base64 econding
    head2 = <<-EOF
    Content-Description: "#{filename}"
    Content-Type: text/plain; name="#{filename}"
    Content-Transfer-Encoding: Binary
    Content-Disposition: attachment; filename="#{filename}"

    EOF

    #Return

    head1 + middle + body + middle + head2 + encoded + ending

    end

    body = <<EOF
    The GFIFax Monthly report is attached.
    EOF

    mailtext = text_plus_attachment("Monthly Report", body,
    filename1)

    Net::SMTP.enable_tls(OpenSSL::SSL::VERIFY_NONE)
    Net::SMTP.start('smtp.xxx.xxx', '25', 'xxx.xxx', '',
    'xxx', :plain) do |smtp|
    smtp.sendmail(mailtext, '', [''])
    end

    ***End Script***

    ***Begin Email results*** (This is all in the body of the email
    instead of in the headers)

    MIME-Version: 1.0
    Content-Type: Multipart/Related; boundary=MIME_boundary; typw=text/
    plain
    Subject: GFIFax Service Monthly Report --MIME_boundary The GFIFax
    Monthly report is attached.
    --MIME_boundary
    Content-Description: "pagecount-20070631.csv"
    Content-Type: text/plain; name="pagecount-20070631.csv"
    Content-Transfer-Encoding: Uencode
    Content-Disposition: attachment; filename="pagecount-20070631.csv"

    M4V5N="!&87AE<RPL+`I5<V5R240L(%!A9V5S(%-E;G0L($QI;6ET+"!/=F5R
    M86=E"C4W,S(P,C(Q,30L,BPU,"PP"C4W,S(P,C(Q,34L-"PU,"PP"C4W,S,T
    M,3<X-#8L,2PU,"PP"@H*4F5C96EV960@1F%X97,L+"P*57-E<DE$+%!A9V5S
    M(%)E8V5I=F5D+"!,:6UI="P@3W9E<F%G90HU-S,S-#$V,C,S+#$R+#$P,"PP
    M"C4W,S(P,C(Q,30L,RPQ,#`L,`HU-S,S-#$T.#@Y+#(Q.2PQ,#`L,3$Y"C4W
    M,S,T,38R-S$...@L.3DY.2PP"C4W,S(P,C(S.3(L,C`U+#DY.3DL,`HU-S,R
    E,#(R,SDW+#4T+#DY.3DL,`HU-S,R,#(R,SDV+#$Q+#$P,"PP"@``
    ----MIME_boundary
    --

    **End Email**'

    I hope someone can help me out!

    Thanks!
     
    grooveska, Jun 1, 2007
    #1
    1. Advertising

  2. On 6/1/07, grooveska <> wrote:
    > I am working on a script that will send an email with a .csv file
    > attachment. I can get everything set correctly, and the email gets
    > sent properly. The problem is with the attachments. This maybe a MIME
    > thing instead of something wrong with my script. My script is based
    > on an example from Hal Fulton's The Ruby Way book. If anyone has any
    > suggestions or see something I did wrong I would greatly appreciate
    > it.


    Hi, with ruport-util, that looks like this:

    require "rubygems"
    require "ruport"
    require "ruport/util"

    r = Ruport::Report.new

    r.add_mailer :default,
    :host => "mail.adelphia.net",
    :address => ""

    r.send_to("") do |mail|
    mail.subject = "Hello"
    mail.attach "foo.csv"
    mail.text = "This is an email with attached csv"
    end

    I understand if you want to lighten the dependency load, so you might
    just want to use the lib we wrap, MailFactory.
     
    Gregory Brown, Jun 7, 2007
    #2
    1. Advertising

  3. grooveska

    grooveska Guest

    That looks awesome. Nice and simple. I'm going to give that a try.

    Thanks!!

    On Jun 7, 2:48 pm, "Gregory Brown" <> wrote:
    > On 6/1/07, grooveska <> wrote:
    >
    > > I am working on a script that will send an email with a .csv file
    > > attachment. I can get everything set correctly, and the email gets
    > > sent properly. The problem is with the attachments. This maybe a MIME
    > > thing instead of something wrong with my script. My script is based
    > > on an example from Hal Fulton's The Ruby Way book. If anyone has any
    > > suggestions or see something I did wrong I would greatly appreciate
    > > it.

    >
    > Hi, with ruport-util, that looks like this:
    >
    > require "rubygems"
    > require "ruport"
    > require "ruport/util"
    >
    > r = Ruport::Report.new
    >
    > r.add_mailer :default,
    > :host => "mail.adelphia.net",
    > :address => ""
    >
    > r.send_to("") do |mail|
    > mail.subject = "Hello"
    > mail.attach "foo.csv"
    > mail.text = "This is an email with attached csv"
    > end
    >
    > I understand if you want to lighten the dependency load, so you might
    > just want to use the lib we wrap, MailFactory.
     
    grooveska, Jun 7, 2007
    #3
  4. On 6/7/07, grooveska <> wrote:
    > That looks awesome. Nice and simple. I'm going to give that a try.


    Cool. If you run into any troubles, feel free to catch us on the ruport list:
    http://list.rubyreports.org
     
    Gregory Brown, Jun 7, 2007
    #4
  5. grooveska

    grooveska Guest

    I ended up just using mailfactory that was included with ruport-util,
    and it worked great. I may work on reformatting the csv file know
    that I have found a great tool for that task. So for anyone looking
    for help with email attachments here is what worked for me:

    1. I had to get an updated copy of the smtp.rb file that included SSL/
    TLS support since our smtp server requires SSL/TLS. Found that here:

    http://www.koders.com/ruby/fid4B13D002144D0985D12CB47DA041D8E59E0E8667.aspx?s=cdef:smtp+server

    2. Then here is my script:

    require 'net/smtp'
    require 'rubygems'
    require 'mailfactory'
    require 'date'
    require 'time'

    ##################################################################
    # This portion of the code assembles the filenames of the files #
    # to be attached in the email #
    ##################################################################

    time = Time.now #set time object to the current time
    month = time.month #grab the number of the month from the
    current time
    day = time.day #grab the day of the current time
    year = time.year #grab the year of the current time

    month = month + 1 #to match the format of file names

    if month < 10 #formatting
    fullmonth = "0" + month.to_s
    else
    fullmonth = month.to_s
    end

    if day < 10
    fullday = "0" + day.to_s
    else
    fullday = day.to_s
    end #end of formatting

    filename = "pagecount-" + year.to_s + fullmonth + fullday + ".csv"
    #assemble file name
    filename1 = "send_report-" + year.to_s + fullmonth + fullday +
    ".csv" #assemble file name
    #
    #
    mail = MailFactory.new()
    mail.to = ""
    mail.from = "sendername <>"
    mail.subject = "Insert your subject line here"
    mail.text = "Insert the body of the email text here."
    mail.attach("pathtofile" + filename)
    mail.attach("pathtofile" + filename1)
    toaddress = ''
    fromaddress = ''
    #
    Net::SMTP.enable_tls(OpenSSL::SSL::VERIFY_NONE)
    Net::SMTP.start('smtp.xxx.xx', '25', 'domain_name', 'userid',
    'password', :plain) do |smtp|
    smtp.send_mail(mail.to_s(), fromaddress, toaddress)
    end



    Hopefully that will help some one out.








    On Jun 7, 4:34 pm, "Gregory Brown" <> wrote:
    > On 6/7/07, grooveska <> wrote:
    >
    > > That looks awesome. Nice and simple. I'm going to give that a try.

    >
    > Cool. If you run into any troubles, feel free to catch us on the ruport list:http://list.rubyreports.org
     
    grooveska, Jun 8, 2007
    #5
  6. On Jun 8, 5:05 pm, grooveska <> wrote:
    > I ended up just using mailfactory that was included with ruport-util,
    > and it worked great. I may work on reformatting the csv file know
    > that I have found a great tool for that task. So for anyone looking
    > for help with email attachments here is what worked for me:


    Yeah, MailFactory is a seriously under-praised lib that really works
    quite nicely.
     
    Gregory Brown, Jun 9, 2007
    #6
  7. grooveska

    Bill Guindon Guest

    On 6/8/07, Gregory Brown <> wrote:
    > On Jun 8, 5:05 pm, grooveska <> wrote:
    > > I ended up just using mailfactory that was included with ruport-util,
    > > and it worked great. I may work on reformatting the csv file know
    > > that I have found a great tool for that task. So for anyone looking
    > > for help with email attachments here is what worked for me:

    >
    > Yeah, MailFactory is a seriously under-praised lib that really works
    > quite nicely.


    That does raise the question... should it be it's own library?

    --
    Bill Guindon (aka aGorilla)
    The best answer to most questions is "it depends".
     
    Bill Guindon, Jun 9, 2007
    #7
  8. On 6/8/07, Bill Guindon <> wrote:

    > > Yeah, MailFactory is a seriously under-praised lib that really works
    > > quite nicely.

    >
    > That does raise the question... should it be it's own library?


    It is :)

    http://rubyforge.org/projects/mailfactory

    The wrapper in ruport-util is quite light, so unless you're using
    other functionality from us, you'll do just as well using MailFactory
    directly. The only thing we really abstract is the Net::SMTP call and
    add a barebones configuration system to it.

    I think the work is from David Powers, but I've never had a problem
    with the gem so I've never emailed him.
     
    Gregory Brown, Jun 9, 2007
    #8
  9. grooveska

    Bill Guindon Guest

    On 6/8/07, Gregory Brown <> wrote:
    > On 6/8/07, Bill Guindon <> wrote:
    >
    > > > Yeah, MailFactory is a seriously under-praised lib that really works
    > > > quite nicely.

    > >
    > > That does raise the question... should it be it's own library?

    >
    > It is :)
    >
    > http://rubyforge.org/projects/mailfactory


    Good to know. Thanks for the link.

    > The wrapper in ruport-util is quite light, so unless you're using
    > other functionality from us, you'll do just as well using MailFactory
    > directly. The only thing we really abstract is the Net::SMTP call and
    > add a barebones configuration system to it.
    >
    > I think the work is from David Powers, but I've never had a problem
    > with the gem so I've never emailed him.
    >
    >



    --
    Bill Guindon (aka aGorilla)
    The best answer to most questions is "it depends".
     
    Bill Guindon, Jun 9, 2007
    #9
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. =?Utf-8?B?U2FuZHk=?=

    Emailing from app - Help!

    =?Utf-8?B?U2FuZHk=?=, May 13, 2005, in forum: ASP .Net
    Replies:
    3
    Views:
    422
    =?Utf-8?B?U2FuZHk=?=
    May 13, 2005
  2. MW de Jager

    Emailing attachments

    MW de Jager, May 23, 2005, in forum: ASP .Net
    Replies:
    4
    Views:
    517
    MW de Jager
    May 24, 2005
  3. Bill

    SMTPlib Emailing Attachments

    Bill, Sep 17, 2003, in forum: Python
    Replies:
    9
    Views:
    804
    Rudy Schockaert
    Sep 20, 2003
  4. codewarrior
    Replies:
    0
    Views:
    544
    codewarrior
    May 4, 2009
  5. Peter Green
    Replies:
    0
    Views:
    652
    Peter Green
    Nov 5, 2009
Loading...

Share This Page