• Python-使用SMTP服务发送邮件


    1.SMTP 发送邮件

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。

    python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。

    如果我们本机没有 sendmail 访问,可以使用其他邮件服务商的 SMTP 访问(QQ、网易、Google等)。

    下面以QQ邮箱为例:

    1.1使用SMTP的第一步需要把邮箱的SMTP服务打开:

    1. 登录QQ邮箱网页版,点击设置:

      image-20211018141839463

    2. 在账户一栏中找到SMTP服务:

      image-20211018142127284

    image-20211018142223865

    1. 打开SMTP服务,根据提示验证密保:

      image-20211018142454008

    2. 验证成功后复制授权码备用:

      image-20211018142717243

    1.2准备发送邮件

    import smtplib
    from email.mime.text import MIMEText
    from email.header import Header
    
    # 第三方SMTP服务器地址:
    smtp_server = 'smtp.qq.com'
    # 输入Email地址和授权码:
    from_addr = 'xxxxx@qq.com'
    password = 'xxxxxxxxxxxxxx'
    # 输入收件人地址:
    to_addr = 'weijiajian@wei.tax'
    
    # 定义发送的消息,其中plain是文本格式
    message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8')
    # 定义发送人名字
    message['From'] = Header('Python', 'utf-8')
    # 定义接收人的名字
    message['To'] = Header('测试员', 'utf-8')
    # 定义邮件主题
    subject = 'Python SMTP 邮件测试'
    message['Subject'] = Header(subject, 'utf-8')
    # 尝试发送邮件
    try:
        # 创建SMTP对象
        smtpObj = smtplib.SMTP()
        # 创建SMTP连接
        smtpObj.connect(smtp_server, 25) # SMTP的端口号,一般为25
        # 登录邮箱
        smtpObj.login(from_addr, password)
        # 发送邮件 发送方  接收方  信息
        smtpObj.sendmail(from_addr, to_addr, message.as_string())
        print('邮件发送成功')
    except smtplib.SMTPException:
        print('Error:邮件发送失败')
    

    运行代码:

    image-20211018145314271

    可以看到邮件发送成功,打开邮箱:

    image-20211018145635816

    可以看到收到了一封邮件:

    image-20211018145737703

    1.3使用Python发送HTML格式的邮件

    Python发送HTML格式的邮件与发送纯文本消息的邮件不同之处就是将MIMEText中_subtype设置为html。具体代码如下:

    import smtplib
    from email.mime.text import MIMEText
    from email.header import Header
    
    # 第三方SMTP服务器地址:
    smtp_server = 'smtp.qq.com'
    # 输入Email地址和授权码:
    from_addr = 'w.yuling@qq.com'
    password = 'xxxxxxxxx'
    # 输入收件人地址:
    to_addr = 'weijiajian@wei.tax'
    
    # 定义发送的消息,定义为html格式
    html_message = """
    <p>这是一封html格式的邮件</p>
    <p><a href="https://weibk.github.io">这是一个连接,通往我的主页</a></p>
    """
    message = MIMEText(html_message, 'html', 'utf-8')
    # 定义发送人名字
    message['From'] = Header('Python', 'utf-8')
    # 定义接收人的名字
    message['To'] = Header('测试员', 'utf-8')
    # 定义邮件主题
    subject = 'Python SMTP 邮件测试'
    message['Subject'] = Header(subject, 'utf-8')
    # 尝试发送邮件
    try:
        # 创建SMTP对象
        smtpObj = smtplib.SMTP()
        # 创建SMTP连接
        smtpObj.connect(smtp_server, 25)  # SMTP的端口号,一般为25
        # 登录邮箱
        smtpObj.login(from_addr, password)
        # 发送邮件 发送方  接收方  信息
        smtpObj.sendmail(from_addr, to_addr, message.as_string())
        print('邮件发送成功')
    except smtplib.SMTPException:
        print('Error:邮件发送失败')
    

    发送的邮件如下:

    image-20211018150514343

    1.4给邮件添加附件

    发送带附件的邮件,首先要创建MIMEMultipart()实例,然后构造附件,如果有多个附件,可依次构造,最后利用smtplib.smtp发送。

    import smtplib
    from email.mime.multipart import MIMEMultipart
    from email.mime.text import MIMEText
    from email.header import Header
    
    # 第三方SMTP服务器地址:
    smtp_server = 'smtp.qq.com'
    # 输入Email地址和授权码:
    from_addr = 'w.yuling@qq.com'
    password = 'xxxxxxxxxxx'
    # 输入收件人地址:
    to_addr = 'weijiajian@wei.tax'
    
    # 创建一个带附件的实例
    message = MIMEMultipart()
    # 定义发送人名字
    message['From'] = Header('Python', 'utf-8')
    # 定义接收人的名字
    message['To'] = Header('测试员', 'utf-8')
    # 定义邮件主题
    subject = 'Python SMTP 带附件的邮件测试'
    message['Subject'] = Header(subject, 'utf-8')
    
    # 邮件正文:
    message.attach(MIMEText('这封邮件带了两个附件.....', 'plain', 'utf-8'))
    
    # 添加第一个附件,传送当前目录下的 abs_test.py 文件
    att1 = MIMEText(open('abs_test.py').read(), 'base64', 'utf-8')
    att1["Content-Type"] = 'application/octet-stream'
    # 这里的filename可以任意写,写什么名字,邮件中显示什么名字
    att1["Content-Disposition"] = 'attachment; filename="abs_test.py"'
    message.attach(att1)
    
    # 添加第二个附件
    att2 = MIMEText(open('calc_test.py').read(), 'base64', 'utf-8')
    att2["Content-Type"] = 'application/octet-stream'
    # 这里的filename可以任意写,写什么名字,邮件中显示什么名字
    att2["Content-Disposition"] = 'attachment; filename="calc.py"'
    message.attach(att2)
    # 尝试发送邮件
    try:
        # 创建SMTP对象
        smtpObj = smtplib.SMTP()
        # 创建SMTP连接
        smtpObj.connect(smtp_server, 25)  # SMTP的端口号,一般为25
        # 登录邮箱
        smtpObj.login(from_addr, password)
        # 发送邮件 发送方  接收方  信息
        smtpObj.sendmail(from_addr, to_addr, message.as_string())
        print('邮件发送成功')
    except smtplib.SMTPException:
        print('Error:邮件发送失败')
    

    成功发送的邮件如下:

    image-20211018152158490

    本文来自博客园,作者:雨-铃,原文链接:https://www.cnblogs.com/yuling25/p/smtp-email.html

  • 相关阅读:
    linux curses函数库
    在Android library中不能使用switch-case语句访问资源ID的原因分析及解决方案
    Android Support ;v4、v7、v13的区别
    background-position
    java web 之 web.xml篇
    javaweb之Cookie篇
    Enumeration 接口
    Java Bad version number in .class file
    使用AppCan自带的升级功能实现移动端升级
    obj.offsetHeight与obj.style.height区别
  • 原文地址:https://www.cnblogs.com/yuling25/p/smtp-email.html
Copyright © 2020-2023  润新知