Python模块入门教程之smtplib 邮件发送(3)


    上面说的是最普通的情况,但是不能忽略的是现在好多企业邮件是支持安全邮件的,就是通过SSL发送的邮件,这个怎么发呢?SMTP对SSL安全邮件的支持有两种方案,一种老的是专门开启一个465端口来接收ssl邮件,另一种更新的做法是在标准的25端口的smtp上增加一个starttls的命令来支持。
    看看第一种怎么办:

#-*- encoding: gb2312 -*-
import os, sys, string, socket
import smtplib


class SMTP_SSL (smtplib.SMTP):
   
def __init__(self, host='', port=465, local_hostname=None, key=None, cert=None):
        self.cert 
= cert
        self.key 
= key
        smtplib.SMTP.
__init__(self, host, port, local_hostname)
       
   
def connect(self, host='localhost', port=465):
       
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)
               
except ValueError:
                   
raise socket.error, "nonnumeric port"
       
if not port: port = 654
       
if self.debuglevel > 0: print>>stderr, 'connect:', (host, port)
        msg 
= "getaddrinfo returns an empty list"
        self.sock 
= None
       
for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):
            af, socktype, proto, canonname, sa 
= res
           
try:
                self.sock 
= socket.socket(af, socktype, proto)
               
if self.debuglevel > 0: print>>stderr, 'connect:', (host, port)
                self.sock.connect(sa)
               
# 新增加的创建ssl连接
                sslobj = socket.ssl(self.sock, self.key, self.cert)
           
except socket.error, msg:
               
if self.debuglevel > 0: 
                   
print>>stderr, 'connect fail:', (host, port)
               
if self.sock:
                    self.sock.close()
                self.sock 
= None
               
continue
           
break
       
if not self.sock:
           
raise socket.error, msg

       
# 设置ssl
        self.sock = smtplib.SSLFakeSocket(self.sock, sslobj)
        self.file 
= smtplib.SSLFakeFile(sslobj);

        (code, msg) 
= self.getreply()
       
if self.debuglevel > 0: print>>stderr, "connect:", msg
       
return (code, msg)
       
if __name__ == '__main__':
    smtp 
= SMTP_SSL('192.168.2.10')
    smtp.set_debuglevel(
1)
    smtp.sendmail(
"zzz@xxx.com""zhaowei@zhaowei.com""xxxxxxxxxxxxxxxxx")
    smtp.quit()

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/f55a216f621ebe7929a112c8b299878b.html