小王,給這2000個客戶發一下節日祝福的郵件

来源:https://www.cnblogs.com/lwsbc/archive/2022/04/07/16113978.html
-Advertisement-
Play Games

背景 在項目使用了Spring Security之後,很多介面無法訪問了,從瀏覽器的網路調試窗看到的是CORS的報錯和403的報錯 分析 我們先來看一下CORS是什麼,和它很相似的CSRF是什麼,在SpringSecurity中如何配置以及起的什麼作用 CORS(Cross Origin Resou ...


file

【閱讀全文】
演示示例使用QQ郵箱發送郵件,先獲取自己的QQ郵箱的授權碼。因為後面發送郵件時需要使用自己的授權碼作為郵箱的密碼登錄郵箱最後達到發送郵件的目的。

file

file

將UI處理的相關的界麵包導入進來

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *

# 應用操作相關的庫
import sys

# 郵件發送相關的庫
import smtplib
from email.mime.text import MIMEText

為了不和郵件發送的UI界面主線程產生衝突,使用QThread子線程的方式製作郵件發送。

class EmailWork(QThread):
    trigger = pyqtSignal(str)
    finished = pyqtSignal(bool)

    def __init__(self, parent=None):
        super(EmailWork, self).__init__(parent)
        self.parent = parent
        self.working = True

    def __del__(self):
        self.working = False
        self.wait()

    def run(self):
        email_subject_text = self.parent.email_subject_text.text().strip()
        recipient_text = self.parent.recipient_text.text().strip()
        current_text = self.parent.current_text.toPlainText().strip()

        print(email_subject_text)
        print(recipient_text)
        print(current_text)

        self.trigger.emit("郵件信息讀取完成!")

        # 發件人郵箱
        send_email_name = '[email protected]'
        # 發件人授權碼
        passwd = 'fjyjqlzxprzihcii'

        self.trigger.emit(send_email_name)
        self.trigger.emit("發件人信息初始化完成!")
        # 收件人郵箱
        msg_to = recipient_text.split(';')
        self.trigger.emit(recipient_text)
        self.trigger.emit("收件人信息初始化完成!")
        print(msg_to)
        # 設置郵件
        msg = MIMEText(current_text)
        msg['subject'] = email_subject_text
        # 設置發件人
        msg['From'] = '一匹來自北方的狼'
        # 設置收件人
        msg['To'] = ';'.join(msg_to)
        # 連接伺服器
        smtp = smtplib.SMTP_SSL('smtp.qq.com', 465)
        self.trigger.emit("伺服器連接成功!")
        # 登錄郵箱
        smtp.login(send_email_name, passwd)
        self.trigger.emit("郵箱登錄成功!")
        # 發送郵件
        smtp.sendmail(send_email_name, msg_to, msg.as_string())
        self.trigger.emit("郵件發送成功!")
        self.finished.emit(True)

下麵是主頁面的UI佈局及信號量的代碼塊。

class StmpEmail(QWidget):
    def __init__(self):
        super(StmpEmail, self).__init__()
        self.init_ui()

    def init_ui(self):

        self.setWindowTitle('批量郵件工具  公眾號:[Python 集中營]')
        self.setWindowIcon(QIcon('郵件.ico'))
        self.setFixedSize(500, 400)

        hbox = QHBoxLayout()
        self.send_btn = QPushButton()
        self.send_btn.setText('發送')
        self.send_btn.clicked.connect(self.send_btn_click)

        self.brower = QTextBrowser()
        self.brower.setFont(QFont('宋體', 8))
        self.brower.setReadOnly(True)
        self.brower.setPlaceholderText('執行進度顯示區域...')
        self.brower.ensureCursorVisible()

        hbox.addWidget(self.send_btn)

        self.email_subject_text = QLineEdit()
        self.email_subject_text.setPlaceholderText('請輸入主題')

        self.recipient_text = QLineEdit()
        self.recipient_text.setPlaceholderText('請輸入收件人,示例:[email protected];[email protected]')

        self.current_text = QTextEdit()
        self.current_text.setPlaceholderText('請輸入郵件正文')

        self.thread_ = EmailWork(self)
        self.thread_.trigger.connect(self.update_log)
        self.thread_.finished.connect(self.finished)

        vbox = QVBoxLayout()

        vbox.addWidget(self.email_subject_text)
        vbox.addWidget(self.recipient_text)
        vbox.addWidget(self.current_text)
        vbox.addWidget(self.brower)
        vbox.addLayout(hbox)

        self.setLayout(vbox)

    def update_log(self, text):
        '''
        槽函數:向文本瀏覽器中寫入內容
        :param text:
        :return:
        '''
        cursor = self.brower.textCursor()
        cursor.movePosition(QTextCursor.End)
        self.brower.append(text)
        self.brower.setTextCursor(cursor)
        self.brower.ensureCursorVisible()

    def finished(self, finished):
        if finished is True:
            self.send_btn.setEnabled(True)

    def send_btn_click(self):
        self.send_btn.setEnabled(False)
        self.thread_.start()

最後,通過main函數將頁面佈局加入主體迴圈即可。

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = StmpEmail()
    main.show()
    sys.exit(app.exec_())

以上就是郵件發送的主要代碼塊了,copy到自己的開發工具中運行即可(前提是你已經安裝好了需要的python模塊)。
有需要下載完整源代碼請在公眾號內回覆'批量郵件工具'即可獲取下載鏈接。

file

【往期精選】

python 一行命令開啟網路間的文件共用...

PyQt5 批量刪除 Excel 重覆數據,多個文件、自定義重覆項一鍵刪除...

再見XShell,這款國人開源的終端命令行工具更nice!

python 表情包下載器,輕鬆下載上萬個表情包、鬥圖不用愁...

Python 自動清理電腦垃圾文件,一鍵啟動即可...

有了jmespath,處理python中的json數據就變成了一種享受...

解鎖一個新技能,如何在Python代碼中使用表情包...

萬能的list列表,python中的堆棧、隊列實現全靠它!

該怎麼用pyqt5來實現數據的增、刪、改、查功能...

介紹一個文本語音神器,幾行代碼就能搞定!

python批量自動整理文件

初學者福利:分享五個免費的 Python 學習網站,抓緊收藏吧!

歡迎關註作者公眾號【Python 集中營】,專註於後端編程,每天更新技術乾貨,不定時分享各類資料!
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、簡介 ELK日誌我們一般都是按天存儲,例如索引名為"kafkalog-2022-04-05",因為日誌量所占的存儲是非常大的,我們不能一直保存,而是要定期清理舊的,這裡就以保留7天日誌為例。 自動清理7天以前的日誌可以用定時任務的方式,這樣就需要加入多一個定時任務,可能不同服務記錄的索引名又不一 ...
  • 目錄 一.簡介 二.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 OpenGL (ES) 學習路 ...
  • 郵件任務-springboot springboot可以很容易實現郵件的發送 具體實現步驟: 導入jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</a ...
  • 目錄 一.簡介 二.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 OpenGL (ES) 學習路 ...
  • 模式匹配 控制流運算符——match: 其允許一個值與一系列模式進行匹配,並執行匹配的模式對應的代碼 這些模式可以是字面值、變數名、通配符... 綁定值的模式: 匹配的分支可以綁定到被匹配對象的部分值 因此,可以從 enum 變體中提取值 //綁定值 #[derive(Debug)] enum Us ...
  • 1. 求數值型數組中元素的最大值、最小值、平均值、總值等 2. 數組的複製、反轉、查找(線性查找、二分法查找) ...
  • 非同步任務-springboot 非同步:非同步與同步相對,當一個非同步過程調用發出後,調用者在沒有得到結果之前,就可以繼續執行後續操作。也就是說無論非同步方法執行代碼需要多長時間,跟主線程沒有任何影響,主線程可以繼續向下執行。 實例: 在service中寫一個hello方法,讓它延遲三秒 @Service ...
  • 由於``某些不可抗力原因,公司不允許使用itext系列的jar包,因此系統中使用的相關jar得替換成開源的。經比較和嘗試考慮使用org.apache.pdfbox來替換,同時修改系統中原有的方法,發現比itext系列稍顯簡潔一點,記錄如下: 加密文件 /** * 加密文件測試 * @date 202 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...