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)