Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
cpython
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
Batuhan Osman TASKAYA
cpython
Commits
5c12ec6f
Kaydet (Commit)
5c12ec6f
authored
Şub 24, 2011
tarafından
Giampaolo Rodolà
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
smtlib.py PEP8 normalization via pep8.py script.
üst
2bd4795e
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
75 additions
and
60 deletions
+75
-60
smtplib.py
Lib/smtplib.py
+75
-60
No files found.
Lib/smtplib.py
Dosyayı görüntüle @
5c12ec6f
...
...
@@ -49,17 +49,18 @@ import hmac
from
email.base64mime
import
encode
as
encode_base64
from
sys
import
stderr
__all__
=
[
"SMTPException"
,
"SMTPServerDisconnected"
,
"SMTPResponseException"
,
"SMTPSenderRefused"
,
"SMTPRecipientsRefused"
,
"SMTPDataError"
,
"SMTPConnectError"
,
"SMTPHeloError"
,
"SMTPAuthenticationError"
,
"quoteaddr"
,
"quotedata"
,
"SMTP"
]
__all__
=
[
"SMTPException"
,
"SMTPServerDisconnected"
,
"SMTPResponseException"
,
"SMTPSenderRefused"
,
"SMTPRecipientsRefused"
,
"SMTPDataError"
,
"SMTPConnectError"
,
"SMTPHeloError"
,
"SMTPAuthenticationError"
,
"quoteaddr"
,
"quotedata"
,
"SMTP"
]
SMTP_PORT
=
25
SMTP_SSL_PORT
=
465
CRLF
=
"
\r\n
"
CRLF
=
"
\r\n
"
OLDSTYLE_AUTH
=
re
.
compile
(
r"auth=(.*)"
,
re
.
I
)
# Exception classes used by this module.
class
SMTPException
(
Exception
):
"""Base class for all exceptions raised by this module."""
...
...
@@ -109,7 +110,7 @@ class SMTPRecipientsRefused(SMTPException):
def
__init__
(
self
,
recipients
):
self
.
recipients
=
recipients
self
.
args
=
(
recipients
,)
self
.
args
=
(
recipients
,)
class
SMTPDataError
(
SMTPResponseException
):
...
...
@@ -128,6 +129,7 @@ class SMTPAuthenticationError(SMTPResponseException):
combination provided.
"""
def
quoteaddr
(
addr
):
"""Quote a subset of the email addresses defined by RFC 821.
...
...
@@ -138,7 +140,7 @@ def quoteaddr(addr):
m
=
email
.
utils
.
parseaddr
(
addr
)[
1
]
except
AttributeError
:
pass
if
m
==
(
None
,
None
):
# Indicates parse failure or AttributeError
if
m
==
(
None
,
None
):
# Indicates parse failure or AttributeError
# something weird here.. punt -ddm
return
"<
%
s>"
%
addr
elif
m
is
None
:
...
...
@@ -175,7 +177,8 @@ else:
chr
=
None
while
chr
!=
"
\n
"
:
chr
=
self
.
sslobj
.
read
(
1
)
if
not
chr
:
break
if
not
chr
:
break
str
+=
chr
return
str
...
...
@@ -269,10 +272,11 @@ class SMTP:
def
_get_socket
(
self
,
port
,
host
,
timeout
):
# This makes it simpler for SMTP_SSL to use the SMTP connect code
# and just alter the socket connection bit.
if
self
.
debuglevel
>
0
:
print
>>
stderr
,
'connect:'
,
(
host
,
port
)
if
self
.
debuglevel
>
0
:
print
>>
stderr
,
'connect:'
,
(
host
,
port
)
return
socket
.
create_connection
((
port
,
host
),
timeout
)
def
connect
(
self
,
host
=
'localhost'
,
port
=
0
):
def
connect
(
self
,
host
=
'localhost'
,
port
=
0
):
"""Connect to a host on a given port.
If the hostname ends with a colon (`:') followed by a number, and
...
...
@@ -286,20 +290,25 @@ class SMTP:
if
not
port
and
(
host
.
find
(
':'
)
==
host
.
rfind
(
':'
)):
i
=
host
.
rfind
(
':'
)
if
i
>=
0
:
host
,
port
=
host
[:
i
],
host
[
i
+
1
:]
try
:
port
=
int
(
port
)
host
,
port
=
host
[:
i
],
host
[
i
+
1
:]
try
:
port
=
int
(
port
)
except
ValueError
:
raise
socket
.
error
,
"nonnumeric port"
if
not
port
:
port
=
self
.
default_port
if
self
.
debuglevel
>
0
:
print
>>
stderr
,
'connect:'
,
(
host
,
port
)
if
not
port
:
port
=
self
.
default_port
if
self
.
debuglevel
>
0
:
print
>>
stderr
,
'connect:'
,
(
host
,
port
)
self
.
sock
=
self
.
_get_socket
(
host
,
port
,
self
.
timeout
)
(
code
,
msg
)
=
self
.
getreply
()
if
self
.
debuglevel
>
0
:
print
>>
stderr
,
"connect:"
,
msg
if
self
.
debuglevel
>
0
:
print
>>
stderr
,
"connect:"
,
msg
return
(
code
,
msg
)
def
send
(
self
,
str
):
"""Send `str' to the server."""
if
self
.
debuglevel
>
0
:
print
>>
stderr
,
'send:'
,
repr
(
str
)
if
self
.
debuglevel
>
0
:
print
>>
stderr
,
'send:'
,
repr
(
str
)
if
hasattr
(
self
,
'sock'
)
and
self
.
sock
:
try
:
self
.
sock
.
sendall
(
str
)
...
...
@@ -330,7 +339,7 @@ class SMTP:
Raises SMTPServerDisconnected if end-of-file is reached.
"""
resp
=
[]
resp
=
[]
if
self
.
file
is
None
:
self
.
file
=
self
.
sock
.
makefile
(
'rb'
)
while
1
:
...
...
@@ -341,9 +350,10 @@ class SMTP:
if
line
==
''
:
self
.
close
()
raise
SMTPServerDisconnected
(
"Connection unexpectedly closed"
)
if
self
.
debuglevel
>
0
:
print
>>
stderr
,
'reply:'
,
repr
(
line
)
if
self
.
debuglevel
>
0
:
print
>>
stderr
,
'reply:'
,
repr
(
line
)
resp
.
append
(
line
[
4
:]
.
strip
())
code
=
line
[:
3
]
code
=
line
[:
3
]
# Check that the error code is syntactically correct.
# Don't attempt to read a continuation line if it is broken.
try
:
...
...
@@ -352,17 +362,17 @@ class SMTP:
errcode
=
-
1
break
# Check if multiline response.
if
line
[
3
:
4
]
!=
"-"
:
if
line
[
3
:
4
]
!=
"-"
:
break
errmsg
=
"
\n
"
.
join
(
resp
)
if
self
.
debuglevel
>
0
:
print
>>
stderr
,
'reply: retcode (
%
s); Msg:
%
s'
%
(
errcode
,
errmsg
)
print
>>
stderr
,
'reply: retcode (
%
s); Msg:
%
s'
%
(
errcode
,
errmsg
)
return
errcode
,
errmsg
def
docmd
(
self
,
cmd
,
args
=
""
):
"""Send a command, and return its response code."""
self
.
putcmd
(
cmd
,
args
)
self
.
putcmd
(
cmd
,
args
)
return
self
.
getreply
()
# std smtp commands
...
...
@@ -372,9 +382,9 @@ class SMTP:
host.
"""
self
.
putcmd
(
"helo"
,
name
or
self
.
local_hostname
)
(
code
,
msg
)
=
self
.
getreply
()
self
.
helo_resp
=
msg
return
(
code
,
msg
)
(
code
,
msg
)
=
self
.
getreply
()
self
.
helo_resp
=
msg
return
(
code
,
msg
)
def
ehlo
(
self
,
name
=
''
):
""" SMTP 'ehlo' command.
...
...
@@ -383,19 +393,19 @@ class SMTP:
"""
self
.
esmtp_features
=
{}
self
.
putcmd
(
self
.
ehlo_msg
,
name
or
self
.
local_hostname
)
(
code
,
msg
)
=
self
.
getreply
()
(
code
,
msg
)
=
self
.
getreply
()
# According to RFC1869 some (badly written)
# MTA's will disconnect on an ehlo. Toss an exception if
# that happens -ddm
if
code
==
-
1
and
len
(
msg
)
==
0
:
self
.
close
()
raise
SMTPServerDisconnected
(
"Server not connected"
)
self
.
ehlo_resp
=
msg
self
.
ehlo_resp
=
msg
if
code
!=
250
:
return
(
code
,
msg
)
self
.
does_esmtp
=
1
return
(
code
,
msg
)
self
.
does_esmtp
=
1
#parse the ehlo response -ddm
resp
=
self
.
ehlo_resp
.
split
(
'
\n
'
)
resp
=
self
.
ehlo_resp
.
split
(
'
\n
'
)
del
resp
[
0
]
for
each
in
resp
:
# To be able to communicate with as many SMTP servers as possible,
...
...
@@ -415,16 +425,16 @@ class SMTP:
# It's actually stricter, in that only spaces are allowed between
# parameters, but were not going to check for that here. Note
# that the space isn't present if there are no parameters.
m
=
re
.
match
(
r'(?P<feature>[A-Za-z0-9][A-Za-z0-9\-]*) ?'
,
each
)
m
=
re
.
match
(
r'(?P<feature>[A-Za-z0-9][A-Za-z0-9\-]*) ?'
,
each
)
if
m
:
feature
=
m
.
group
(
"feature"
)
.
lower
()
params
=
m
.
string
[
m
.
end
(
"feature"
):]
.
strip
()
feature
=
m
.
group
(
"feature"
)
.
lower
()
params
=
m
.
string
[
m
.
end
(
"feature"
):]
.
strip
()
if
feature
==
"auth"
:
self
.
esmtp_features
[
feature
]
=
self
.
esmtp_features
.
get
(
feature
,
""
)
\
+
" "
+
params
else
:
self
.
esmtp_features
[
feature
]
=
params
return
(
code
,
msg
)
self
.
esmtp_features
[
feature
]
=
params
return
(
code
,
msg
)
def
has_extn
(
self
,
opt
):
"""Does the server support a given SMTP service extension?"""
...
...
@@ -444,23 +454,23 @@ class SMTP:
"""SMTP 'noop' command -- doesn't do anything :>"""
return
self
.
docmd
(
"noop"
)
def
mail
(
self
,
sender
,
options
=
[]):
def
mail
(
self
,
sender
,
options
=
[]):
"""SMTP 'mail' command -- begins mail xfer session."""
optionlist
=
''
if
options
and
self
.
does_esmtp
:
optionlist
=
' '
+
' '
.
join
(
options
)
self
.
putcmd
(
"mail"
,
"FROM:
%
s
%
s"
%
(
quoteaddr
(
sender
)
,
optionlist
))
self
.
putcmd
(
"mail"
,
"FROM:
%
s
%
s"
%
(
quoteaddr
(
sender
)
,
optionlist
))
return
self
.
getreply
()
def
rcpt
(
self
,
recip
,
options
=
[]):
def
rcpt
(
self
,
recip
,
options
=
[]):
"""SMTP 'rcpt' command -- indicates 1 recipient for this mail."""
optionlist
=
''
if
options
and
self
.
does_esmtp
:
optionlist
=
' '
+
' '
.
join
(
options
)
self
.
putcmd
(
"rcpt"
,
"TO:
%
s
%
s"
%
(
quoteaddr
(
recip
),
optionlist
))
self
.
putcmd
(
"rcpt"
,
"TO:
%
s
%
s"
%
(
quoteaddr
(
recip
),
optionlist
))
return
self
.
getreply
()
def
data
(
self
,
msg
):
def
data
(
self
,
msg
):
"""SMTP 'DATA' command -- sends message data to server.
Automatically quotes lines beginning with a period per rfc821.
...
...
@@ -469,26 +479,28 @@ class SMTP:
response code received when the all data is sent.
"""
self
.
putcmd
(
"data"
)
(
code
,
repl
)
=
self
.
getreply
()
if
self
.
debuglevel
>
0
:
print
>>
stderr
,
"data:"
,
(
code
,
repl
)
(
code
,
repl
)
=
self
.
getreply
()
if
self
.
debuglevel
>
0
:
print
>>
stderr
,
"data:"
,
(
code
,
repl
)
if
code
!=
354
:
raise
SMTPDataError
(
code
,
repl
)
raise
SMTPDataError
(
code
,
repl
)
else
:
q
=
quotedata
(
msg
)
if
q
[
-
2
:]
!=
CRLF
:
q
=
q
+
CRLF
q
=
q
+
"."
+
CRLF
self
.
send
(
q
)
(
code
,
msg
)
=
self
.
getreply
()
if
self
.
debuglevel
>
0
:
print
>>
stderr
,
"data:"
,
(
code
,
msg
)
return
(
code
,
msg
)
(
code
,
msg
)
=
self
.
getreply
()
if
self
.
debuglevel
>
0
:
print
>>
stderr
,
"data:"
,
(
code
,
msg
)
return
(
code
,
msg
)
def
verify
(
self
,
address
):
"""SMTP 'verify' command -- checks for address validity."""
self
.
putcmd
(
"vrfy"
,
quoteaddr
(
address
))
return
self
.
getreply
()
# a.k.a.
vrfy
=
verify
vrfy
=
verify
def
expn
(
self
,
address
):
"""SMTP 'expn' command -- expands a mailing list."""
...
...
@@ -592,7 +604,7 @@ class SMTP:
raise
SMTPAuthenticationError
(
code
,
resp
)
return
(
code
,
resp
)
def
starttls
(
self
,
keyfile
=
None
,
certfile
=
None
):
def
starttls
(
self
,
keyfile
=
None
,
certfile
=
None
):
"""Puts the connection to the SMTP server into TLS mode.
If there has been no previous EHLO or HELO command this session, this
...
...
@@ -695,22 +707,22 @@ class SMTP:
for
option
in
mail_options
:
esmtp_opts
.
append
(
option
)
(
code
,
resp
)
=
self
.
mail
(
from_addr
,
esmtp_opts
)
(
code
,
resp
)
=
self
.
mail
(
from_addr
,
esmtp_opts
)
if
code
!=
250
:
self
.
rset
()
raise
SMTPSenderRefused
(
code
,
resp
,
from_addr
)
senderrs
=
{}
senderrs
=
{}
if
isinstance
(
to_addrs
,
basestring
):
to_addrs
=
[
to_addrs
]
for
each
in
to_addrs
:
(
code
,
resp
)
=
self
.
rcpt
(
each
,
rcpt_options
)
(
code
,
resp
)
=
self
.
rcpt
(
each
,
rcpt_options
)
if
(
code
!=
250
)
and
(
code
!=
251
):
senderrs
[
each
]
=
(
code
,
resp
)
if
len
(
senderrs
)
==
len
(
to_addrs
):
senderrs
[
each
]
=
(
code
,
resp
)
if
len
(
senderrs
)
==
len
(
to_addrs
):
# the server refused all our recipients
self
.
rset
()
raise
SMTPRecipientsRefused
(
senderrs
)
(
code
,
resp
)
=
self
.
data
(
msg
)
(
code
,
resp
)
=
self
.
data
(
msg
)
if
code
!=
250
:
self
.
rset
()
raise
SMTPDataError
(
code
,
resp
)
...
...
@@ -753,7 +765,8 @@ if _have_ssl:
self
.
default_port
=
SMTP_SSL_PORT
def
_get_socket
(
self
,
host
,
port
,
timeout
):
if
self
.
debuglevel
>
0
:
print
>>
stderr
,
'connect:'
,
(
host
,
port
)
if
self
.
debuglevel
>
0
:
print
>>
stderr
,
'connect:'
,
(
host
,
port
)
new_socket
=
socket
.
create_connection
((
host
,
port
),
timeout
)
new_socket
=
ssl
.
wrap_socket
(
new_socket
,
self
.
keyfile
,
self
.
certfile
)
self
.
file
=
SSLFakeFile
(
new_socket
)
...
...
@@ -781,11 +794,11 @@ class LMTP(SMTP):
ehlo_msg
=
"lhlo"
def
__init__
(
self
,
host
=
''
,
port
=
LMTP_PORT
,
local_hostname
=
None
):
def
__init__
(
self
,
host
=
''
,
port
=
LMTP_PORT
,
local_hostname
=
None
):
"""Initialize a new instance."""
SMTP
.
__init__
(
self
,
host
,
port
,
local_hostname
)
def
connect
(
self
,
host
=
'localhost'
,
port
=
0
):
def
connect
(
self
,
host
=
'localhost'
,
port
=
0
):
"""Connect to the LMTP daemon, on either a Unix or a TCP socket."""
if
host
[
0
]
!=
'/'
:
return
SMTP
.
connect
(
self
,
host
,
port
)
...
...
@@ -795,13 +808,15 @@ class LMTP(SMTP):
self
.
sock
=
socket
.
socket
(
socket
.
AF_UNIX
,
socket
.
SOCK_STREAM
)
self
.
sock
.
connect
(
host
)
except
socket
.
error
,
msg
:
if
self
.
debuglevel
>
0
:
print
>>
stderr
,
'connect fail:'
,
host
if
self
.
debuglevel
>
0
:
print
>>
stderr
,
'connect fail:'
,
host
if
self
.
sock
:
self
.
sock
.
close
()
self
.
sock
=
None
raise
socket
.
error
,
msg
(
code
,
msg
)
=
self
.
getreply
()
if
self
.
debuglevel
>
0
:
print
>>
stderr
,
"connect:"
,
msg
if
self
.
debuglevel
>
0
:
print
>>
stderr
,
"connect:"
,
msg
return
(
code
,
msg
)
...
...
@@ -815,7 +830,7 @@ if __name__ == '__main__':
return
sys
.
stdin
.
readline
()
.
strip
()
fromaddr
=
prompt
(
"From"
)
toaddrs
=
prompt
(
"To"
)
.
split
(
','
)
toaddrs
=
prompt
(
"To"
)
.
split
(
','
)
print
"Enter message, end with ^D:"
msg
=
''
while
1
:
...
...
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