目錄
1.Intro
眼看就到了12月中旬,除了幫朋友碼競賽題,前半個月可以說是划水摸魚抓夢jio。
這段時間面試了幾個人,趕腳什麼人都敢往開發靠啊兄弟,
第一個是某傳媒學校畢業的,自學了幾年Java,然後幹了幾年的收銀和消防救火員.... Pass
第二個都37了(大哥你確定要從基層做起???),學歷牌子很硬,但工作後沒有什麼像樣的項目成果 Pass
第三個前某科技公司的CTO...CTO......你乾的好好的離什麼職哦,來應聘研發總監,原來做電商的,後來搞大數據,寫過人臉識別的算法,我多嘴的問了幾句關於Map Reduce的具體實現,包括怎麼用Yarn來調度資源,是否有用到Spark參與計算以及人臉識別框架和算法的技術細節等等,就是這種外行問題,人家說他負責搭建環境和整個項目的協同管理,一看公司名,再看他的專業(材料化學),哦,然後我就明白了。Pass
還有不少.....
2.Details
用smtplib和email庫進行郵件發送,在之前寫的爬蟲模塊裏就有了,這裏單獨做一個具體的介紹。
如何開啓郵箱的SMTP服務?
以QQ爲例:
3.Theory
(1) smtplib
SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協議,是在Internet傳輸email的事實標準,是一組用於由源地址到目的地址傳送郵件的規則,由它來控制信件的中轉方式。說白了,就是email要在網上傳輸,需要遵循SMTP協議和規範,就和TCP/IP協議、HTTP協議一個道理。
Python的smtplib提供了一種很方便的途徑發送電子郵件,對smtp協議進行了簡單的封裝。
創建 SMTP 對象:
import smtplib email = smtplib.SMTP(host, port, local_hostname) 參數說明: 1.host:可選。一般要指定。SMTP服務器主機,可以指定主機ip地址或域名,如 smtp.qq.com、smtp.163.com 等。 2.port:可選。host指定了就需要指定端口號,一般端口號爲25,QQ郵箱的ssl端口爲465。 3.local_hostname:可選。如果SMTP服務器設置在了本機上,就指定服務器地址爲localhost。 Eg: smtp_server = 'smtp.qq.com' email = smtplib.SMTP_SSL(host=smtp_server, port=465)
登錄SMTP服務器:
login_code = email.login(from_mail, mail_pass) 參數說明 1.from_mail:發送方的郵箱地址 2.mail_pass:SMTP服務授權碼(在郵箱裏開啓SMTP服務時生成) 返回一個元組,包含登錄狀態碼和登錄結果。 Eg: login_code = email.login(from_mail, mail_pass) # 返回(235, 'Authentication successful')
發送郵件:
email.sendmail(from_mail, to_mail, msg) 1.from_mail:郵件發送者地址 2.to_mail:郵件接收者地址 3.msg:發送消息 Eg: email.sendmail(from_mail, to_mail, msg.as_string()) email.quit()
2.email
email軟件包是用於管理電子郵件、處理郵件消息的庫,包括MIME和其他一些基於RFC 2822的消息文檔。
這裏主要用到的是MIME擴展類型,即MIME消息格式,可支持非ASCII字符文本,非文本格式附件,由多部分組成的消息體和包含非ASCII字符的頭信息。
(1)字符文本:郵件主體,即郵件主要內容。
(2)附件:本機文件,可以是二進制、圖像、音頻、視頻等,不要超過郵件服務器聲明的最大上傳大小。
(3)消息體:有text/plain(純文本)、text/html(超文本)、image/jpeg(jpg圖片)、video/mp4(mp4視頻)等多種獨立類型,在郵件頭部用“Content-Type”域作爲標識,其中這些消息體可以分爲多段,稱作multipart,每個段包括段頭段尾,它分爲三種類型,分別是multipart/mixed(附件)、multipart/alternative(文本)、multipart/related(內嵌)。
(4)頭信息:包括發件人、收件人、主題、日期、郵件內容類型等信息。
4.Environment
Environment:Windows All
Language:Python 2.7.14
IDE:Pycharm 2018
5.Source
import smtplib # SMTP庫
from email.mime.text import MIMEText # 文本郵件對象
from email.mime.multipart import MIMEMultipart # 多個對象的組合,包括文本、附件等
from email.header import Header # 郵件名對象
from email import encoders # 編碼器
from email.mime.base import MIMEBase # 附件構造對象
from email.utils import parseaddr, formataddr # 郵件規約與格式化
class Data_Sender(object):
def __init__(self):
print("[*] Initialize email send module..")
def format_address(self, address):
'''
格式化郵件地址
:param address: 郵件地址
:return: 格式化後的郵件地址
'''
print("[+] Formatting email address..")
name, addr = parseaddr(address)
print("[+] Format done.")
return formataddr((Header(name, 'utf-8').encode(), addr))
def send_mail(self, body, attachment):
'''
發送郵件
:param body: 郵件正文
:param attachment: 附件地址
:return: 發送成功返回True
'''
print("[+] Begin to send email...")
# 要發送的服務器
smtp_server = 'smtp.qq.com' # 可以選擇別的服務器,如 smtp.163.com
# 要發送的郵箱用戶名/密碼
from_mail = '發送方的郵箱'
mail_pass = 'SMTP服務密碼'
# 接收的郵箱
to_mail = '接收方的郵箱'
# 構造一個 MIMEMultipart 對象代表郵件本身
msg = MIMEMultipart()
# Header 對中文進行轉碼
msg['From'] = self.format_address('發件人地址標識 <%s>' % from_mail).encode()
msg['To'] = to_mail
msg['Subject'] = Header('郵件名', 'utf-8').encode()
# # plain 代表純文本
msg.attach(MIMEText(body, 'plain', 'utf-8'))
# 二進制方式模式文件
if len(attachment) != 0:
for file_path in attachment:
with open(file_path, 'rb') as picture:
# MIMEBase 表示附件的名字
mime = MIMEBase(file_path[str(file_path).rfind('\\') + 1: -4], 'xls',
filename=file_path[str(file_path).rfind('\\') + 1:])
# filename 是顯示附件名字
mime.add_header('Content-Disposition', 'attachment',
filename=file_path[str(file_path).rfind('\\') + 1:])
# 獲取附件內容
mime.set_payload(picture.read())
encoders.encode_base64(mime)
# 作爲附件添加到郵件
msg.attach(mime)
print("[+] Connecting SMTP server")
# 創建SMTP對象
email = smtplib.SMTP_SSL(smtp_server, 465)
print("[+] Connect successfully.")
print("[+] Licensing SMTP server")
# 登錄SMTP服務器
login_code = email.login(from_mail, mail_pass)
if login_code[0] is 235:
print("[+] Successfully!")
else:
print("[-] Failed!")
return False
try:
# as_string()把 MIMEText 對象變成 str
print("[*] Sending email..")
# 發送郵件
email.sendmail(from_mail, to_mail, msg.as_string())
email.quit()
print("[+] Successfully!")
return True
except Exception as e:
print("[-] Failed!")
print("ERROR: " + str(e.message))
return False
6.Conclusion
不發GIS開發相關,天天不務正業說的就是本猿。