1. Gmail 的 SMTP 伺服器
SMTP(简单邮件传输协定) 是网际网路电子邮件传送的基础协定,负责处理电子邮件的发送与接收。在这篇文章中,我们会使用 Gmail 的 SMTP 伺服器来发送电子邮件。
Gmail 的 SMTP 伺服器资讯如下:
伺服器地址:smtp.gmail.com
端口号:587(用于 TLS 安全传输)
当我们发送电子邮件时,SMTP 伺服器会充当中介,帮助我们将邮件从寄件者传送到收件者的邮件伺服器。
2. TLS(传输层安全性协定)
TLS(Transport Layer Security) 是一种加密协定,专为在网路上提供通信安全性而设计。当我们发送电子邮件时,启用 TLS 可以加密邮件的内容,确保在邮件传送过程中,资料不会被拦截或洩露。
在这篇文章的程式码中,我们会使用 starttls() 方法来启用 TLS 加密。这是目前 Gmail SMTP 伺服器所要求的安全措施,确保我们的邮件在发送过程中是安全的。
3. Gmail 应用程式密码
在 Gmail 的安全性设置中,Google 不再允许直接使用帐户密码进行 SMTP 认证。如果你想要让应用程式(如我们的 Python 程式)能够使用 Gmail 发送邮件,你需要生成一个应用程式专用密码。
如何生成 Gmail 应用程式密码:
- 登入你的 Gmail 帐户。
- 前往 Google 帐户的安全性页面。
- 在「登入 Google」部分,启用两步骤验证。
- 启用后,你将看到「应用程式密码」选项,点击生成并选择「邮件」和「使用的设备」。
- 生成的 16 位应用程式密码即是我们稍后程式码中使用的密码。
- 这个密码与你的 Gmail 帐号密码不同,且专门用于特定应用程式的登入使用,这样可以提升帐号的安全性。
两步骤验证
应用程式密码生成应用程式密码(此密码为后续使用)
4. Python 程式码实作
现在,我们有了 SMTP 伺服器资讯、TLS 安全性认证的知识,以及 Gmail 应用程式密码,接下来我们将使用 Python 撰写程式,透过 Gmail 发送电子邮件。
定义一个名为 send_email 的函式 :
def send_email(sender_email, receiver_email, password, subject, body):
"""
寄送电子邮件的函式
参数:
- sender_email: 寄件者的 Email
- receiver_email: 收件者的 Email
- password: 寄件者 Gmail 的应用程式密码
- subject: 邮件主题
- body: 邮件内容
"""
该函式接受五个参数:
- sender_email: 发送电子邮件的帐号。
- receiver_email: 接收者的电子邮件地址。
- password: Gmail 应用程式的密码(这里应使用专门的应用程式密码,而不是一般帐户密码)。
- subject: 邮件的主题。
- body: 邮件的内容,通常是文字。
设置电子邮件内容 :
# 建立 MIMEMultipart 物件
message = MIMEMultipart()
message["From"] = sender_email
message["To"] = receiver_email
message["Subject"] = subject
这段程式码使用 MIMEMultipart 建立一个多部分的电子邮件物件,这样可以方便地附加主题、收件者和寄件者等资讯。
添加邮件内容
# 将邮件内容附加到邮件中
message.attach(MIMEText(body, "plain"))
- 这行程式将纯文字形式的邮件内容附加到 MIMEMultipart 物件中。
- MIMEText 可用来定义邮件的内容格式,这里我们使用的是 "plain",表示邮件内容为纯文字格式。
- 如果需要发送 HTML 格式的邮件,可以将 "plain" 改为 "html"。
设定 Gmail 的 SMTP 伺服器
# 使用 Gmail 的 SMTP 伺服器
smtp_server = "smtp.gmail.com"
port = 587 # Gmail 的 SMTP 伺服器端口
- 这里定义了 Gmail 的 SMTP 伺服器地址和端口。
- Gmail 使用 smtp.gmail.com 来处理 SMTP(简单邮件传输协定)请求,并且端口号 587 是用于 TLS 加密连线。
发送Gmail邮件
try:
# 连线到 Gmail 的 SMTP 伺服器
server = smtplib.SMTP(smtp_server, port)
server.starttls() # 启用安全连线 (TLS)
# 登入 Gmail 帐户
server.login(sender_email, password)
# 寄送邮件
server.sendmail(sender_email, receiver_email, message.as_string())
print("邮件已成功发送")
except Exception as e:
print(f"发送邮件时发生错误: {e}")
finally:
# 关闭连线
server.quit()
1. smtplib.SMTP 用来建立一个到 Gmail SMTP 伺服器的连线。
2. server.starttls() 启用 TLS(传输层安全性协定),这是确保资料传输过程中的加密保护。
3. server.login 使用寄件者的电子邮件和应用程式密码进行身份验证。
4. server.sendmail 发送邮件,并将 message 转换为字串格式。
在 try-except 结构中,若有任何错误发生,将捕获并打印出错误讯息,最后确保无论如何都会关闭与 SMTP 伺服器的连线。
范例用法
# 范例用法
sender = "您的寄件电子邮件@gmail.com"
receiver = "您的接收电子邮件@gmail.com"
password = "应用程式密码"
subject = "有关于你的程式码"
body = """
您好,
这是一封简单的纯文字邮件,感谢您对我们的支持。
祝好,
发件者姓名
"""
send_email(sender, receiver, password, subject, body)
透过 Gmail 帐号寄送一封简单的电子邮件。
注意事项
- Gmail 应用程式密码:由于 Google 加强了安全性,因此不能使用 Gmail 帐号的普通密码来进行 SMTP 认证,必须产生专用的应用程式密码。
- 启用安全性较低的应用程式存取:如果遇到登入失败的情况,可能需要在 Gmail 帐户设定中允许安全性较低的应用程式存取。
这篇文章简单介绍了如何透过 Python 发送电子邮件。这个方法不仅能寄送纯文字邮件,还可以进一步扩展来发送包含附件、图片、甚至 HTML 格式的邮件。
完整程式码
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
def send_email(sender_email, receiver_email, password, subject, body):
"""
寄送电子邮件的函式
参数:
- sender_email: 寄件者的 Email
- receiver_email: 收件者的 Email
- password: 寄件者 Gmail 的应用程式密码
- subject: 邮件主题
- body: 邮件内容
"""
# 建立 MIMEMultipart 物件
message = MIMEMultipart()
message["From"] = sender_email
message["To"] = receiver_email
message["Subject"] = subject
# 将邮件内容附加到邮件中
message.attach(MIMEText(body, "plain"))
# 使用 Gmail 的 SMTP 伺服器
smtp_server = "smtp.gmail.com"
port = 587 # Gmail 的 SMTP 伺服器端口
try:
# 连线到 Gmail 的 SMTP 伺服器
server = smtplib.SMTP(smtp_server, port)
server.starttls() # 启用安全连线 (TLS)
# 登入 Gmail 帐户
server.login(sender_email, password)
# 寄送邮件
server.sendmail(sender_email, receiver_email, message.as_string())
print("邮件已成功发送")
except Exception as e:
print(f"发送邮件时发生错误: {e}")
finally:
# 关闭连线
server.quit()
# 范例用法
sender = "your_email@gmail.com"
receiver = "recipient_email@gmail.com"
password = "your_application_password"
subject = "测试邮件"
body = """
您好,
这是一封由 Python 程式发送的测试邮件。
祝好,
发件者姓名
"""
send_email(sender, receiver, password, subject, body)