- Notifications
You must be signed in to change notification settings - Fork 31.7k
/
Copy pathemail-dir.py
114 lines (102 loc) · 4.16 KB
/
email-dir.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#!/usr/bin/env python
"""Send the contents of a directory as a MIME message."""
importos
importsys
importsmtplib
# For guessing MIME type based on file name extension
importmimetypes
fromoptparseimportOptionParser
fromemailimportencoders
fromemail.messageimportMessage
fromemail.mime.audioimportMIMEAudio
fromemail.mime.baseimportMIMEBase
fromemail.mime.imageimportMIMEImage
fromemail.mime.multipartimportMIMEMultipart
fromemail.mime.textimportMIMEText
COMMASPACE=', '
defmain():
parser=OptionParser(usage="""\
Send the contents of a directory as a MIME message.
Usage: %prog [options]
Unless the -o option is given, the email is sent by forwarding to your local
SMTP server, which then does the normal delivery process. Your local machine
must be running an SMTP server.
""")
parser.add_option('-d', '--directory',
type='string', action='store',
help="""Mail the contents of the specified directory,
otherwise use the current directory. Only the regular
files in the directory are sent, and we don't recurse to
subdirectories.""")
parser.add_option('-o', '--output',
type='string', action='store', metavar='FILE',
help="""Print the composed message to FILE instead of
sending the message to the SMTP server.""")
parser.add_option('-s', '--sender',
type='string', action='store', metavar='SENDER',
help='The value of the From: header (required)')
parser.add_option('-r', '--recipient',
type='string', action='append', metavar='RECIPIENT',
default=[], dest='recipients',
help='A To: header value (at least one required)')
opts, args=parser.parse_args()
ifnotopts.senderornotopts.recipients:
parser.print_help()
sys.exit(1)
directory=opts.directory
ifnotdirectory:
directory='.'
# Create the enclosing (outer) message
outer=MIMEMultipart()
outer['Subject'] ='Contents of directory %s'%os.path.abspath(directory)
outer['To'] =COMMASPACE.join(opts.recipients)
outer['From'] =opts.sender
outer.preamble='You will not see this in a MIME-aware mail reader.\n'
forfilenameinos.listdir(directory):
path=os.path.join(directory, filename)
ifnotos.path.isfile(path):
continue
# Guess the content type based on the file's extension. Encoding
# will be ignored, although we should check for simple things like
# gzip'd or compressed files.
ctype, encoding=mimetypes.guess_type(path)
ifctypeisNoneorencodingisnotNone:
# No guess could be made, or the file is encoded (compressed), so
# use a generic bag-of-bits type.
ctype='application/octet-stream'
maintype, subtype=ctype.split('/', 1)
ifmaintype=='text':
fp=open(path)
# Note: we should handle calculating the charset
msg=MIMEText(fp.read(), _subtype=subtype)
fp.close()
elifmaintype=='image':
fp=open(path, 'rb')
msg=MIMEImage(fp.read(), _subtype=subtype)
fp.close()
elifmaintype=='audio':
fp=open(path, 'rb')
msg=MIMEAudio(fp.read(), _subtype=subtype)
fp.close()
else:
fp=open(path, 'rb')
msg=MIMEBase(maintype, subtype)
msg.set_payload(fp.read())
fp.close()
# Encode the payload using Base64
encoders.encode_base64(msg)
# Set the filename parameter
msg.add_header('Content-Disposition', 'attachment', filename=filename)
outer.attach(msg)
# Now send or store the message
composed=outer.as_string()
ifopts.output:
fp=open(opts.output, 'w')
fp.write(composed)
fp.close()
else:
s=smtplib.SMTP('localhost')
s.sendmail(opts.sender, opts.recipients, composed)
s.quit()
if__name__=='__main__':
main()