3 """Send the contents of a directory as a MIME message.
5 Usage: dirmail [options] from to [to ...]*
9 Print this message and exit.
13 Mail the contents of the specified directory, otherwise use the
14 current directory. Only the regular files in the directory are sent,
15 and we don't recurse to subdirectories.
17 `from' is the email address of the sender of the message.
19 `to' is the email address of the recipient of the message, and multiple
20 recipients may be given.
22 The email is sent by forwarding to your local SMTP server, which then does the
23 normal delivery process. Your local machine must be running an SMTP server.
30 # For guessing MIME type based on file name extension
33 from email
import Encoders
34 from email
.Message
import Message
35 from email
.MIMEAudio
import MIMEAudio
36 from email
.MIMEBase
import MIMEBase
37 from email
.MIMEMultipart
import MIMEMultipart
38 from email
.MIMEImage
import MIMEImage
39 from email
.MIMEText
import MIMEText
44 def usage(code
, msg
=''):
45 print >> sys
.stderr
, __doc__
47 print >> sys
.stderr
, msg
53 opts
, args
= getopt
.getopt(sys
.argv
[1:], 'hd:', ['help', 'directory='])
54 except getopt
.error
, msg
:
59 if opt
in ('-h', '--help'):
61 elif opt
in ('-d', '--directory'):
70 # Create the enclosing (outer) message
71 outer
= MIMEMultipart()
72 outer
['Subject'] = 'Contents of directory %s' % os
.path
.abspath(dir)
73 outer
['To'] = COMMASPACE
.join(recips
)
74 outer
['From'] = sender
75 outer
.preamble
= 'You will not see this in a MIME-aware mail reader.\n'
76 # To guarantee the message ends with a newline
79 for filename
in os
.listdir(dir):
80 path
= os
.path
.join(dir, filename
)
81 if not os
.path
.isfile(path
):
83 # Guess the content type based on the file's extension. Encoding
84 # will be ignored, although we should check for simple things like
85 # gzip'd or compressed files.
86 ctype
, encoding
= mimetypes
.guess_type(path
)
87 if ctype
is None or encoding
is not None:
88 # No guess could be made, or the file is encoded (compressed), so
89 # use a generic bag-of-bits type.
90 ctype
= 'application/octet-stream'
91 maintype
, subtype
= ctype
.split('/', 1)
92 if maintype
== 'text':
94 # Note: we should handle calculating the charset
95 msg
= MIMEText(fp
.read(), _subtype
=subtype
)
97 elif maintype
== 'image':
99 msg
= MIMEImage(fp
.read(), _subtype
=subtype
)
101 elif maintype
== 'audio':
102 fp
= open(path
, 'rb')
103 msg
= MIMEAudio(fp
.read(), _subtype
=subtype
)
106 fp
= open(path
, 'rb')
107 msg
= MIMEBase(maintype
, subtype
)
108 msg
.set_payload(fp
.read())
110 # Encode the payload using Base64
111 Encoders
.encode_base64(msg
)
112 # Set the filename parameter
113 msg
.add_header('Content-Disposition', 'attachment', filename
=filename
)
116 # Now send the message
119 s
.sendmail(sender
, recips
, outer
.as_string())
123 if __name__
== '__main__':