14
14
Enji Cooper, October 2013
15
15
"""
16
16
17
- from email .mime .multipart import MIMEMultipart
18
- from email .mime .text import MIMEText
19
- from email .Utils import formatdate
17
+ import argparse
20
18
import getpass
19
+ import logging
21
20
import os
22
21
import select
23
22
import smtplib
24
23
import socket
25
24
import sys
26
25
import time
26
+ from email .mime .multipart import MIMEMultipart
27
+ from email .mime .text import MIMEText
28
+ from email .utils import formatdate
29
+ from typing import Optional
27
30
28
31
29
- def add_attachments (attachment_files ):
32
+ DEBUG = False
33
+
34
+
35
+ def add_attachments (attachment_files : list [os .PathLike ]) -> list [MIMEText ]:
30
36
attachments = []
31
37
for attachment_file in attachment_files :
32
- attachment = MIMEText (open (attachment_file , 'rb' ).read (),
33
- _charset = 'utf-8' )
34
- attachment .add_header ('Content-Disposition' , 'attachment' ,
35
- filename = os .path .basename (attachment_file ))
38
+ with open (attachment_file , "rb" ) as attachment_fp :
39
+ attachment = MIMEText (attachment_fp .read (), _charset = "utf-8" )
40
+ attachment .add_header (
41
+ "Content-Disposition" ,
42
+ "attachment" ,
43
+ filename = os .path .basename (attachment_file ),
44
+ )
36
45
attachments .append (attachment )
37
46
return attachments
38
47
39
48
40
- def do_email (mailserver , port , user , domain , password , recipients , message ,
41
- subject , attachments = None ):
49
+ def do_email (
50
+ mailserver : str ,
51
+ port : int ,
52
+ user : str ,
53
+ domain : str ,
54
+ password : str ,
55
+ recipients : list [str ],
56
+ message : str ,
57
+ subject : str ,
58
+ attachments : Optional [os .PathLike ] = None ,
59
+ ):
42
60
smtp_args = []
43
61
if mailserver :
44
62
smtp_args .append (mailserver )
@@ -50,88 +68,101 @@ def do_email(mailserver, port, user, domain, password, recipients, message,
50
68
51
69
server = smtplib .SMTP (* smtp_args , timeout = 10 )
52
70
try :
53
- #server.set_debuglevel(1)
71
+ if DEBUG :
72
+ server .set_debuglevel (1 )
54
73
server .ehlo ()
55
- if server .has_extn (' STARTTLS' ):
74
+ if server .has_extn (" STARTTLS" ):
56
75
server .starttls ()
57
76
58
- sender = '@' .join ([user , domain ]).encode (' utf-8' )
77
+ sender = "@" .join ([user , domain ]).encode (" utf-8" )
59
78
60
79
if attachments :
61
80
msg = MIMEMultipart ()
62
81
msg .preamble = message
63
82
for attachment in attachments :
64
83
msg .attach (attachment )
65
84
else :
66
- msg = MIMEText (message , _charset = ' utf-8' )
67
- msg [' From' ] = sender
68
- msg ['To' ] = ', ' .join (recipients )
69
- msg [' Date' ] = formatdate ()
70
- msg [' Subject' ] = subject
85
+ msg = MIMEText (message , _charset = " utf-8" )
86
+ msg [" From" ] = sender
87
+ msg ["To" ] = ", " .join (recipients )
88
+ msg [" Date" ] = formatdate ()
89
+ msg [" Subject" ] = subject
71
90
msg = msg .as_string ()
72
91
73
92
try :
74
93
if password :
75
94
server .login (user , password )
76
- except Exception as e :
77
- print ( ' Error logging into server: %r' % ( repr ( e )) )
78
- #time.sleep(10)
95
+ except Exception :
96
+ logging . exception ( " Error logging into server" )
97
+ # time.sleep(10)
79
98
res = server .sendmail (sender , recipients , msg )
80
- #if res:
81
- # print('Error sending mail: %r' % (repr(res)))
82
- #else:
83
- # print('Email sent!\n%s' % (msg, ))
99
+ if DEBUG :
100
+ if res :
101
+ print (f"Error sending mail: { res !r} " )
102
+ else :
103
+ print (f"Email sent!\n { msg } " )
84
104
finally :
85
105
server .quit ()
86
106
87
107
88
108
def main ():
89
- import optparse
90
-
91
- parser = optparse .OptionParser ()
92
- parser .add_option ('-d' , default = '.' .join (socket .getfqdn ().split ('.' )[1 :]),
93
- dest = 'sender_domain' ,
94
- help = ('domain name to use for sender email '
95
- '(default: %default)' ),
96
- )
97
- parser .add_option ('-m' , default = 'localhost' ,
98
- dest = 'mailserver' ,
99
- help = 'mailserver to use for relaying email' ,
100
- )
101
- parser .add_option ('-p' , default = socket .getservbyname ('smtp' ),
102
- dest = 'port' ,
103
- type = int ,
104
- help = 'port to connect to SMTP on (default: %default)' ,
105
- )
106
- parser .add_option ('-s' ,
107
- dest = 'subject' ,
108
- help = 'subject line in email to send' ,
109
- )
110
- parser .add_option ('-u' , default = os .getenv ('USER' ),
111
- dest = 'sender_user' ,
112
- help = ('username to use when sending mail '
113
- '(default: %default)' ),
114
- )
115
-
116
- opts , recipients = parser .parse_args ()
117
- if not len (recipients ):
118
- parser .exit ('you must supply at least one recipient' )
119
-
120
- password = os .getenv ('PASSWORD' ) or getpass .getpass ()
121
- password = password .strip ().encode ('utf-8' )
109
+ parser = argparse .ArgumentParser ()
110
+ parser .add_argument (
111
+ "-d" ,
112
+ default = "." .join (socket .getfqdn ().split ("." )[1 :]),
113
+ dest = "sender_domain" ,
114
+ help = ("domain name to use for sender email " "(default: %default)" ),
115
+ )
116
+ parser .add_argument (
117
+ "-m" ,
118
+ default = "localhost" ,
119
+ dest = "mailserver" ,
120
+ help = "mailserver to use for relaying email" ,
121
+ )
122
+ parser .add_argument (
123
+ "-p" ,
124
+ default = socket .getservbyname ("smtp" ),
125
+ dest = "port" ,
126
+ type = int ,
127
+ help = "port to connect to SMTP on (default: %default)" ,
128
+ )
129
+ parser .add_argument (
130
+ "-s" ,
131
+ dest = "subject" ,
132
+ help = "subject line in email to send" ,
133
+ )
134
+ parser .add_argument (
135
+ "-u" ,
136
+ default = os .getenv ("USER" ),
137
+ dest = "sender_user" ,
138
+ help = ("username to use when sending mail " "(default: %default)" ),
139
+ )
140
+ parser .add_argument ("recipients" , nargs = "+" )
141
+
142
+ args = parser .parse_args ()
143
+
144
+ password = os .getenv ("PASSWORD" ) or getpass .getpass ()
145
+ password = password .strip ().encode ("utf-8" )
122
146
123
147
rlist = [sys .stdin ]
124
148
125
149
while True :
126
150
ready = select .select (rlist , [], [])
127
151
msg = ready [0 ][0 ].read ()
128
152
if msg :
129
- do_email (opts .mailserver , opts .port , opts .sender_user ,
130
- opts .sender_domain , password , recipients , msg ,
131
- opts .subject )
153
+ do_email (
154
+ args .mailserver ,
155
+ args .port ,
156
+ args .sender_user ,
157
+ args .sender_domain ,
158
+ password ,
159
+ args .recipients ,
160
+ msg ,
161
+ args .subject ,
162
+ )
132
163
else :
133
164
time .sleep (1 )
134
165
135
- if __name__ == '__main__' :
136
- main ()
137
166
167
+ if __name__ == "__main__" :
168
+ main ()
0 commit comments