SMTPlib Emailing Attachments

Discussion in 'Python' started by Bill, Sep 17, 2003.

  1. Bill

    Bill Guest

    I am trying to have the capability to email attachments. Specifically
    I want to be able to email a specific attachment that I name that may
    be a PDF document, text doc, etc. I already have a working piece of
    code that emails jpg attachments but does not work with any other
    types of attachments. Could someone tell me how to modify this code to
    send other types of attachments like the one's stated above(especially
    PDF's)? Also how do I determine the name of the attachment? Right now
    it defaults to Attach0. Here is the current code I have below:
    _________________________________________________
    import sys, smtplib, MimeWriter, base64, StringIO

    message = StringIO.StringIO()
    writer = MimeWriter.MimeWriter(message)
    writer.addheader('Subject', 'The Text test')
    writer.startmultipartbody('mixed')

    # start off with a text/plain part
    part = writer.nextpart()
    body = part.startbody('text/plain')
    body.write('This is a picture of chess, enjoy :)')

    # now add an image part
    part = writer.nextpart()
    part.addheader('Content-Transfer-Encoding', 'base64')
    body = part.startbody('image/jpeg')
    #body = part.startbody('text/plain')
    base64.encode(open('c:\email\chess01.jpg', 'rb'), body)

    # finish off
    writer.lastpart()

    # send the mail
    smtp = smtplib.SMTP('fc.hbu.edu')
    smtp.sendmail('', '',
    message.getvalue())
    smtp.quit()
    __________________________________________________________________________
     
    Bill, Sep 17, 2003
    #1
    1. Advertising

  2. Bill wrote:
    > I am trying to have the capability to email attachments. Specifically
    > I want to be able to email a specific attachment that I name that may
    > be a PDF document, text doc, etc. I already have a working piece of
    > code that emails jpg attachments but does not work with any other
    > types of attachments. Could someone tell me how to modify this code to
    > send other types of attachments like the one's stated above(especially
    > PDF's)? Also how do I determine the name of the attachment? Right now
    > it defaults to Attach0. Here is the current code I have below:
    > _________________________________________________
    > import sys, smtplib, MimeWriter, base64, StringIO
    >
    > message = StringIO.StringIO()
    > writer = MimeWriter.MimeWriter(message)
    > writer.addheader('Subject', 'The Text test')
    > writer.startmultipartbody('mixed')
    >
    > # start off with a text/plain part
    > part = writer.nextpart()
    > body = part.startbody('text/plain')
    > body.write('This is a picture of chess, enjoy :)')
    >
    > # now add an image part
    > part = writer.nextpart()
    > part.addheader('Content-Transfer-Encoding', 'base64')
    > body = part.startbody('image/jpeg')
    > #body = part.startbody('text/plain')
    > base64.encode(open('c:\email\chess01.jpg', 'rb'), body)
    >
    > # finish off
    > writer.lastpart()
    >
    > # send the mail
    > smtp = smtplib.SMTP('fc.hbu.edu')
    > smtp.sendmail('', '',
    > message.getvalue())
    > smtp.quit()
    > __________________________________________________________________________


    Wouldn't it be a lot easier to use the email module?

    This is a snippet of how I send attachments (simply replace
    TO,FROM,Subect, path (full pathname including filename) and filename
    with relevant data):

    import smtplib
    import mimetypes
    from email.Encoders import encode_base64
    from email.MIMEAudio import MIMEAudio
    from email.MIMEBase import MIMEBase
    from email.MIMEImage import MIMEImage
    from email.MIMEMultipart import MIMEMultipart
    from email.MIMEText import MIMEText

    def getAttachment(path, filename):
    ctype, encoding = mimetypes.guess_type(path)
    if ctype is None or encoding is not None:
    ctype = 'application/octet-stream'
    maintype, subtype = ctype.split('/', 1)
    fp = open(path, 'rb')
    if maintype == 'text':
    attach = MIMEText(fp.read(),_subtype=subtype)
    elif maintype == 'message':
    attach = email.message_from_file(fp)
    elif maintype == 'image':
    attach = MIMEImage(fp.read(),_subtype=subtype)
    elif maintype == 'audio':
    attach = MIMEAudio(fp.read(),_subtype=subtype)
    else:
    print maintype, subtype
    attach = MIMEBase(maintype, subtype)
    attach.set_payload(fp.read())
    encode_base64(attach)
    fp.close
    attach.add_header('Content-Disposition', 'attachment',
    filename=filename)
    return attach


    msg = MIMEMultipart()
    msg['From'] = FROM
    msg['To'] = TO
    msg['Subject'] = SUBJECT
    attach = getAttachment(path, filename)
    msg.attach(attach)

    server = smtplib.SMTP(MAILSERVER)
    server.sendmail(FROM, [TO], msg.as_string())
    server.quit()
     
    Rudy Schockaert, Sep 17, 2003
    #2
    1. Advertising

  3. Bill

    Jochen Knuth Guest

    Hi Bill,

    Bill wrote:

    > I am trying to have the capability to email attachments. Specifically
    > I want to be able to email a specific attachment that I name that may
    > be a PDF document, text doc, etc. I already have a working piece of
    > code that emails jpg attachments but does not work with any other
    > types of attachments. Could someone tell me how to modify this code to
    > send other types of attachments like the one's stated above(especially
    > PDF's)?



    look at the email package (included since Python 2.2), documented at
    http://www.python.org/doc/current/lib/module-email.html , specific to
    MIME-Attachment is http://www.python.org/doc/current/lib/node501.html .

    Ciao,
    Jochen
    --
    --------------------------------------------------
    Jochen Knuth WebMaster http://www.ipro.de
    IPRO GmbH Phone ++49-7152-93330
    Steinbeisstr. 6 Fax ++49-7152-933340
    71229 Leonberg EMail:
     
    Jochen Knuth, Sep 17, 2003
    #3
  4. Bill

    Bill Guest

    Thanks for your response Rudy I think you put me on the right track.
    But when I ran your script I still got the following errors:
    ______________Errors_________________________________________________________
    Traceback (most recent call last):
    File "C:\Program Files\Python22\ImgAndText.py", line 41, in ?
    attach = getAttachment(path, filename)
    File "C:\Program Files\Python22\ImgAndText.py", line 15, in
    getAttachment
    fp = open(path, 'rb')
    IOError: [Errno 2] No such file or directory: 'C:\\Email\test.txt'
    _____________________________________________________________________________

    My question to you is what version of Python are you using (I am using
    2.2.2.)?
    Are you using the Windows version (I am using Windows)? If you are
    using the Windows version where do you have your Python folder located
    (Mine is c:\Program Files\Python22\) ? These are my system parameters.
    And here is the code that I used. It is exactly like your code but I
    changed the TO,FROM,Subect, path (full pathname including filename)
    and also the SMTP server like you suggested. Here it is posted below:
    ______________Code Snippet________________________________________________
    import smtplib
    import mimetypes
    from email.Encoders import encode_base64
    from email.MIMEAudio import MIMEAudio
    from email.MIMEBase import MIMEBase
    from email.MIMEImage import MIMEImage
    from email.MIMEMultipart import MIMEMultipart
    from email.MIMEText import MIMEText

    def getAttachment(path, filename):
    ctype, encoding = mimetypes.guess_type(path)
    if ctype is None or encoding is not None:
    ctype = 'application/octet-stream'
    maintype, subtype = ctype.split('/', 1)
    fp = open(path, 'rb')
    if maintype == 'text':
    attach = MIMEText(fp.read(),_subtype=subtype)
    elif maintype == 'message':
    attach = email.message_from_file(fp)
    elif maintype == 'image':
    attach = MIMEImage(fp.read(),_subtype=subtype)
    elif maintype == 'audio':
    attach = MIMEAudio(fp.read(),_subtype=subtype)
    else:
    print maintype, subtype
    attach = MIMEBase(maintype, subtype)
    attach.set_payload(fp.read())
    encode_base64(attach)
    fp.close
    attach.add_header('Content-Disposition', 'attachment',
    filename=filename)
    return attach


    msg = MIMEMultipart()
    msg['From'] = ''
    msg['To'] = ''
    msg['Subject'] = 'here is your attachment'
    path = 'C:\Email\test.txt'
    filename = 'test.txt'
    attach = getAttachment(path, filename)
    msg.attach(attach)

    server = smtplib.SMTP('fc.hbu.edu')
    server.sendmail('', '',
    msg.as_string())
    server.quit()
    ___________________________________________________________________________


    Rudy Schockaert <> wrote in message news:<KI1ab.25228$-ops.be>...
    > Bill wrote:
    > > I am trying to have the capability to email attachments. Specifically
    > > I want to be able to email a specific attachment that I name that may
    > > be a PDF document, text doc, etc. I already have a working piece of
    > > code that emails jpg attachments but does not work with any other
    > > types of attachments. Could someone tell me how to modify this code to
    > > send other types of attachments like the one's stated above(especially
    > > PDF's)? Also how do I determine the name of the attachment? Right now
    > > it defaults to Attach0. Here is the current code I have below:
    > > _________________________________________________
    > > import sys, smtplib, MimeWriter, base64, StringIO
    > >
    > > message = StringIO.StringIO()
    > > writer = MimeWriter.MimeWriter(message)
    > > writer.addheader('Subject', 'The Text test')
    > > writer.startmultipartbody('mixed')
    > >
    > > # start off with a text/plain part
    > > part = writer.nextpart()
    > > body = part.startbody('text/plain')
    > > body.write('This is a picture of chess, enjoy :)')
    > >
    > > # now add an image part
    > > part = writer.nextpart()
    > > part.addheader('Content-Transfer-Encoding', 'base64')
    > > body = part.startbody('image/jpeg')
    > > #body = part.startbody('text/plain')
    > > base64.encode(open('c:\email\chess01.jpg', 'rb'), body)
    > >
    > > # finish off
    > > writer.lastpart()
    > >
    > > # send the mail
    > > smtp = smtplib.SMTP('fc.hbu.edu')
    > > smtp.sendmail('', '',
    > > message.getvalue())
    > > smtp.quit()
    > > __________________________________________________________________________

    >
    > Wouldn't it be a lot easier to use the email module?
    >
    > This is a snippet of how I send attachments (simply replace
    > TO,FROM,Subect, path (full pathname including filename) and filename
    > with relevant data):
    >
    > import smtplib
    > import mimetypes
    > from email.Encoders import encode_base64
    > from email.MIMEAudio import MIMEAudio
    > from email.MIMEBase import MIMEBase
    > from email.MIMEImage import MIMEImage
    > from email.MIMEMultipart import MIMEMultipart
    > from email.MIMEText import MIMEText
    >
    > def getAttachment(path, filename):
    > ctype, encoding = mimetypes.guess_type(path)
    > if ctype is None or encoding is not None:
    > ctype = 'application/octet-stream'
    > maintype, subtype = ctype.split('/', 1)
    > fp = open(path, 'rb')
    > if maintype == 'text':
    > attach = MIMEText(fp.read(),_subtype=subtype)
    > elif maintype == 'message':
    > attach = email.message_from_file(fp)
    > elif maintype == 'image':
    > attach = MIMEImage(fp.read(),_subtype=subtype)
    > elif maintype == 'audio':
    > attach = MIMEAudio(fp.read(),_subtype=subtype)
    > else:
    > print maintype, subtype
    > attach = MIMEBase(maintype, subtype)
    > attach.set_payload(fp.read())
    > encode_base64(attach)
    > fp.close
    > attach.add_header('Content-Disposition', 'attachment',
    > filename=filename)
    > return attach
    >
    >
    > msg = MIMEMultipart()
    > msg['From'] = FROM
    > msg['To'] = TO
    > msg['Subject'] = SUBJECT
    > attach = getAttachment(path, filename)
    > msg.attach(attach)
    >
    > server = smtplib.SMTP(MAILSERVER)
    > server.sendmail(FROM, [TO], msg.as_string())
    > server.quit()
     
    Bill, Sep 18, 2003
    #4
  5. [Bill]
    > IOError: [Errno 2] No such file or directory: 'C:\\Email\test.txt'

    ^^ ^

    You've missed a backslash somewhere. Your filename looks like
    C:\Email<tab>est.txt. You should always do one of the following:

    o Remember to double your backslashes: "C:\\Email\\test.txt"
    o Use raw strings for pathnames: r"C:\Email\test.txt"
    o Use forward slashes (which are fine on Windows): "C:/Email/test.txt"

    --
    Richie Hindle
     
    Richie Hindle, Sep 18, 2003
    #5
  6. Bill

    Bill Guest

    Thanks Richie this corrected my error. I appreciate it.

    Richie Hindle <> wrote in message news:<>...
    > [Bill]
    > > IOError: [Errno 2] No such file or directory: 'C:\\Email\test.txt'

    > ^^ ^
    >
    > You've missed a backslash somewhere. Your filename looks like
    > C:\Email<tab>est.txt. You should always do one of the following:
    >
    > o Remember to double your backslashes: "C:\\Email\\test.txt"
    > o Use raw strings for pathnames: r"C:\Email\test.txt"
    > o Use forward slashes (which are fine on Windows): "C:/Email/test.txt"
     
    Bill, Sep 19, 2003
    #6
  7. Bill

    Bill Guest

    Thanks to help of Rudy Shockaert I was able to solve my problem and I
    also added the capability to add the email body if you are curious and
    don't know how. I also commented the code as well. Here is the code
    result:

    import smtplib
    import mimetypes
    from email.Encoders import encode_base64
    from email.MIMEAudio import MIMEAudio
    from email.MIMEBase import MIMEBase
    from email.MIMEImage import MIMEImage
    from email.MIMEMultipart import MIMEMultipart
    from email.MIMEText import MIMEText
    #______________________________________________________________________________________________________
    #Requirements:At least Python 2.2.2
    #getAttachment takes the directory path and the filename for ex:
    'c:\\MyFolder\\test.txt'
    #You must put double back slashes in your path.
    #getAttachment returns email version of the type of file it takes in,
    #For example if it is a text file, it will encode it as a text file, a
    gif, it will encode it as a gif
    #_______________________________________________________________________________________________________
    def getAttachment(path, filename):
    ctype, encoding = mimetypes.guess_type(path) #mimetypes guesses
    the type of file and stores it in ctype
    if ctype is None or encoding is not None: # example: ctype
    can equal "application/pdf"
    ctype = 'application/octet-stream'
    maintype, subtype = ctype.split('/', 1) #We do a split on "/"
    to store "application" in maintype and "pdf" in subtype
    fp = open(path, 'rb') #open the file
    if maintype == 'text':
    attach = MIMEText(fp.read(),_subtype=subtype) #check for
    maintype value and encode and return according to
    elif maintype == 'message': #the type of
    file.
    attach = email.message_from_file(fp)
    elif maintype == 'image':
    attach = MIMEImage(fp.read(),_subtype=subtype)
    elif maintype == 'audio':
    attach = MIMEAudio(fp.read(),_subtype=subtype)
    else:
    print maintype, subtype #if it does not equal any of the
    above we print to screen and encode and return
    attach = MIMEBase(maintype, subtype) #the encoded value
    attach.set_payload(fp.read())
    encode_base64(attach)
    fp.close
    attach.add_header('Content-Disposition', 'attachment',
    filename=filename)
    return attach

    #_______________________________________________________________________________________________
    #Here we set up our email
    From = ''
    To = ''
    msg = MIMEMultipart()
    msg['From'] = From
    msg['To'] = To
    msg['Subject'] = 'here is your attachment'
    body = MIMEText('This is the body of the email!') #Here is the body
    path = 'C:\\YourPath\\YourFile.txt'
    filename = 'gfe.pdf'
    attach = getAttachment(path, filename) #We call our getAttachment()
    function here
    msg.attach(attach) #We create our message both attachment and the
    body
    msg.attach(body)

    server = smtplib.SMTP('mySMTPServerName.com')
    server.sendmail(From, To, msg.as_string()) #Send away
    server.quit()


    (Bill) wrote in message news:<>...
    > I am trying to have the capability to email attachments. Specifically
    > I want to be able to email a specific attachment that I name that may
    > be a PDF document, text doc, etc. I already have a working piece of
    > code that emails jpg attachments but does not work with any other
    > types of attachments. Could someone tell me how to modify this code to
    > send other types of attachments like the one's stated above(especially
    > PDF's)? Also how do I determine the name of the attachment? Right now
    > it defaults to Attach0. Here is the current code I have below:
    > _________________________________________________
    > import sys, smtplib, MimeWriter, base64, StringIO
    >
    > message = StringIO.StringIO()
    > writer = MimeWriter.MimeWriter(message)
    > writer.addheader('Subject', 'The Text test')
    > writer.startmultipartbody('mixed')
    >
    > # start off with a text/plain part
    > part = writer.nextpart()
    > body = part.startbody('text/plain')
    > body.write('This is a picture of chess, enjoy :)')
    >
    > # now add an image part
    > part = writer.nextpart()
    > part.addheader('Content-Transfer-Encoding', 'base64')
    > body = part.startbody('image/jpeg')
    > #body = part.startbody('text/plain')
    > base64.encode(open('c:\email\chess01.jpg', 'rb'), body)
    >
    > # finish off
    > writer.lastpart()
    >
    > # send the mail
    > smtp = smtplib.SMTP('fc.hbu.edu')
    > smtp.sendmail('', '',
    > message.getvalue())
    > smtp.quit()
    > __________________________________________________________________________
     
    Bill, Sep 19, 2003
    #7
  8. Bill

    Karl Scalet Guest

    Bill wrote:

    > [...]
    > path = 'C:\\YourPath\\YourFile.txt'
    > filename = 'gfe.pdf'


    is this correct? Shouldn't path contain the directory only?
    Otherwise what's the content of YourFile.txt then.

    Karl
     
    Karl Scalet, Sep 19, 2003
    #8
  9. Bill

    Bill Guest

    Karl Scalet <> wrote in message news:<bkf0nd$10dm0$-berlin.de>...
    > Bill wrote:
    >
    > > [...]
    > > path = 'C:\\YourPath\\YourFile.txt'
    > > filename = 'YourFile.txt'

    >
    > is this correct? Shouldn't path contain the directory only?
    > Otherwise what's the content of YourFile.txt then.
    >
    > Karl


    Well I believe you need the file as well b/c the mimetypes function
    checks the extension to see what type of file it is. I am sure you can
    modify it to be more efficient. But it works as is.
     
    Bill, Sep 19, 2003
    #9
  10. Bill wrote:
    > Karl Scalet <> wrote in message news:<bkf0nd$10dm0$-berlin.de>...
    >
    >>Bill wrote:
    >>
    >>
    >>>[...]
    >>>path = 'C:\\YourPath\\YourFile.txt'
    >>>filename = 'YourFile.txt'

    >>
    >>is this correct? Shouldn't path contain the directory only?
    >>Otherwise what's the content of YourFile.txt then.
    >>
    >>Karl

    >
    >
    > Well I believe you need the file as well b/c the mimetypes function
    > checks the extension to see what type of file it is. I am sure you can
    > modify it to be more efficient. But it works as is.


    Path and filename are two distinct items. The first points to the
    physical file, the other is the name the attachment will get in the mail.
    This way you also have the flexibility to name the file once attached
    different than the version on disk.
     
    Rudy Schockaert, Sep 20, 2003
    #10
    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. MW de Jager

    Emailing attachments

    MW de Jager, May 23, 2005, in forum: ASP .Net
    Replies:
    4
    Views:
    525
    MW de Jager
    May 24, 2005
  2. Evan
    Replies:
    3
    Views:
    520
  3. codewarrior
    Replies:
    0
    Views:
    547
    codewarrior
    May 4, 2009
  4. Peter Green
    Replies:
    0
    Views:
    656
    Peter Green
    Nov 5, 2009
  5. grooveska
    Replies:
    8
    Views:
    261
    Bill Guindon
    Jun 9, 2007
Loading...

Share This Page