EDM營銷算法:python自動批量發郵件


EDM營銷:全稱Email Direct Marketing,即電子郵件營銷。企業可以通過使用EDM軟件向目標客戶發送EDM郵件,建立同目標顧客的溝通渠道,向其直接傳達相關信息,用來促進銷售。EDM軟件有多種用途,可以發送電子廣告、產品信息、銷售信息、市場調查、市場推廣活動信息等。

身為一名會修電腦的數據分析師,總是要想着怎樣把公司電腦搞壞,順便給公司創造點價值

剛好python有個

import smtplib

因此,就用python3.4來寫這個代碼

首先一個最簡單的郵件發送的代碼是這樣子的,定義一個函數:

1 # 協議服務器地址、發件方郵箱前綴、發件方郵箱密碼、收件方郵箱、信件標題、內容
2 def send_email(SMTP_host, from_account, from_passwd, to_account, subject, content):
3 def send_email(協議服務器, 發件人郵箱, 發件人郵箱密碼, 收件人郵箱, 郵件標題, 郵件內容):

解析服務器地址,每個郵箱的服務器地址都不一樣,一定要根據發件方的郵箱類型來選擇服務器地址例如:

# 協議服務器地址
# smtp.163.com 
# smtp.21cn.com
# smtp.sina.com.cn
# smtp.sohu.com
# smtp.126.com
# smtp.qq.com 

服務器的的端口也不一樣,一般都是端口25,只有qq的是465或者587

加載服務器:

email_client = smtplib.SMTP(SMTP_host,25)

賬號密碼登錄:

email_client.login(from_account, from_passwd)

將郵件的文本信息搞進來,換點編碼,中間的'plain'是文本,中間可以是html,那么你的內容content就要寫成網頁形式<b>...</b>:

msg = MIMEText(content, 'plain', 'utf-8')

郵件寄出去不是還有誰誰誰寄的么,就是下面的這個,標題、發件人、收件人,收發郵件人名的格式啊,搞進去:

from_title = from_account + "<" + from_account + "@" + from_postfix + ">"

msg['Subject'] = Header(subject, 'utf-8')
msg['From'] = from_account
msg['To'] = to_account

寄出去:

    email_client.sendmail(from_account, to_account, msg.as_string())

    email_client.quit()

記得關閉郵件

這樣子一個很簡單的郵件發送系統就出來了

看看主函數:

if __name__ == "__main__":
    send_email("smtp.163.com","xxxxx@163.com","password","xxxxx@126.com","test","hellow")

完整的簡單發郵件代碼:

 1 import smtplib
 2 from email.mime.text import MIMEText
 3 from email.header import Header
 4 
 5 
 6 def send_email(SMTP_host, from_account, from_passwd, to_account, subject, content):
 7     email_client = smtplib.SMTP(SMTP_host)
 8     email_client.login(from_account, from_passwd)
 9     # create msg
10     msg = MIMEText(content, 'plain', 'utf-8')
11     msg['Subject'] = Header(subject, 'utf-8')  # subject
12     msg['From'] = from_account
13     msg['To'] = to_account
14     email_client.sendmail(from_account, to_account, msg.as_string())
15 
16     email_client.quit()
17 
18 if __name__ == "__main__":
19     send_email("smtp.163.com","xxxxx@163.com","password","xxxxx@126.com","test","hellow")

--------------------------------------我是快樂的分割線--------------------------------------

上面的那個發郵件的是很簡單很簡單的,沒有批量,沒有詳細解說,我是不會滿意這樣的東西,那么,看我神一樣的代碼

首先,你們要注意到,qq郵箱發郵件有一個很重要的BUG

如果沒有解決那么QQ郵箱無法登陸

為什么一定需要QQ郵箱呢?

因為!

用這個服務器QQ只接受來自QQ的郵件,163以及其他的他都不接受!!!

所以一定要用QQ郵箱

打開QQ郵箱--設置--賬戶

一定要開啟下面那兩個服務,因為開啟這兩個服務才能使用QQ郵箱發

要發短信的,發完點擊我已發送,QQ會給一個16位的字母給你

注意注意注意注意注意注意注意注意注意注意,這個才是QQ郵箱發郵件的密碼密碼密碼密碼密碼密碼密碼密碼密碼密碼密碼密碼密碼密碼密碼密碼密碼密碼密碼

好,得到這個密碼后,我再將其他163的郵箱放進來

因為單個郵箱每天上限200個,發200肯定被封,你不希望自己的郵箱被封吧

所以要多個郵箱發

而且是發給多個用戶,那么新建兩個excel表格,打開讀取里面的賬號密碼:

 1 from openpyxl import load_workbook
 2 try:
 3             # 讀取發件人郵箱
 4             wb = load_workbook(filename=r'../fromemail.xlsx')  ##讀取路徑
 5             ws = wb.get_sheet_by_name("Sheet1")  ##讀取名字為Sheet1的sheet表
 6 
 7             # 建立郵箱賬號密碼數組
 8             fromemail_qqaccount = []
 9             fromemail_qqpasswd = []
10             fromemail_othaccount = []
11             fromemail_othpasswd = []
12 
13             for row_A in range(2, 100):  ## 遍歷第2行到100行
14                 qqacc = ws.cell(row=row_A, column=1).value  ## 遍歷第2行到100行,第1列
15                 qqpas = ws.cell(row=row_A, column=2).value  ## 遍歷第2行到100行,第2列
16                 othac = ws.cell(row=row_A, column=3).value  ## 遍歷第2行到100行,第3列
17                 othpa = ws.cell(row=row_A, column=4).value  ## 遍歷第2行到100行,第4列
18                 if qqacc:
19                     fromemail_qqaccount.append(qqacc)
20                     fromemail_qqpasswd.append(qqpas)
21                 if othac:
22                     fromemail_othaccount.append(othac)
23                     fromemail_othpasswd.append(othpa)
24 
25                 # 判斷是否有qq郵箱,如果沒有則退出程序
26                 if len(fromemail_qqaccount) == 0:
27                     input('沒有qq郵箱或者qq郵箱寫入的格式不對,請插入或改正...')
28                     exit()
29 
30             # 讀取收件人郵箱
31             wb = load_workbook(filename=r'../toemail.xlsx')  ##讀取路徑
32             ws = wb.get_sheet_by_name("Sheet1")  ##讀取名字為Sheet1的sheet表
33 
34             # 建立收件人郵箱賬號數組
35             toemail_account = []
36             for row_B in range(2, 10000):  ## 遍歷第2行到10000行
37                 emaacc = ws.cell(row=row_B, column=1).value  ## 遍歷第2行到10000行,第1列
38                 if emaacc:
39                     toemail_account.append(emaacc)
40         except:
41             input('寫入excel的格式不對,請查證...')
42             exit()

我的excel格式是這樣子的:

這里就不解釋啦,讀取excel我以前的博文就有詳細解釋

那么內容content我也寫進了txt記事本里面:

第一行是標題,后面是內容代碼如下:

 1         try:
 2             file = open('../content.txt', 'r')
 3             data = file.read().split('\n')
 4             subject = '標題'
 5             content = '正文'
 6             if data[0] != '':
 7                 for j in range(0, len(data)):
 8                     if j == 0:
 9                         # 郵件標題
10                         subject = data[0]
11                     elif j > 0:
12                         if j == 1:
13                             # 郵件正文
14                             content = data[1]
15                         if j > 1:
16                             content = str(content) + '\n' + data[j]
17             else:
18                 pass
19             file.close()
20         except:
21             input('寫入txt的格式不對,請改正...')
22             exit()

如果標題和內容是空的,那么我就自己給一個標題和內容:

            subject = '標題'
            content = '正文'

因為涉及到換行寫入,所以有:

content = str(content) + '\n' + data[j]

好滴,這些東西統統加進去,感覺這個EDM系統做得不錯了

但是但是,呵呵噠,突然發現登錄的時候直接寫郵箱會出現錯誤,也就是這樣子:,但是還有,我要發圖片怎么辦

我把圖片存到pic文件夾

發圖片只能是用html來寫,也就是我前文寫到的html格式

那么函數要寫成:

1 #登錄之前不變...
2 email_client.login(from_account, from_passwd)
3 msg = MIMEMultipart('related')
4 fp = open('../pic/圖片.jpg', 'rb')
5         msgImage = MIMEImage(fp.read())
6         msgImage.add_header('Content-ID', 'weekly')
7         msg.attach(msgImage)
8         fp.close()
9 msg.attach(MIMEText("<b>"+content+"</b>" + "<br><img src=\"cid:weekly\">", 'html', 'utf-8'))

嗯,這樣子就可以發圖片了:

好滴,但是前面有提到qq郵箱只能用qq郵箱來發

那么我寫了一個想法

當郵箱是qq郵箱的時候只能用qq郵箱,出錯了退出程序

當郵箱不是qq郵箱的時候用其他郵箱來發,出錯了再用QQ郵箱來發,再出錯就退出程序

那么就准備了一大堆郵箱,循環發,首先判斷是不是qq郵箱:

                if 'qq' in toemail_account[i]:
                    print('用了qq郵箱...')
                    # 定義協議地址
                    SMTP_host = 'smtp.qq.com'

                    # 取得@前面的東西
                    from_account = re.compile(r'(.*)@(.*)').search(fromemail_qqaccount[int(count_1) - 1]).group(1)
                    # 取得@后面的東西,等同於下面的語句
                    # from_postfix = re.compile(r'(.*)@(.*)').search(fromemail_qqaccount[i]).group(1)
                    from_postfix = 'qq.com'

                    # 密碼
                    from_passwd = fromemail_qqpasswd[int(count_1) - 1]
                    # print('讀取第count_1 - 1個qq的賬號和密碼')

                    # 收件人地址
                    to_account = toemail_account[i]

                    # print('用第count_1 - 1個qq的賬號和密碼發送郵件')
                    send_email(SMTP_host, from_account, from_passwd, to_account, subject, content)

這是很簡單的判斷讀取excel的郵箱的東西啦,不多說

要說的是我要循環利用發件人的郵箱,那么就要有個判斷,當循環到頭的時候要重新循環,所以就有了那個count_1,最主要的是在這里:

1 if count_1 % int(len(fromemail_qqaccount)) == 0:
2     # 循環夠了,要初始化count_1
3     count_1 = 1
4 else:
5     count_1 = count_1 + 1

整除即可

如果收件人不是qq郵箱,那么來:

 1 else:
 2 # 收件人地址
 3 to_account = toemail_account[i]
 4 # 取得地址協議
 5 if '163' in toemail_account[i]:
 6     SMTP_host = 'smtp.163.com'
 7 elif 'sina' in toemail_account[i]:
 8     SMTP_host = 'smtp.sina.com.cn'
 9 elif '126' in toemail_account[i]:
10     SMTP_host = 'smtp.126.com'
11 elif 'sohu' in toemail_account[i]:
12     SMTP_host = 'smtp.sohu.com'
13 
14 # 取得@前面的東西
15 from_account = re.compile(r'(.*)@(.*)').search(fromemail_othaccount[int(count_2) - 1]).group(1)
16 # 取得@后面的東西,等同於下面的語句
17 from_postfix = from_postfix = re.compile(r'(.*)@(.*)').search(fromemail_othaccount[int(count_2) - 1]).group(2)
18 # 密碼
19 from_passwd = fromemail_othpasswd[int(count_2) - 1]
20 # print('讀取第count_2 - 1個郵箱的賬號和密碼')
21 
22 # print('用第count_2 - 1個郵箱的賬號和密碼發送郵件')
23 send_email(SMTP_host, from_account,  from_passwd, to_account, subject, content)
24 if count_2 % int(len(fromemail_othaccount)) == 0:
25     # 循環夠了,要初始化count_2
26     count_2 = 1
27 else:
28     count_2 = count_2 + 1

這樣子這個程序挺像樣子了

但是!

我是數據分析師

我很追求完美

萬一中間程序斷了怎么辦,我怎么知道哪些人發了郵件哪些人沒發?

呵呵噠,創建一個finish.txt,每發一個保存一個:

 1     #記錄下已經發送的郵件
 2     save_finish = '../finish.txt'
 3     read_finish = open(save_finish, 'r').read()
 4     txt_finish = str(read_finish)
 5 
 6     # 以寫入的方式打開txt,在上面記錄的內容后面繼續添加新內容
 7     file_finish = open(save_finish, 'w')
 8     txt_finish = str(txt_finish) + '\n' + str(to_account)
 9     file_finish.write(txt_finish)
10     file_finish.close()

最后成功運行:

--------------------------我是快樂的分割線---------------------------

EDM營銷,滿滿的利潤來了

最后為什么沒有貼出完整代碼,因為商業機密啊

我是收了錢的啊

思路都給了

還不滿足啊

要不你可以去買收錢的啊

https://help.aliyun.com/document_detail/29421.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM