Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
17f127db
Commit
17f127db
authored
Oct 06, 2013
by
Serhiy Storchaka
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Issue #18972: Modernize email examples and use the argparse module in them.
parent
00c8b44c
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
56 additions
and
80 deletions
+56
-80
Doc/includes/email-dir.py
Doc/includes/email-dir.py
+36
-50
Doc/includes/email-unpack.py
Doc/includes/email-unpack.py
+15
-30
Misc/NEWS
Misc/NEWS
+5
-0
No files found.
Doc/includes/email-dir.py
View file @
17f127db
...
...
@@ -8,7 +8,7 @@ import smtplib
# For guessing MIME type based on file name extension
import
mimetypes
from
optparse
import
Option
Parser
from
argparse
import
Argument
Parser
from
email
import
encoders
from
email.message
import
Message
...
...
@@ -22,44 +22,36 @@ COMMASPACE = ', '
def
main
():
parser
=
OptionParser
(
usage
=
"""
\
parser
=
ArgumentParser
(
description
=
"""
\
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
()
if
not
opts
.
sender
or
not
opts
.
recipients
:
parser
.
print_help
()
sys
.
exit
(
1
)
directory
=
opts
.
directory
parser
.
add_argument
(
'-d'
,
'--directory'
,
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_argument
(
'-o'
,
'--output'
,
metavar
=
'FILE'
,
help
=
"""Print the composed message to FILE instead of
sending the message to the SMTP server."""
)
parser
.
add_argument
(
'-s'
,
'--sender'
,
required
=
True
,
help
=
'The value of the From: header (required)'
)
parser
.
add_argument
(
'-r'
,
'--recipient'
,
required
=
True
,
action
=
'append'
,
metavar
=
'RECIPIENT'
,
default
=
[],
dest
=
'recipients'
,
help
=
'A To: header value (at least one required)'
)
args
=
parser
.
parse_args
()
directory
=
args
.
directory
if
not
directory
:
directory
=
'.'
# Create the enclosing (outer) message
outer
=
MIMEMultipart
()
outer
[
'Subject'
]
=
'Contents of directory %s'
%
os
.
path
.
abspath
(
directory
)
outer
[
'To'
]
=
COMMASPACE
.
join
(
opt
s
.
recipients
)
outer
[
'From'
]
=
opt
s
.
sender
outer
[
'To'
]
=
COMMASPACE
.
join
(
arg
s
.
recipients
)
outer
[
'From'
]
=
arg
s
.
sender
outer
.
preamble
=
'You will not see this in a MIME-aware mail reader.
\
n
'
for
filename
in
os
.
listdir
(
directory
):
...
...
@@ -76,23 +68,19 @@ must be running an SMTP server.
ctype
=
'application/octet-stream'
maintype
,
subtype
=
ctype
.
split
(
'/'
,
1
)
if
maintype
==
'text'
:
fp
=
open
(
path
)
# Note: we should handle calculating the charset
msg
=
MIMEText
(
fp
.
read
(),
_subtype
=
subtype
)
fp
.
close
()
with
open
(
path
)
as
fp
:
# Note: we should handle calculating the charset
msg
=
MIMEText
(
fp
.
read
(),
_subtype
=
subtype
)
elif
maintype
==
'image'
:
fp
=
open
(
path
,
'rb'
)
msg
=
MIMEImage
(
fp
.
read
(),
_subtype
=
subtype
)
fp
.
close
()
with
open
(
path
,
'rb'
)
as
fp
:
msg
=
MIMEImage
(
fp
.
read
(),
_subtype
=
subtype
)
elif
maintype
==
'audio'
:
fp
=
open
(
path
,
'rb'
)
msg
=
MIMEAudio
(
fp
.
read
(),
_subtype
=
subtype
)
fp
.
close
()
with
open
(
path
,
'rb'
)
as
fp
:
msg
=
MIMEAudio
(
fp
.
read
(),
_subtype
=
subtype
)
else
:
fp
=
open
(
path
,
'rb'
)
msg
=
MIMEBase
(
maintype
,
subtype
)
msg
.
set_payload
(
fp
.
read
())
fp
.
close
()
with
open
(
path
,
'rb'
)
as
fp
:
msg
=
MIMEBase
(
maintype
,
subtype
)
msg
.
set_payload
(
fp
.
read
())
# Encode the payload using Base64
encoders
.
encode_base64
(
msg
)
# Set the filename parameter
...
...
@@ -100,14 +88,12 @@ must be running an SMTP server.
outer
.
attach
(
msg
)
# Now send or store the message
composed
=
outer
.
as_string
()
if
opts
.
output
:
fp
=
open
(
opts
.
output
,
'w'
)
fp
.
write
(
composed
)
fp
.
close
()
if
args
.
output
:
with
open
(
args
.
output
,
'w'
)
as
fp
:
fp
.
write
(
composed
)
else
:
s
=
smtplib
.
SMTP
(
'localhost'
)
s
.
sendmail
(
opts
.
sender
,
opts
.
recipients
,
composed
)
s
.
quit
()
with
smtplib
.
SMTP
(
'localhost'
)
as
s
:
s
.
sendmail
(
args
.
sender
,
args
.
recipients
,
composed
)
if
__name__
==
'__main__'
:
...
...
Doc/includes/email-unpack.py
View file @
17f127db
...
...
@@ -8,41 +8,27 @@ import email
import
errno
import
mimetypes
from
optparse
import
Option
Parser
from
argparse
import
Argument
Parser
def
main
():
parser
=
OptionParser
(
usage
=
"""
\
parser
=
ArgumentParser
(
description
=
"""
\
Unpack a MIME message into a directory of files.
Usage: %prog [options] msgfile
"""
)
parser
.
add_option
(
'-d'
,
'--directory'
,
type
=
'string'
,
action
=
'store'
,
help
=
"""Unpack the MIME message into the named
directory, which will be created if it doesn't already
exist."""
)
opts
,
args
=
parser
.
parse_args
()
if
not
opts
.
directory
:
parser
.
print_help
()
sys
.
exit
(
1
)
parser
.
add_argument
(
'-d'
,
'--directory'
,
required
=
True
,
help
=
"""Unpack the MIME message into the named
directory, which will be created if it doesn't already
exist."""
)
parser
.
add_argument
(
'msgfile'
)
args
=
parser
.
parse_args
()
try
:
msgfile
=
args
[
0
]
except
IndexError
:
parser
.
print_help
()
sys
.
exit
(
1
)
with
open
(
args
.
msgfile
)
as
fp
:
msg
=
email
.
message_from_file
(
fp
)
try
:
os
.
mkdir
(
opts
.
directory
)
except
OSError
as
e
:
# Ignore directory exists error
if
e
.
errno
!=
errno
.
EEXIST
:
raise
fp
=
open
(
msgfile
)
msg
=
email
.
message_from_file
(
fp
)
fp
.
close
()
os
.
mkdir
(
args
.
directory
)
except
FileExistsError
:
pass
counter
=
1
for
part
in
msg
.
walk
():
...
...
@@ -59,9 +45,8 @@ Usage: %prog [options] msgfile
ext
=
'.bin'
filename
=
'part-%03d%s'
%
(
counter
,
ext
)
counter
+=
1
fp
=
open
(
os
.
path
.
join
(
opts
.
directory
,
filename
),
'wb'
)
fp
.
write
(
part
.
get_payload
(
decode
=
True
))
fp
.
close
()
with
open
(
os
.
path
.
join
(
args
.
directory
,
filename
),
'wb'
)
as
fp
:
fp
.
write
(
part
.
get_payload
(
decode
=
True
))
if
__name__
==
'__main__'
:
...
...
Misc/NEWS
View file @
17f127db
...
...
@@ -60,6 +60,11 @@ Library
-
Issue
#
4366
:
Fix
building
extensions
on
all
platforms
when
--
enable
-
shared
is
used
.
Documentation
-------------
-
Issue
#
18972
:
Modernize
email
examples
and
use
the
argparse
module
in
them
.
Build
-----
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment