解決Cron定時任務中Pytest腳本無法發(fā)送郵件的問題
引言
在使用Cron定時任務運行Pytest的manage.py
腳本時,有時會遇到腳本能夠成功執(zhí)行,但郵件發(fā)送功能卻無法正常工作的問題。這種問題通常是由于環(huán)境配置不足、路徑設置不正確,或者郵件服務器配置不當?shù)仍驅е碌?。本文將探討如何解決這一問題,并提供詳細的步驟和解決方案。
1. 環(huán)境變量優(yōu)化:確保Cron任務可以正確執(zhí)行
首先,確保在Cron定時任務中運行的腳本環(huán)境和你平時在終端手動運行的環(huán)境一致。在開發(fā)環(huán)境中,Pytest腳本通常依賴于一些環(huán)境變量,這些環(huán)境變量需要在Cron任務中正確配置。
解決方案:
可以通過將較長的命令拆分成腳本來優(yōu)化,并在cron
中調用該腳本,避免直接在cron
中寫入過長的命令。這樣不僅簡潔,而且便于管理和維護。
1.1. 創(chuàng)建一個腳本
首先,在項目目錄下創(chuàng)建一個新的腳本文件,比如 run_manage.sh
,內容如下:
#!/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin # 設置環(huán)境變量(替換成你的真實虛擬環(huán)境的地址) export PATH=/root/myenv/bin:$PATH export PYTHONPATH=/root/myenv/bin/packages:$PYTHONPATH # 激活虛擬環(huán)境(替換成你的真實虛擬環(huán)境的地址) source /root/myenv/bin/activate # 執(zhí)行腳本(/path/to/project/替換為你的腳本路徑) /root/myenv/bin/python /path/to/project/manage.py >> /var/log/manage.log 2>&1
確保腳本可執(zhí)行(替換為你的而真實run_manage.sh路徑):
chmod +x /path/to/run_manage.sh
1.2. 修改cron配置
然后,在cron
中調用該腳本。修改cron
的配置如下:
00 08 * * * cd /path/to/project && /path/to/run_manage.sh
這樣就避免了在cron
中寫入過長的命令,提高了可讀性和可維護性。
2. 腳本能夠執(zhí)行,但郵件發(fā)送失敗
當確保Cron任務的環(huán)境配置正確后,腳本能夠成功運行,但郵件發(fā)送依然不成功時,問題可能出在郵件服務器的配置或者Pytest的郵件設置上。
解決方案:
檢查Pytest郵件配置確保Pytest項目的配置文件中正確配置了郵件相關的設置。QQ的郵件配置如下:
def send_email(total, passed, failed): # 郵件內容設置 subject = "Pytest Test Report" body = f""" <html> <body> <p>Hi all:</p> <p>以下是本次接口測試的結果:</p> <ul> <li ><strong>總測試數(shù): {total}</strong></li> <li ><strong>通過數(shù):{passed}</strong></li> <li style="color: red;"><strong>失敗數(shù):{failed}</strong></li> </ul> <p> 測試團隊</p> </body> </html> """ mail_host = "smtp.qq.com" # 設置服務器 sender_email = "ZZZZZZZZZ@qq.com" # 用戶名 receiver_email = "ZZZZZZZZZZZZ@126.com" password = "############" # 授權碼 # 設置MIME郵件對象 msg = MIMEMultipart() msg['From'] = "ZZZZZZZZZ@qq.com" msg['To'] = receiver_email msg['Subject'] = subject # 使用'html'格式將報告嵌入到郵件正文 msg.attach(MIMEText(body, 'html')) # 發(fā)送郵件 try: with smtplib.SMTP(mail_host, 587) as server: server.ehlo() # 再次發(fā)送 EHLO,更新安全會話 server.starttls() # 啟動 TLS 加密 server.ehlo() # 發(fā)送 EHLO 命令 server.login(sender_email, password) # 使用授權碼進行登錄 server.sendmail(sender_email, receiver_email, msg.as_string()) print("Email sent successfully") except smtplib.SMTPException as e: print(f"SMTP error occurred: {e}") except Exception as e: print(f"Failed to send email: {e}")
3. 配置main.cf文件:確保SMTP服務正常工作
如果郵件發(fā)送還是不成功,問題可能出在郵件服務本身,特別是SMTP服務器配置。可以嘗試配置main.cf
文件,來調整郵件發(fā)送的相關參數(shù)。
3.1. 編輯main.cf文件
在使用Postfix等郵件服務器時,main.cf
文件控制著郵件服務的配置??梢詸z查并確保以下幾個配置項被正確設置:
# 編輯main.cf sudo nano /etc/postfix/main.cf
確保以下設置項正確:
# 啟用 SASL 身份驗證 smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_sasl_security_options = noanonymous smtp_sasl_tls_security_options = noanonymous # TLS 配置 smtp_use_tls = yes smtp_tls_security_level = encrypt smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases mydestination = localhost, localhost.localdomain,ajcloud,net myhostname = mail.example.com mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = all inet_protocols = all relayhost = [smtp.qq.com]:587 debug_peer_level = 3 debug_peer_list = smtp.qq.com smtp_helo_name = mail.example.com smtpd_helo_required = yes myorigin = /etc/mailname smtp_generic_maps = hash:/etc/postfix/generic
這些設置項允許Postfix通過指定的SMTP服務器進行身份驗證,并啟用TLS加密來保證郵件的安全性。
3.2. 配置sasl_passwd文件
如果使用SMTP身份驗證,還需要配置sasl_passwd
文件,指定SMTP服務器的認證信息:
# 編輯sasl_passwd sudo nano /etc/postfix/sasl_passwd
文件內容應為:
[smtp.your-email-provider.com]:587 your-email@example.com:your-email-password
然后運行以下命令生成密碼哈希:
sudo postmap /etc/postfix/sasl_passwd
為了在Postfix的main.cf
文件中增加這兩個配置項,你可以按照以下步驟進行操作:
3.3. 配置generic 文件
在main.cf文件中添加以下配置項:
myorigin = /etc/mailname smtp_generic_maps = hash:/etc/postfix/generic
這兩個配置項的作用:
myorigin
用于指定郵件的來源域名,通常設置為/etc/mailname
,它會使用該文件中的域名作為郵件發(fā)送的發(fā)件人地址。smtp_generic_maps
用于指定Postfix如何處理郵件的發(fā)件人地址映射,/etc/postfix/generic
文件通常用于將本地發(fā)件人地址映射到外部SMTP服務器的郵件地址。
如果你還沒有創(chuàng)建/etc/postfix/generic
文件,需要創(chuàng)建該文件并配置映射規(guī)則。例如:
sudo nano /etc/postfix/generic
在文件中添加類似如下的映射規(guī)則:
# 格式: 本地用戶 -> 外部郵件地址 root@mail.example.com [填寫腳本中的sender_email] root@localhost [填寫腳本中的sender_email] [填寫腳本中的receiver_email] [填寫腳本中的receiver_email]
3.4. 生成generic文件的哈希文件
配置好后,需要生成generic
文件的哈希文件,命令如下:
sudo postmap /etc/postfix/generic
3.5. 重啟Postfix服務
配置完成后,重啟Postfix服務使配置生效:
sudo systemctl restart postfix
3.6. cronf中增加MAILTO
MAILTO=[填寫腳本中的receiver_email]
4. 其他常見問題排查
- 郵件防火墻/防病毒:有時防火墻或防病毒軟件可能會阻止SMTP連接,確保相關端口(通常為587或465)在防火墻中開放。
總結
通過正確配置環(huán)境變量、檢查Pytest郵件設置、調試腳本及服務器配置,可以有效解決通過Cron任務運行Pytest腳本時,郵件發(fā)送失敗的問題。確保Cron任務的環(huán)境與手動運行時的一致,檢查郵件服務器配置,并結合日志輸出排查錯誤,最終可以使郵件功能在定時任務中成功運行。
以上就是解決Cron定時任務中Pytest腳本無法發(fā)送郵件的問題的詳細內容,更多關于Cron Pytest腳本無法發(fā)送郵件的資料請關注腳本之家其它相關文章!
相關文章
利用Tensorflow的隊列多線程讀取數(shù)據(jù)方式
今天小編就為大家分享一篇利用Tensorflow的隊列多線程讀取數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02pandas?dataframe獲取所有行名稱與列名稱方法示例
這篇文章主要給大家介紹了關于pandas?dataframe獲取所有行名稱與列名稱的相關資料,Pandas是Python中用于數(shù)據(jù)分析的非常重要的庫,它提供了多種方法來獲取列名,需要的朋友可以參考下2023-09-09