Python - 使用SMTP发送电子邮件

简单邮件传输协议(SMTP)是一种协议,用于处理在邮件服务器之间发送电子邮件和路由电子邮件.

Python提供 smtplib 模块,它定义了一个SMTP客户端会话对象,可用于使用SMTP或ESMTP侦听器守护程序将邮件发送到任何Internet计算机.

以下是创建一个SMTP对象的简单语法,以后可用于发送电子邮件 :

import smtplib

smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )

以下是参数的详细信息 :

  • 主持人 : 这是运行SMTP服务器的主机.您可以指定主机的IP地址或域名,如it1352.com.这是可选参数.

  • port : 如果要提供 host 参数,则需要指定SMTP服务器正在侦听的端口.通常这个端口是25.

  • local_hostname : 如果您的SMTP服务器在本地计算机上运行,那么您可以在此选项中指定 localhost .

SMTP对象具有名为 sendmail 的实例方法,该方法通常用于执行邮件发送工作.它需要三个参数 :

  • 发件人 : 带有发件人地址的字符串.

  • receiver : 一个字符串列表,每个收件人一个.

  • 消息 : 消息作为字符串格式化为各种RFC中指定的格式.

示例

这是使用Python脚本发送一封电子邮件的简单方法.尝试一次和减去;

#!/usr/bin/python

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"

在这里,您已在消息中放置了一个基本电子邮件,使用三重引号,注意正确格式化标题.电子邮件需要发件人主题标题,并使用空行与电子邮件正文分隔.

要发送邮件,请使用 smtpObj 连接到本地计算机上的SMTP服务器,然后使用 sendmail 方法和message,from地址和目标地址作为参数(即使from和to地址在电子邮件本身内,这些并不总是用于路由邮件).

如果未在本地计算机上运行SMTP服务器,则可以使用 smtplib 客户端与远程SMTP服务器进行通信.除非您使用的是Webmail服务(例如Hotmail或Yahoo! Mail),否则您的电子邮件提供商必须为您提供可以提供的外发邮件服务器详细信息,如下所示;

smtplib.SMTP('mail.your-domain.com', 25)

发送HTML e -mail使用Python

使用Python发送文本消息时,所有内容都被视为简单文本.即使您在文本消息中包含HTML标记,它也会显示为简单文本,HTML标记将不会根据HTML语法进行格式化.但Python提供了将HTML消息作为实际HTML消息发送的选项.

发送电子邮件时,您可以指定Mime版本,内容类型和字符集来发送HTML e -mail.

示例

以下是将HTML内容作为电子邮件发送的示例.尝试一次和减去;

#!/usr/bin/python

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"

将附件作为电子邮件发送

要发送包含混合内容的电子邮件,需要设置内容类型标题为 multipart/mixed .然后,可以在边界中指定文本和附件部分.

边界以两个连字符开头,后跟一个唯一编号,该编号不能出现在邮件部分中电子邮件.表示电子邮件最后部分的最后边界也必须以两个连字符结尾.

附加文件应使用 pack("m")函数进行编码在传输之前有base64编码.

示例

以下是示例,它发送文件/tmp/test.txt 作为附件.尝试一次和减去;

#!/usr/bin/python

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"