1. 程式人生 > >Python 傳送郵件指令碼

Python 傳送郵件指令碼

在一些場景中經常需要傳送郵件, 像是持續整合和運維報警等. 而使用Python指令碼能夠很快捷方便得實現傳送各種郵件的需求.這裡就通過Python基於SMTP(Simple Mail Transfer Protocol)實現一套可以群發,Html內容和附件的指令碼.

既然是要傳送各種型別的郵件, 首先需要有一個郵箱.這裡就以騰訊企業郵箱為例.做完一下三個準備工作之後就可以開始寫指令碼了.

  1. 在設定中開啟所有SMTP相關服務.

  2. 記錄傳送郵件伺服器地址, 連線方式和埠

  3. 新增一個授權密碼並記錄起來.

連線郵件伺服器並登陸

Python中有smtplib模組可供使用, 將它匯入進來. 在傳送郵件伺服器地址資訊那裡可以看到連線有兩種方式, 一種是普通連線, 一種是經過加密的連線. 在指令碼中就根據需求去構建兩種不同的連結物件. 通過郵件伺服器地址這裡的server_host

也就是smtp.exmail.qq.com和預設的伺服器埠(SMTP方式預設使用25埠而SMTP_SSL就是預設使用465埠, 通常郵件伺服器都是可以使用預設埠的)建立與郵件伺服器之間的連線. 並通過郵箱賬戶和上面第三步中設定的授權密碼登入郵箱伺服器. 沒有異常資訊的話就連線郵件伺服器並登入成功了.

try:
    if is_ssl is True:
        self._server = smtplib.SMTP_SSL()
    else:
        self._server = smtplib.SMTP()
    self._server.connect(server_host)
    self
._server.login(mail_user, mail_password) print 'register mail succeed!' except Exception as e: print e print 'register failed!'

傳送文字郵件

傳送郵件之前先驗證一下當前是否已經登入到郵件伺服器. 再通過email模組中的MIMEText構建出包含發件人, 收件人列表, 郵件標題和郵件內容的訊息體.因為這裡是傳送文字內容的郵件, 所以content_type是plain.

content_msg = MIMEText(mail_content, 'plain'
, 'utf-8') content_msg['From'] = 'JenkinsBuilder <' + self._mail_from + '>' content_msg['To'] = ','.join(send_to) content_msg['Subject'] = mail_subject

構建完訊息體之後就可以直接呼叫SMTP的sendmail方法, 將訊息體從發件方傳送到收件列表中的收件郵箱中去.

try:
    self._server.sendmail(
        self._mail_from, send_to, content_msg.as_string())
    print 'mail %s sent to %s succeed!' % (mail_subject, send_to)
except Exception as e:
    print e
    print 'mail %s sent to %s failed!' % (mail_subject, send_to)
self._server.quit()

傳送Html郵件

如果傳送普通文字郵件成功了, 那麼想要傳送html內容的郵件就很簡單了, 稍微改一下上面的程式碼給content_type多一種html的選擇就可以了. 通過外部的引數控制構建訊息體是純檔案內容還是html內容. 這樣就可以使用一些html模板來發送固定格式的郵件.

if is_html:
    content_type = 'html'
else:
    content_type = 'plain'
content_msg = MIMEText(mail_content, content_type, 'utf-8')

傳送附件

首先從email模組中引入MIMEMultipart. 從這個MIME擴充套件類的名字也可以看出它的作用是可以構建多個MIME的訊息體, 並將它們裝配起來.繼續修改前面的程式碼. 根據發件人, 收件人列表和郵箱標題構建出多MIME例項.

multi_msg = MIMEMultipart.MIMEMultipart()
multi_msg['From'] = 'JenkinsBuilder <' + self._mail_from + '>'
multi_msg['To'] = ','.join(send_to)
multi_msg['Subject'] = mail_subject

接著根據引數決定構建純文字還是Html內容的訊息體, 將該包含郵件內容的訊息體裝載進上面初始化過的multi_msg中. 完成郵件內容部分的填充.

if is_html:
    content_type = 'html'
else:
    content_type = 'plain'

content_msg = MIMEText(mail_content, content_type, 'utf-8')
multi_msg.attach(content_msg)

完成程式碼改造之後就要加入對附件的支援, 遍歷外部傳入的檔案列表, 並根據檔案構建出包含附件的訊息體, 將其依次裝載進multi_msg中.

for attachment in mail_attachment:
    attach_msg = self._build_attachment(attachment)
    multi_msg.attach(attach_msg)

開啟遍歷檔案列表時拿到附件, 將其初始化為MIME訊息體, 並且設定附件的檔案屬性和附件的名字.

try:
    attach = MIMEText(open(attachment, 'rb').read(),
                      'base64', 'gb2312')
    attach["Content-Type"] = 'application/octet-stream'
    attach["Content-Disposition"] = 'attachment; filename=' + file_name
    print 'attach %s succeed!' % file_name
    return attach
except Exception as e:
    print e
    print 'attach %s failed!' % file_name

彙總

功能程式碼完成之後再通過getopt構建出來外部引數指令, 方便外部呼叫指令碼.

if __name__ == "__main__":
    try:
        options, args = getopt.getopt(
            sys.argv[1:], "",
            ["help", "host=", "account=", "password=", "html",
             "subject=", "content=", "attach=", "send=", "ssl"])
        if options == []:
            raise Exception("none params")
    except Exception as e:
        print '--host --account '
        print '    --password --html'
        print '    --subject --content '
        print '    --attach --send'
        print '    --ssl --help'
        sys.exit()

執行指令碼

python daily_build_mail.py --host smtp.exmail.qq.com --account [email protected].com --password xxxxx --attach ../README.md --send [email protected].com,[email protected].com --subject 'Mail builder' --content 'Mail content' --ssl

收到群髮帶附件的郵件

Issue

通常我們都是在公司使用自動發郵件指令碼, 肯定都會發送一些內容到企業郵箱. 在向企業郵箱群發郵件的時候會出現企業退信的情況, 返回一個程式碼和簡單的描述代表這次傳送失敗. 我在用163的郵箱給騰訊企業郵箱傳送群發郵件時就出現過這個問題. 這時可以參考一下退信程式碼說明, 根據裡面的說明fix問題.

相關推薦

Python 傳送郵件指令碼

在一些場景中經常需要傳送郵件, 像是持續整合和運維報警等. 而使用Python指令碼能夠很快捷方便得實現傳送各種郵件的需求.這裡就通過Python基於SMTP(Simple Mail Transfer Protocol)實現一套可以群發,Html內容和附件的指令

python傳送郵件給多人

親測,163郵箱不能傳送,我用的qq的 import smtplib from email.mime.text import MIMEText sender = '[email protected]' passwd = '****' receiver = ["[email&#

python傳送郵件方法

python傳送郵件方法 1、普通文字郵件 #!/usr/bin/env python# -*- coding:utf-8 -*-import smtplibfrom email.mime.text import MIMETextmail_user="[email protected]" #傳送

python傳送郵件smtp

1.傳送QQ郵件 qq發件伺服器:smtp.qq.com 發件伺服器埠:465 發件郵箱:[email protected] 授權碼:*** qq郵箱是需要SSL認證的,連線伺服器需要認證 1.1 MIMEText只能傳送正文,不能帶附件傳送 1.2

windows關機前執行指令碼設定與關機blat自動傳送郵件指令碼模板

1.開始——執行——gpedit.msc2.策略——計算機配置——Windows設定——指令碼(啟動/關機)3.右擊"關機"4.新增——瀏覽:選擇指令碼確定;5.完成設定,重啟測試。 注:關機指令碼啟動目錄:C:\Windows\System32\GroupPolicy\Machine\Scripts\Sh

python 傳送郵件(文字、表格、附件)

import pandas as pd import smtplib   from email.mime.text import MIMEText   from email.mime.multipart import MIMEMultipart filena

python傳送郵件模板

python傳送郵件(不帶附件)模板 import smtplibfrom email.mime.text import MIMETextfrom email.header import Headersender = '[email protected]'receiver = '[email

Python傳送郵件不需要發件人密碼認證

#!/usr/bin/python # coding: UTF-8 import smtplib from email.mime.text import MIMEText receivers_list=["[email protected]",] #mail_h

zabbix傳送郵件指令碼

#!/usr/bin/env python #-*- coding: UTF-8 -*- import os,sys reload(sys) sys.setdefaultencoding('utf8') import getopt import smtplib from email.MIMEText i

Python傳送郵件並抄送

轉載: http://blog.51cto.com/lizhenliang/1875330 程式碼 #!/usr/bin/python # -*- coding: utf-8 -*- import smtplib def sendMail(body): smtp_serve

python傳送郵件(帶附件)

python通過stmp傳送qq郵件,帶附件 import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.header import Head

python傳送郵件

轉載自後知者的部落格 使用email模組和smtplib模組,內容比較固定,配好了即可實現,程式碼如下: 一、普通郵件傳送 import smtplib from email.mime.text import MIMEText email_host = ‘smt

利用python傳送郵件

1. 點選設定,選擇POP3/SMTP/IMAP。 2. 第一次進入,這兩項應該是未勾選的。  3. 點選左側客戶端授權密碼,再點選重置授權碼。輸入簡訊驗證碼後,會提示設定授權密碼(不要和郵箱登陸密碼重複)。 4. 記住自己設定的授權密碼之後,開始用pyth

python 傳送郵件 附帶附件

from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart import smtplib #建立一個帶附件的例項 msg = MIMEMultipart() #構造

python傳送郵件模組

import smtplib import time from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.appl

Python傳送郵件模組(SMTP)

首先,使用SMTP實現傳送郵件的話,需要先獲取一個代發郵件的授權碼。 以163郵箱為例: 登入郵箱後--點選設定--客戶端授權碼--開啟。如圖 其實網上已經有很多類似的模組介紹和試用了,這邊主要是想記錄下自己寫的一個類。呼叫方式簡單,可以直接將py檔案貼到專案中,import後

python 傳送郵件的模板

[[email protected] ~]# vi send_mail  import smtplib    # 傳送郵件的模板 import string host = "smtp.139.com"                      #定義smtp 主機 subject = "test e

Python傳送郵件給室友使其電腦關機,室友一臉茫然以為電腦中毒

Python 功能強大,簡單易學,很多人不知道如何學習,覺得學習很枯燥。其實趣味學習是最好的方法,比如,你經常忘記關閉辦公室的電腦,又不想半路返回單位,就可以用 Python 寫一個遠端操控的自動關機程式,試想一下,當你掏出手機進行幾步簡單的操作就可以實現對其他電腦的遠端控制,是不是很酷! &n

Python傳送郵件smtplib.SMTP各報錯問題的解決方法

經測試可用的傳送郵件程式碼: import smtplib from email.mime.text import MIMEText # 第三方 SMTP 服務 mail_host = "smtp.163.com" # SMTP伺服器 mail_user = "user

python傳送郵件報警

在scrapy爬蟲專案中經常遇到 爬取資料時報錯無法及時處理 導致資料爬取不完整 只能先檢視log才能發現報錯 首先寫一個簡單的郵件傳送模組 #郵件服務封裝 import smtplib from email.mime.text import MIMEText from ema