現代社會中,自動發送郵件是一項非常有用的任務,無論是用于自動化報告的發送,還是用于通知、提醒等用途。Python提供了強大的庫來實現自動發送郵件的功能,本文將詳細介紹如何使用Python發送郵件,包括各種示例代碼,幫助大家更好地理解和應用這一功能。
在開始之前,確保已經完成以下準備工作:
Python的smtplib庫是用于發送電子郵件的標準庫之一。
以下是一個基本示例,演示如何使用smtplib庫發送簡單的文本郵件:
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
# 發件人和收件人信息
sender_email = "你的郵箱@gmail.com"
receiver_email = "收件人郵箱@example.com"
password = "你的郵箱密碼"
# 創建郵件
message = MIMEMultipart()
message["From"] = sender_email
message["To"] = receiver_email
message["Subject"] = "自動發送郵件示例"
# 添加郵件正文
message.attach(MIMEText("這是一封自動發送的郵件。", "plain"))
# 連接到SMTP服務器
with smtplib.SMTP("smtp.gmail.com", 587) as server:
server.starttls()
server.login(sender_email, password)
server.sendmail(sender_email, receiver_email, message.as_string())
print("郵件已發送成功!")
在這個示例中,首先導入必要的模塊,然后設置發件人、收件人和郵件主題。接下來,創建郵件正文,并使用smtplib庫連接到SMTP服務器,然后登錄并發送郵件。
如果需要發送帶附件的郵件,可以使用MIME(Multipurpose Internet Mail Extensions)來創建郵件。
以下是一個示例,演示如何發送帶附件的郵件:
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
# 發件人和收件人信息
sender_email = "你的郵箱@gmail.com"
receiver_email = "收件人郵箱@example.com"
password = "你的郵箱密碼"
# 創建郵件
message = MIMEMultipart()
message["From"] = sender_email
message["To"] = receiver_email
message["Subject"] = "帶附件的郵件示例"
# 添加郵件正文
message.attach(MIMEText("這是一封帶附件的郵件。", "plain"))
# 添加附件
with open("附件文件.txt", "rb") as attachment:
part = MIMEApplication(attachment.read(), Name="附件文件.txt")
part["Content-Disposition"] = f'attachment; filename="附件文件.txt"'
message.attach(part)
# 連接到SMTP服務器
with smtplib.SMTP("smtp.gmail.com", 587) as server:
server.starttls()
server.login(sender_email, password)
server.sendmail(sender_email, receiver_email, message.as_string())
print("帶附件的郵件已發送成功!")
在這個示例中,使用MIMEApplication來添加附件,并設置附件的文件名。然后,將附件添加到郵件中,發送郵件的過程與前一個示例相似。
除了smtplib庫外,還有一些第三方庫可以幫助你更輕松地發送郵件,例如yagmail和smtplib-cli。
以下是一個使用yagmail庫的示例:
import yagmail
# 發件人和收件人信息
sender_email = "你的郵箱@gmail.com"
receiver_email = "收件人郵箱@example.com"
password = "你的郵箱密碼"
# 創建yagmail客戶端
yag = yagmail.SMTP(sender_email, password)
# 發送郵件
subject = "使用yagmail發送郵件示例"
contents = ["這是一封使用yagmail發送的郵件。"]
yag.send(receiver_email, subject, contents)
print("郵件已發送成功!")
在這個示例中,首先安裝yagmail庫(使用pip install yagmail),然后創建yagmail客戶端并使用它發送郵件。這個庫提供了更簡單的接口來發送郵件。
除了發送普通文本郵件,還可以發送HTML格式的郵件,以更好地格式化內容。
以下是一個示例,演示如何發送HTML郵件:
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
# 發件人和收件人信息
sender_email = "你的郵箱@gmail.com"
receiver_email = "收件人郵箱@example.com"
password = "你的郵箱密碼"
# 創建郵件
message = MIMEMultipart()
message["From"] = sender_email
message["To"] = receiver_email
message["Subject"] = "HTML格式的郵件示例"
# 添加HTML郵件內容
html_content = """
<!DOCTYPE html>
<html>
<head>
<title>HTML郵件示例</title>
</head>
<body>
<h1>這是一封HTML格式的郵件</h1>
<p>你可以在郵件中使用HTML標記來格式化內容。</p>
</body>
</html>
"""
message.attach(MIMEText(html_content, "html"))
# 連接到SMTP服務器
with smtplib.SMTP("smtp.gmail.com", 587) as server:
server.starttls()
server.login(sender_email, password)
server.sendmail(sender_email, receiver_email, message.as_string())
print("HTML格式的郵件已發送成功!")
在這個示例中,創建了一個HTML郵件內容的字符串,并將其添加到郵件中。這樣,收件人將以HTML格式看到郵件內容。
如果需要在郵件中嵌入圖片,也可以很容易地實現。
以下是一個示例,演示如何發送帶圖片的郵件:
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
# 發件人和收件人信息
sender_email = "你的郵箱@gmail.com"
receiver_email = "收件人郵箱@example.com"
password = "你的郵箱密碼"
# 創建郵件
message = MIMEMultipart()
message["From"] = sender_email
message["To"] = receiver_email
message["Subject"] = "帶圖片的郵件示例"
# 添加文本內容
message.attach(MIMEText("這是一封帶圖片的郵件示例。", "plain"))
# 添加圖片
with open("image.png", "rb") as image_file:
image = MIMEImage(image_file.read(), name="image.png")
message.attach(image)
# 連接到SMTP服務器
with smtplib.SMTP("smtp.gmail.com", 587) as server:
server.starttls()
server.login(sender_email, password)
server.sendmail(sender_email, receiver_email, message.as_string())
print("帶圖片的郵件已發送成功!")
在這個示例中,通過MIMEImage模塊添加了一張圖片,并將其嵌入到郵件中。這樣,收件人將能夠在郵件中看到圖片。
除了smtplib庫外,還可以使用SMTP庫來發送郵件。
以下是一個使用SMTP庫的示例:
import smtplib
# 發件人和收件人信息
sender_email = "你的郵箱@gmail.com"
receiver_email = "收件人郵箱@example.com"
password = "你的郵箱密碼"
# 創建SMTP連接
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
# 登錄到SMTP服務器
server.login(sender_email, password)
# 創建郵件內容
subject = "SMTP庫發送郵件示例"
body = "這是一封使用SMTP庫發送的郵件。"
message = f"Subject: {subject}\n\n{body}"
# 發送郵件
server.sendmail(sender_email, receiver_email, message)
# 關閉SMTP連接
server.quit()
print("SMTP庫發送的郵件已發送成功!")
在這個示例中,首先創建了SMTP連接,然后登錄到SMTP服務器并發送郵件。這種方法也可以用來發送郵件。
希望通過本文的詳細教程和示例代碼,現在已經學會了如何使用Python自動發送郵件,包括發送普通文本郵件、HTML郵件、帶附件的郵件和帶圖片的郵件。自動發送郵件是一個非常有用的任務,可以幫助大家自動化通知、報告和通信。無論你是初學者還是有經驗的開發者,都可以使用這些技巧來實現自動發送郵件的需求。
源 | 數據分析與統計學之美
這是一個很好的Python自動化的案例。對于小公司,采用手動方式一個個發送郵件還是可以的。如果一個上百號,上千號,或者更大規模的公司,我們再一個個發送工資條郵件,就太浪費時間了。鑒于此,我寫了一個這樣的程序,實現Python自動化群發工資條的功能。
原始數據源如下:
最終效果如下:
看到這里,你肯定也覺得很好玩兒吧?那么這樣一個自動化程序,應該怎么做呢?接著往下看。
其實這樣一個代碼,總結下來,就只有如下5步:
① 導入相關模塊;
② 讀取Excel表格;
③ 登錄郵箱;
④ 準備要發送的郵件正文;
⑤ 發送郵件;
from openpyxl import load_workbook # 用于操作Excel的模塊
import yagmail # 用于存儲郵箱地址和密碼的模塊
import keyring # 用于記錄你郵箱地址和密碼的模塊
from datetime import * # 用于獲取當前系統時間的模塊
# 加載Excel文件
wb = load_workbook("群發工資條.xlsx",data_only=True)
sheet = wb.active
print(sheet)
-------------------------------------------------------
for row in sheet:
row_text = ""
for cell in row:
if cell.column == "B":
continue
row_text += f"{cell.value},"
print(row_text)
------------------------------------------------------
print("年:", date.today.year)
print("月:", date.today.month)
print(f"{date.today.year}-{date.today.month}月")
結果如下:
yagmail.register("1127421544@qq.com","flmyucvntuvbjbcb")
pwd = keyring.get_password("yagmail","1127421544@qq.com")
yag = yagmail.SMTP(user="1127421544@qq.com",host="smtp.qq.com",password=pwd)
需要注意的是:第一行代碼是用于存儲你的郵件地址和密碼。第二行代碼使用keyring是為了記錄你的郵件地址和密碼。第三行代碼直接登錄郵箱。
關于Python怎么發送郵件,我之前寫了一篇文章,進行了詳細的介紹,下方是這篇文章的鏈接,大家可以參考。
Python發郵件:http://suo.im/60ylZ1
4)準備要發送的正文
由于發送的正文里面,需要我們發送一個帶表格的郵件,這就有必要我們了解一點前端知識。因此,我在最后面花一個章節為大家講解。
yag.send(f"{email}",f"數據分析與統計學之美有限公司{date.today.year}-{date.today.month}月工資情況",contents)
上述代碼共有3個參數:第一個參數是收件人的郵箱;第二個參數是郵件的標題;第三個參數是發送的內容。
會用Python發送郵件的人都知道,郵件正文內容可以寫html代碼。你可能覺得自己啥也不會,但是不用擔心,我們不需要學習太高深的前端代碼,做過爬蟲的人耳濡目染,都能夠看懂一些。
我們可以直接用Pycharm創建一個新的html文件,里面會顯示初始的前端代碼,我們進行簡單的添加,就可以獲得一個表格啦!
最終在瀏覽器中顯示效果如下:
從上圖中根本看不出這是一個表格,那是因為我們沒有為它設置一個樣式,下面要做的就是為表格設置樣式。
最終在瀏覽器中顯示效果如下:
從上圖可以看出,整個前端代碼就是用一些列的標簽組成,同時標簽都是成對出現的。因此,在Python中寫前端代碼時,只需要在對應位置添加對應的標簽即可。
for row in sheet:
row_text = "<tr>"
for cell in row:
if cell.column == "B":
continue
row_text += f"<td>{cell.value}</td>"
row_text += "</tr>"
print("\n")
print(row_text)
結果如下:
為了文章的完整性,我在文章最后放上我的代碼。但是限于文章篇幅,最后我只粘貼一張圖片,詳細代碼,大家可以去文末獲取。
avaMail是SUN提供給廣大Java開發人員的一款郵件發送和接受的一款開源類庫,支持常用的郵件協議,如:SMTP、POP3、IMAP,開發人員使用JavaMail編寫郵件程序時,不再需要考慮底層的通訊細節如:Socket而是關注在邏輯層面。JavaMail可以發送各種復雜MIME格式的郵件內容,注意JavaMail僅支持JDK4及以上版本。雖然JavaMail是JDK的API但它并沒有直接加入JDK中,所以我們需要另外添加依賴,下面我們開始講解本章的內容。
將Java提供的JavaMail類庫與SpringBoot項目進行整合,并且簡單封裝下JavaMail類庫。
本章項目無關Web相關內容,所以創建項目時選擇Jar形式創建,并且不需要預先導入依賴。項目結構如下圖1所示:
圖1
可以看到上圖1內容,多余的依賴并沒有添加,如果你選擇的是War項目也沒有關系名,那好,我們接下來把我們的主角JavaMail請出來吧,把對應的依賴添加到pom.xml配置文件內。如下圖2所示:
圖2
依賴我們已經導入成功了,接下來我們開始編寫JavaMail的封裝,我這里簡單的對JavaMail做出封裝,如果您需要更完美的封裝,請對我的代碼做出修改即可,先來編寫一個MailEntity類來保存發送郵件時需要的參數字段,如下圖3所示:
圖3
我們的MailEntity包含了上圖3的字段內容,都是一些必填選項,下面我們來創建一個MailSender也就是郵件發送者實體,主要作用就是用來配置發送郵件參數以及執行發送郵件,代碼如下圖4、5、6、7、8所示:
圖4
圖5
圖6
圖7
圖8
下次編寫文章使用MarkDown方式來寫,類過長貼起來圖挺費勁。上面可以看到我使用到了MailContentTypeEnum以及PropertiesUtil工具類。
MailContentTypeEnum
這是一個我自定義的枚舉類型,枚舉類型包含了郵件內容的類型,目前我僅僅添加了兩種,一種是html另外一種則是text形式,具體代碼如下圖9所示:
圖9
PropertiesUtil
PropertiesUtil是用于讀取*.properties配置文件的工具類,使用JavaMail需要配置SMTP以及用戶名、密碼等也就是MailEntity內的字段,那么我們在/resource目錄下創建一個名字叫mail.properties的配置文件,里面存放我們定義的郵件發送參數配置,這樣方便修改,我分別貼出PropertiesUtil、mail.properties代碼內容,如下圖10、圖11所示:
圖10
圖11
我使用的QQ郵箱地址作為測試,如果你需要使用你的QQ地址作為測試,請先到QQ郵箱開啟POP3/SMTP服務,開啟步驟如下。
開啟POP3/SMTP
第一步:進入郵箱點擊“設置”,如下圖12所示:
圖12
第二步:點擊“賬戶”后往下拉找到POP3/IMAP/SMTP...,如下圖13所示:
圖13
我的POP3以及SMTP以及開啟了所以這里顯示的狀態是已開啟,如果您第一次使用QQ郵箱的SMTP服務,請點擊“開啟”并且按照提示步驟完成獲取“授權碼”即可,授權碼就是發送郵件參數的smtp.pwd屬性。
我們創建一個TestMail類來作為測試入口,因為我們的項目是jar形式,所以我們直接新建一個main方法直接調用發送郵件就可以了,如下圖14所示測試代碼:
圖14
我是向我的釘釘郵箱發送了一條文本類型的測試郵件,發送效果圖如下圖15所示:
圖15
可以看到我們的郵件收到了,證明我們已經完成了郵件發送的功能了,但是你在發送中配置mail.properties文件時配置昵稱的時候最有可能出現的問題就是亂碼,那么該問題如何解決呢?
昵稱亂碼問題解決
第一步:修改InteiiJ IDEA工具的properties文件的編碼,點擊File->Setting->Editor->File Encodings將下面的Default encoding設置為UTF-8,如下圖16所示:
圖16
那么我們的mail.properties內使用ASCII編碼進行配置昵稱就可以了,具體中文如何轉換ASCII,請大家訪問tool.oschina.net/encode在線轉換即可。修改完成后再次測試發送郵件,你就會發現亂碼問題解決了。
上述內容就是本章的所有講解,本章主要講解了在SpringBoot項目內是如何使用JavaMail來進行發送簡單郵件,簡單封裝了下MailSender類以及對象實體MailEntity,如果需要發送HTML內容的郵件修改contentType(MailContentTypeEnum.HTML)然后content("html代碼")即可。
本號已開設如下二十大專題,歡迎關注,查看相關專題!
*請認真填寫需求信息,我們會在24小時內與您取得聯系。