串接 Gmail 寄送电子邮件
这篇教学会介绍使用 Python 的 smtplib 和 email 标准函数库,实作出串接 Gmail 并寄送电子邮件的功能。
快速导览:
本篇使用的 Python 版本为 3.7.12,所有范例可使用 Google Colab 实作,不用安装任何软件 ( 参考:使用 Google Colab )
Gmail 应用程序设定
要使用第三方程序 ( 例如 Python ) 串接 Gmail 寄送电子邮件,必须要设定 Google 的应用程序密码,首先使用自己的 Google 账号登录 Google,切换到个人设定页面,选择“安全性”页签,找到“登录 Google > 应用程序密码”。
Google 于 2021 年已经移除“低安全性应用程序存取权”的功能,一律改用设定应用程序密码的方式。
再次输入密码后,应用程序选择“邮件”,并选择自己执行 Python 的操作系统 ( 范例使用 Mac )。
点击“产生”按钮,就会产生一组邮件专属的应用程序密码,这组密码“只会出现一次”,可使用记事本纪录 ( 待会范例会使用 ),如果发现有不寻常的使用状况,删除后再重新产生一组新的即可。
使用 smtplib 函数库
smtplib 是 Python 内建的标准函数库,使用这个函数库,可以透过 SMTP 寄送电子邮件,下方列出 smtplib 函数库常用的方法:
SMTP 是“简单邮递传送协定 Simple Mail Transfer Protocol”的缩写,规定了电子邮件使用的格式、加密、以及邮件服务器之间的传递方式 ( 参考:SMTP 维基百科 )。
| 方法 | 参数 | 说明 |
|---|---|---|
| smtplib.SMTP() | host, port | 指定 SMTP 服务器网址以及连接埠号 ( 参考:透过其他电子邮件平台查看 Gmail )。 |
| smtp.ehlo() | 使用 EHLO 向服务器表明自己的身份。 | |
| smtp.starttls() | 将 SMTP 连接设为 TLS ( 传输层安全 ) 模式,传送的所有 SMTP 命令都会被加密。 | |
| smtp.login() | email, password | 设定登录 SMTP 服务器的 email 以及登录的密码。 |
| smtp.sendmail() | from, to, msg | 设定寄信的 email、收信的 email 和信件内容,信件内容限制只能英文,寄信成功后会返回一个空字典 {}。 |
| smtp.sendmessage() | msg | 根据 MIME 消息的内容寄信,寄信成功后会返回一个空字典 {}。 |
| smtp.quit() | 中断与 SMTP 服务器的连接。 |
修改下方的程序码,将自己的 email 与刚刚设定“邮件专属的应用程序密码”填入,执行后,就会透过 Gmail 寄出电子邮件。
msg 的格式为“Subject:标题内容\n信件内容”,第一个“\n”换行符号后方的是信件内容。
import smtplib
smtp = smtplib.SMTP('smtp.gmail.com', 587)
smtp.ehlo()
smtp.starttls()
smtp.login('你的信箱','你的密碼')
from_addr = '你的信箱'
to_addr = '收件人信箱'
msg = 'Subject:title\nHello\nWorld!'
status = smtp.sendmail(from_addr, to_addr, msg)
if status == {}:
print('郵件傳送成功!')
else:
print('郵件傳送失敗...')
smtp.quit()
使用 email 函数库
smtplib 函数库虽然可以寄信,但却无法使用 MIME 协定传送中文、图片或影音等非 ASCII 编码的文件,需要搭配 email 函数库,才能使用 MIME 协定寄送电子邮件。
MIME 是“多用途互联网邮件扩展 Multipurpose Internet Mail Extensions”,表示一个可以扩展了电子邮件的互联网协定,透过这个协定,电子邮件可以支援非 ASCII 编码的文件 ( 参考:MIME 维基百科 )。
MIME 分成两种格式,一种是 type,一种是 subtype,下方列出两种格式里常见项目:
| type | 说明 |
|---|---|
| text | 文字 |
| image | 图片 |
| audio | 声音 |
| video | 影片 |
| application | 应用程序、二进制内容 |
| multipart | 多种格式所组成的内容 |
| subtype | 说明 |
|---|---|
| text/plain | 纯文字 |
| text/html | HTML 代码 |
| image/jpeg | jpg 图片 |
| image/gif | gif 图片 |
| image/png | png 图片 |
| video/mpeg | mpeg 影片 |
| video/mp4 | mp4 影片 |
| video/ogg | ogg 影片 |
| application/pdf | pdf 文件 |
| application/msword | word 文件 |
| application/xhrml+xml | XHTML 文件 |
下方的程序码,将原本的 smtplib 结合 email 函数库,使用 MIMEText 设定消息内容,并设定 Subject、From、To...等邮件属性,最后使用 smtp.send_message 方法寄送电子邮件。
import smtplib
from email.mime.text import MIMEText
msg = MIMEText('你好呀!這是用 Python 寄的信~', 'plain', 'utf-8') # 郵件內文
msg['Subject'] = 'test測試' # 郵件標題
msg['From'] = 'oxxo' # 暱稱或是 email
msg['To'] = '[email protected]' # 收件人 email
msg['Cc'] = '[email protected], [email protected]' # 副本收件人 email ( 開頭的 C 大寫 )
msg['Bcc'] = '[email protected], [email protected]' # 密件副本收件人 email
smtp = smtplib.SMTP('smtp.gmail.com', 587)
smtp.ehlo()
smtp.starttls()
smtp.login('你的信箱','你的密碼')
status = smtp.send_message(msg) # 改成 send_message
if status == {}:
print('郵件傳送成功!')
else:
print('郵件傳送失敗!')
smtp.quit()
HTML 网页格式的 email
如果要寄送 HTML 网页格式的 email,只要将原本 MIMEText 里的 plain 换成 html,就能寄送 HTML 格式的信件,下方的程序码执行后,会寄出带有 h1 标题和两个 div 的信件。
import smtplib
from email.mime.text import MIMEText
html = '''
<h1>hello</h1>
<div>這是 HTML 的內容</div>
<div style="color:red">紅色的字</div>
'''
mail = MIMEText(html, 'html', 'utf-8') # plain 換成 html,就能寄送 HTML 格式的信件
mail['Subject']='html 的信'
mail['From']='oxxo'
mail['To']='[email protected]'
smtp = smtplib.SMTP('smtp.gmail.com', 587)
smtp.ehlo()
smtp.starttls()
smtp.login('你的信箱','你的密碼')
status = smtp.send_message(mail)
print(status)
smtp.quit()
附加文件的 email
如果希望传送的文件不仅有文字,也有附加文件,就需要使用 email 的 MIMEMultipart() 方法,设定传送多种格式所组成的内容,再透过 attach 将所需的内容加入,下方的程序码不仅可以传送 HTML 网页内容的信件,也使用了 open 的方法打开一张图片作为附加文件。
import smtplib
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
html = '''
<h1>hello</h1>
<div>這是 HTML 的內容</div>
<div style="color:red">紅色的字</div>
'''
msg = MIMEMultipart() # 使用多種格式所組成的內容
msg.attach(MIMEText(html, 'html', 'utf-8')) # 加入 HTML 內容
# 使用 python 內建的 open 方法開啟指定目錄下的檔案
with open('/content/drive/MyDrive/Colab Notebooks/meme.jpg', 'rb') as file:
img = file.read()
attach_file = MIMEApplication(img, Name='meme.jpg') # 設定附加檔案圖片
msg.attach(attach_file) # 加入附加檔案圖片
msg['Subject']='附件是一張搞笑的圖'
msg['From']='oxxo'
msg['To']='[email protected]'
smtp = smtplib.SMTP('smtp.gmail.com', 587)
smtp.ehlo()
smtp.starttls()
smtp.login('[email protected]','你申請的應用程式密碼')
status = smtp.send_message(msg)
print(status)
smtp.quit()
参考数据
微信扫码关注
抖音扫码关注