在现今大多数的网站,不管是注册成功、重新设定密码、优惠消息或新商品上架等,都会透过电子邮件来通知客户,是网站中不可或缺的传递消息方式。除此之外,也有开发人员在运行爬虫时,会将所爬取的信息透过电子邮件来通知。从以上的情境可以知道,电子邮件使用的频繁及对网站功能的重要性,所以本文将利用Visual Studio Code开发工具,介绍如何透过Python来寄送电子邮件,并且客制化邮件样版,重点包含:
基本电子邮件内容
取得Gmail应用程式密码
设定SMTP伺服器(SMTP Server)
电子邮件内容增加图片
客制化邮件样板(Templates)
一、基本电子邮件内容
首先,引用Python email标准函式库(Standard Library)中的MIMEMultipart类别,如下范例:
from email.mime.multipart import MIMEMultipart
在email套件(Package)下的mime(Multipurpose Internet Mail Extensions)子套件,为网际网络媒体类型,定义了在网络上传输电子邮件的格式标准,在其底下的multipart子套件中,MIMEMultipart类别能够让电子邮件的格式包含纯文字或HTML的内容。而一封基本的电子邮件,分别有标题、寄件者、收件者及内容,透过MIMEMultipart物件即可进行各栏位的资料设定,如下范例:
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
content = MIMEMultipart() #建立MIMEMultipart物件
content["subject"] = "Learn Code With Mike" #邮件标题
content["from"] = "pydemo123@gmail.com" #寄件者
content["to"] = "example@gmail.com" #收件者
content.attach(MIMEText("Demo python send email")) #邮件內容
范例中,邮件内容使用MIMEMultipart物件的attach方法(Method)进行设定,而内容需引用MIMEText类别来建立物件,第一个参数传入文字内容,第二个参数可指定纯文字或HTML,预设为纯文字。HTML的邮件内容,在本文第五节客制化邮件样版时,再来进行说明。
二、取得Gmail应用程式密码
在Python专案中,要透过Gmail的SMTP伺服器来寄送电子邮件的话,需取得应用程式的专属密码,因为Google认为Python的smtplib函式库是高风险的,所以用原Gmail密码是无法透过应用程式来寄送电子邮件。以下为取得应用程式密码的步骤:
步骤一:进入寄件者的Google帐户。
步骤二:点击左边栏的安全性页签,接着设定两步骤验证。
步骤三:两步骤设定完成后,会看到下方多了应用程序密码。
步骤四:在选取应用程序的地方选择其他。
步骤五:接着输入应用程序的名称,点击产生。
步骤六:最后即可取得应用程序的密码。
三、设定SMTP服务器(SMTP Server)
Python专案中的电子邮件内容完成后,接下来就要设定Gmail的SMTP完全来寄送,设定方式如下范例:
import smtplib
with smtplib.SMTP(host="smtp.gmail.com", port="587") as smtp: # 設定SMTP伺服器
try:
smtp.ehlo() # 驗證SMTP伺服器
smtp.starttls() # 建立加密傳輸
smtp.login("pydemo123@gmail.com", "應用程式密碼") # 登入寄件者gmail
smtp.send_message(content) # 寄送郵件
print("Complete!")
except Exception as e:
print("Error message: ", e)
引用smtplib模组(Module),接着根据使用的SMTP完全,透过关键字参数(Keyword Argument)指定服务器位置及埠号。另外,这边利用Python的with陈述式,当邮件寄送完成后,自动释放资源。建立SMTP物件后,接下来利用ehlo()方法来验证SMTP服务器及埠号是否正确,下一步呼叫starttls()方法建立TLS (Transport Layer Security)传输,为一种网络传输安全协定,用来保护资料的安全及完整性。最后登入寄件者的Gmail帐户,并且寄出邮件。这边建议使用Python例外处理机制,因为在寄送电子邮件的过程中,非常有机会发生例外错误。 登入收件者的Gmail,即可看到刚刚所寄出的电子邮件,如下范例:
四、电子邮件内容增加图片
如果想要在电子邮件中加入图片,则需在Python专案中引用MIMEImage类别,并且引用pathlib函式库来读取图片,如下范例:
from email.mime.image import MIMEImage
from pathlib import Path
在专案中加入一张图片,本文以无尾熊koala.jpg来做示范,接着在设定邮件内容的地方,建立MIMEImage物件,传入图片的二进位码,可透过Path物件的read_bytes()方法来进行读取,如下范例:
content = MIMEMultipart() # 建立MIMEMultipart物件
content["subject"] = "Learn Code With Mike" # 郵件標題
content["from"] = "pydemo123@gmail.com" # 寄件者
content["to"] = "example@gmail.com" # 收件者
content.attach(MIMEText("Demo python send email")) # 郵件純文字內容
content.attach(MIMEImage(Path("koala.jpg").read_bytes())) # 郵件圖片內容
寄送完成后,登入收件者的Gmail,就可以看到电子邮件的内容成功增加了图片,如下范例:
五、客制化邮件样板(Templates)
实务上,除了纯文字的邮件外,通常有机会需要依情况客制化邮件内容的格式,举例来说,有些文字需要加上颜色、粗体及超连结等,这时候就可以使用HTML来依不同的需求分别客制化邮件样板。在Python专案中,新增一个名为success_template.html的档案,假设当使用者注册成功,您想要使用这个电子邮件样版来进行通知。在开始设计样邮件版前,这边教大家一个小技巧,开启success_template.html档案后,在Visual Studio Code的右下角,可以看到语言模式,如下范例:
如果已经是HTML,无需变动,如果显示其他语言则点选红框处,在搜寻的地方输入HTML,选择即可。接下来在success_template.html档案中的第一行输入!符号,按下Tab键,就会自动产生基本的HTML代码,如下范例:
由于电子邮件样版不需要标签中的内容,所以可以进行删除,接着在标签的区域中输入邮件的格式化内容,如下范例:
此邮件样版中,设定了一个user变数,前面加了$符号,用来表示此参数为Python程式码动态传入,并且显示粗体字型。而下方的Google字串则增加了超连结。回到Python主程式,引用string模组(Module)的Template类别,用来替换邮件样版中的参数值。如下范例:
from string import Template
接着,建立Template物件,传入邮件样版内容,可以透过Path物件的read_text()方法来达成。最后呼叫Template物件的substitute()方法来设定邮件样版中的参数值,其参数可传入Python的字典(Dictionary)或关键字参数(Keyword Argument),如下范例:
template = Template(Path("success_template.html").read_text())
body = template.substitute({ "user": "Mike" })
在MIMEMultipart物件的指定邮件内容地方传入body ,并且设定为HTML的格式,如下范例第10行:
content = MIMEMultipart() # 建立MIMEMultipart物件
content["subject"] = "Learn Code With Mike" # 郵件標題
content["from"] = "pydemo123@gmail.com" # 寄件者
content["to"] = "example@gmail.com" # 收件者
template = Template(Path("success_template.html").read_text())
body = template.substitute({ "user": "Mike" })
content.attach(MIMEText(body, "html")) # HTML郵件內容
登入收件者的Gmail,即可看到客制化邮件样版的结果,如下范例:
六、小结
希望看完本文能够了解如何透过Python来寄送电子邮件,并且有能力客制化所需的邮件样版,往后即可应用在各自的专案上。如果在练习的过程中有遇到任何问题,欢迎留言分享。