Python 3 - 使用 SMTP 发送电子邮件

  • 简述

    简单邮件传输协议 (SMTP) 是一种处理在邮件服务器之间发送电子邮件和路由电子邮件的协议。
    Python 提供smtplib模块,它定义了一个 SMTP 客户端会话对象,可用于将邮件发送到任何具有 SMTP 或 ESMTP 侦听器守护程序的 Internet 机器。
    这是创建一个 SMTP 对象的简单语法,稍后可用于发送电子邮件 -
    
    import smtplib
    smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
    
    这是参数的详细信息 -
    • host− 这是运行您的 SMTP 服务器的主机。您可以指定主机的 IP 地址或域名,如 jc2182.com。这是一个可选参数。
    • port− 如果提供主机参数,则需要指定 SMTP 服务器正在侦听的端口。通常此端口为 25。
    • local_hostname− 如果您的 SMTP 服务器在您的本地机器上运行,那么您可以只指定localhost选项。
    SMTP 对象有一个名为sendmail,通常用于执行邮寄消息的工作。它需要三个参数 -
    • The sender - 带有发件人地址的字符串。
    • 接收者- 字符串列表,每个接收者一个。
    • The message - 作为字符串的消息,其格式在各种 RFC 中指定。

    例子

    这是使用 Python 脚本发送一封电子邮件的简单方法。尝试一次 -
    
    #!/usr/bin/python3
    import smtplib
    sender = 'from@fromdomain.com'
    receivers = ['to@todomain.com']
    message = """From: From Person <from@fromdomain.com>
    To: To Person <to@todomain.com>
    Subject: SMTP e-mail test
    This is a test e-mail message.
    """
    try:
       smtpObj = smtplib.SMTP('localhost')
       smtpObj.sendmail(sender, receivers, message)         
       print "Successfully sent email"
    except SMTPException:
       print "Error: unable to send email"
    
    在这里,您在消息中放置了一个基本的电子邮件,使用三重引号,注意正确格式化标题。电子邮件需要一个From, To, 和一个Subject标题,用空行与电子邮件正文分开。
    要发送邮件,您可以使用smtpObj连接到本地机器上的 SMTP 服务器。然后使用sendmail方法以及消息、发件人地址和目标地址作为参数(即使发件人和收件人地址在电子邮件本身中,但并不总是用于路由邮件)。
    如果您没有在本地计算机上运行 SMTP 服务器,则可以使用smtplib客户端与远程 SMTP 服务器通信。除非您使用的是网络邮件服务(例如 gmail 或 Yahoo! Mail),否则您的电子邮件提供商必须向您提供您可以提供的外发邮件服务器详细信息,如下所示 -
    
    mail = smtplib.SMTP('smtp.gmail.com', 587)
    
  • 使用 Python 发送 HTML 电子邮件

    当您使用 Python 发送文本消息时,所有内容都被视为简单文本。即使您在文本消息中包含 HTML 标记,它也会显示为简单文本,并且 HTML 标记不会根据 HTML 语法进行格式化。但是,Python 提供了将 HTML 消息作为实际 HTML 消息发送的选项。
    发送电子邮件时,您可以指定 Mime 版本、内容类型和字符集以发送 HTML 电子邮件。

    例子

    以下是将 HTML 内容作为电子邮件发送的示例。尝试一次 -
    
    #!/usr/bin/python3
    import smtplib
    message = """From: From Person <from@fromdomain.com>
    To: To Person <to@todomain.com>
    MIME-Version: 1.0
    Content-type: text/html
    Subject: SMTP HTML e-mail test
    This is an e-mail message to be sent in HTML format
    <b>This is HTML message.</b>
    <h1>This is headline.</h1>
    """
    try:
       smtpObj = smtplib.SMTP('localhost')
       smtpObj.sendmail(sender, receivers, message)         
       print "Successfully sent email"
    except SMTPException:
       print "Error: unable to send email"
    
  • 作为电子邮件发送附件

    要发送包含混合内容的电子邮件,需要设置Content-type标头到multipart/mixed. 然后,可以在其中指定文本和附件部分boundaries.
    边界以两个连字符开头,后跟一个唯一编号,该编号不能出现在电子邮件的消息部分。表示电子邮件最后部分的最后边界也必须以两个连字符结尾。
    附加文件应使用以下编码pack("m")函数在传输前进行 base 64 编码。

    例子

    以下是发送文件的示例/tmp/test.txt作为附件。尝试一次 -
    
    #!/usr/bin/python3
    import smtplib
    import base64
    filename = "/tmp/test.txt"
    # Read a file and encode it into base64 format
    fo = open(filename, "rb")
    filecontent = fo.read()
    encodedcontent = base64.b64encode(filecontent)  # base64
    sender = 'webmaster@tutorialpoint.com'
    reciever = 'amrood.admin@gmail.com'
    marker = "AUNIQUEMARKER"
    body ="""
    This is a test email to send an attachement.
    """
    # Define the main headers.
    part1 = """From: From Person <me@fromdomain.net>
    To: To Person <amrood.admin@gmail.com>
    Subject: Sending Attachement
    MIME-Version: 1.0
    Content-Type: multipart/mixed; boundary=%s
    --%s
    """ % (marker, marker)
    # Define the message action
    part2 = """Content-Type: text/plain
    Content-Transfer-Encoding:8bit
    %s
    --%s
    """ % (body,marker)
    # Define the attachment section
    part3 = """Content-Type: multipart/mixed; name=\"%s\"
    Content-Transfer-Encoding:base64
    Content-Disposition: attachment; filename=%s
    %s
    --%s--
    """ %(filename, filename, encodedcontent, marker)
    message = part1 + part2 + part3
    try:
       smtpObj = smtplib.SMTP('localhost')
       smtpObj.sendmail(sender, reciever, message)
       print "Successfully sent email"
    except Exception:
       print ("Error: unable to send email")