美文网首页
SMTP邮件各类服务

SMTP邮件各类服务

作者: SlashBoyMr_wang | 来源:发表于2018-12-22 19:56 被阅读0次

    一、发送普通邮件

    固定格式:

    from email.header import Header
    from email.mime.text import MIMEText
    from email.utils import parseaddr, formataddr
    
    import smtplib
    
    
    def send_msg(from_addr, password, to_addr):
        from_addr = from_addr
        password = password
        to_addr = to_addr
        smtp_server = "smtp.163.com"
    
        # 格式化一个邮件地址
        def _format_addr(s):
            name, addr = parseaddr(s)
            return formataddr((Header(name, 'utf-8').encode(), addr))
    
        msg = MIMEText('hello, send by Python...', 'plain', 'utf-8')
        msg['From'] = _format_addr('Python爱好者 <%s>' % from_addr)
        msg['To'] = _format_addr('管理员 <%s>' % to_addr)
        msg['Subject'] = Header('来自SMTP的问候……', 'utf-8').encode()
    
        server = smtplib.SMTP(smtp_server, 25)
        # server.set_debuglevel(1)
        server.login(from_addr, password)
        server.sendmail(from_addr, [to_addr], msg.as_string())
        server.quit()
    

    二、发送HTML邮件

    如果我们要发送HTML邮件,而不是普通的纯文本文件怎么办?方法很简单,在构造MIMEText对象时,把HTML字符串传进去,再把第二个参数由plain变为html就可以了

    from email.header import Header
    from email.mime.text import MIMEText
    from email.utils import parseaddr, formataddr
    
    import smtplib
    
    
    
    def send_msg(from_addr, password, to_addr):
        from_addr = from_addr
        password = password
        to_addr = to_addr
        smtp_server = "smtp.163.com"
    
        # 格式化一个邮件地址
        def _format_addr(s):
            name, addr = parseaddr(s)
            return formataddr((Header(name, 'utf-8').encode(), addr))
    
        msg = MIMEText('<html><body><h1>Hello</h1>' +
                       '<p>send by <a href="http://www.python.org">Python</a>...</p>' +
                       '</body></html>', 'html', 'utf-8')
        msg['From'] = _format_addr('Python爱好者 <%s>' % from_addr)
        msg['To'] = _format_addr('管理员 <%s>' % to_addr)
        msg['Subject'] = Header('来自SMTP的问候……', 'utf-8').encode()
    
        server = smtplib.SMTP(smtp_server, 25)
        # server.set_debuglevel(1)
        server.login(from_addr, password)
        server.sendmail(from_addr, [to_addr], msg.as_string())
        server.quit()
    

    三、发送附件邮件

    如果Email中要加上附件怎么办?带附件的邮件可以看做包含若干部分的邮件:文本和各个附件本身,所以,可以构造一个MIMEMultipart对象代表邮件本身,然后往里面加上一个MIMEText作为邮件正文,再继续往里面加上表示附件的MIMEBase对象即可:

    from email import encoders
    from email.header import Header
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart,MIMEBase
    from email.utils import parseaddr, formataddr
    
    import smtplib
    
    def send_msg(from_addr, password, to_addr):
        from_addr = from_addr
        password = password
        to_addr = to_addr
        smtp_server = "smtp.163.com"
    
        # 格式化一个邮件地址
        def _format_addr(s):
            name, addr = parseaddr(s)
            return formataddr((Header(name, 'utf-8').encode(), addr))
    
        # 邮件对象:
        msg = MIMEMultipart()
        msg['From'] = _format_addr('Python爱好者 <%s>' % from_addr)
        msg['To'] = _format_addr('管理员 <%s>' % to_addr)
        msg['Subject'] = Header('来自SMTP的问候……', 'utf-8').encode()
    
        # 邮件正文是MIMEText:
        msg.attach(MIMEText('send with file...', 'plain', 'utf-8'))
    
        # 添加附件就是加上一个MIMEBase,从本地读取一个图片:
        with open('/Users/wangjifei/PycharmProjects/flask_demo/屏幕快照 2018-12-22 下午6.05.48.png', 'rb') as f:
            # 设置附件的MIME和文件名,这里是png类型:
            mime = MIMEBase('image', 'png', filename='test.png')
            # 加上必要的头信息:
            mime.add_header('Content-Disposition', 'attachment', filename='test.png')
            mime.add_header('Content-ID', '<0>')
            mime.add_header('X-Attachment-Id', '0')
            # 把附件的内容读进来:
            mime.set_payload(f.read())
            # 用Base64编码:
            encoders.encode_base64(mime)
            # 添加到MIMEMultipart:
            msg.attach(mime)
    
        
        server = smtplib.SMTP(smtp_server, 25)
        # server.set_debuglevel(1)
        server.login(from_addr, password)
        server.sendmail(from_addr, [to_addr], msg.as_string())
        server.quit()
    

    四、发送图片

    如果要把一个图片嵌入到邮件正文中怎么做?直接在HTML邮件中链接图片地址行不行?答案是,大部分邮件服务商都会自动屏蔽带有外链的图片,因为不知道这些链接是否指向恶意网站。

    要把图片嵌入到邮件正文中,我们只需按照发送附件的方式,先把邮件作为附件添加进去,然后,在HTML中通过引用src="cid:0"就可以把附件作为图片嵌入了。如果有多个图片,给它们依次编号,然后引用不同的cid:x即可

    from email import encoders
    from email.header import Header
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart,MIMEBase
    from email.utils import parseaddr, formataddr
    
    import smtplib
    
    
    def send_msg(from_addr, password, to_addr):
        from_addr = from_addr
        password = password
        to_addr = to_addr
        smtp_server = "smtp.163.com"
    
        # 格式化一个邮件地址
        def _format_addr(s):
            name, addr = parseaddr(s)
            return formataddr((Header(name, 'utf-8').encode(), addr))
    
        # 邮件对象:
        msg = MIMEMultipart()
        msg['From'] = _format_addr('Python爱好者 <%s>' % from_addr)
        msg['To'] = _format_addr('管理员 <%s>' % to_addr)
        msg['Subject'] = Header('来自SMTP的问候……', 'utf-8').encode()
    
        # 邮件正文是MIMEText:
        msg.attach(MIMEText('<html><body><h1>Hello</h1>' +
                            '<p><img src="cid:0"></p>' +
                            '</body></html>', 'html', 'utf-8'))
    
        # 添加附件就是加上一个MIMEBase,从本地读取一个图片:
        with open('/Users/wangjifei/PycharmProjects/flask_demo/屏幕快照 2018-12-22 下午6.05.48.png', 'rb') as f:
            # 设置附件的MIME和文件名,这里是png类型:
            mime = MIMEBase('image', 'png', filename='test.png')
            # 加上必要的头信息:
            mime.add_header('Content-Disposition', 'attachment', filename='test.png')
            mime.add_header('Content-ID', '<0>')
            mime.add_header('X-Attachment-Id', '0')
            # 把附件的内容读进来:
            mime.set_payload(f.read())
            # 用Base64编码:
            encoders.encode_base64(mime)
            # 添加到MIMEMultipart:
            msg.attach(mime)
    
    
        server = smtplib.SMTP(smtp_server, 25)
        # server.set_debuglevel(1)
        server.login(from_addr, password)
        server.sendmail(from_addr, [to_addr], msg.as_string())
        server.quit()
    

    五、同时支持HTML和Plain格式

    如果我们发送HTML邮件,收件人通过浏览器或者Outlook之类的软件是可以正常浏览邮件内容的,但是,如果收件人使用的设备太古老,查看不了HTML邮件怎么办?

    办法是在发送HTML的同时再附加一个纯文本,如果收件人无法查看HTML格式的邮件,就可以自动降级查看纯文本邮件。
    利用MIMEMultipart就可以组合一个HTML和Plain,要注意指定subtype是alternative:

    from email import encoders
    from email.header import Header
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart,MIMEBase
    from email.utils import parseaddr, formataddr
    
    import smtplib
    
    
    def send_msg(from_addr, password, to_addr):
        from_addr = from_addr
        password = password
        to_addr = to_addr
        smtp_server = "smtp.163.com"
    
        # 格式化一个邮件地址
        def _format_addr(s):
            name, addr = parseaddr(s)
            return formataddr((Header(name, 'utf-8').encode(), addr))
    
        # 邮件对象:
        msg = MIMEMultipart('alternative')
        msg['From'] = _format_addr('Python爱好者 <%s>' % from_addr)
        msg['To'] = _format_addr('管理员 <%s>' % to_addr)
        msg['Subject'] = Header('来自SMTP的问候……', 'utf-8').encode()
    
        # 邮件正文是MIMEText:
        msg.attach(MIMEText('hello', 'plain', 'utf-8'))
        msg.attach(MIMEText('<html><body><h1>Hello</h1></body></html>', 'html', 'utf-8'))
    
        server = smtplib.SMTP(smtp_server, 25)
        # server.set_debuglevel(1)
        server.login(from_addr, password)
        server.sendmail(from_addr, [to_addr], msg.as_string())
        server.quit()
    

    相关文章

      网友评论

          本文标题:SMTP邮件各类服务

          本文链接:https://www.haomeiwen.com/subject/uylwkqtx.html