Python寫自動化之郵件發送(匿名)

爲了能夠實現郵件發送功能,首先,我們需要了解一下郵件的發送過程是什麼樣子的,此處不再詳細說明,請大家自行搜索或查看http://www.sogouqa.com/?p=438

在瞭解了郵件的發送過程後,爲了實現郵件的全自動匿名發送,我們需要通過windows的命令行,解析郵件的匿名服務器,然後使用匿名服務器,發送郵件到相應的郵箱

代碼如下:

def _get_mail_exchanger(domain_name,name_server=""):
    #print domain_name
    temp_file=os.getenv("temp")+"\\temp.lsh"
    os.system("nslookup -qt=mx "+domain_name+" "+name_server+" >"+temp_file+" 2>&1")
    f=open(temp_file)
    c=f.read()
    f.close()
    os.remove(temp_file)
    #print c
    internet_addresses_map=_get_internet_address(c)
    mail_exchangers=re.findall(r"mail\s+exchanger\s*=\s*(\S+)",c)
    #mail_exchangers=[internet_addresses_map.get(i,i) for i in mail_exchangers]
    mail_exchangerIPs=[]
    for i in mail_exchangers:
        try:
            mail_exchangerIPs.append(internet_addresses_map[i])
        except:
            ip=_getIP(i)
            if ip:
                mail_exchangerIPs.append(ip)
        
    if mail_exchangerIPs or name_server:
        print "mail_exchangers",mail_exchangerIPs
        return mail_exchangerIPs
    else:
        print "mail_exchangers from 預配置",g_mail_exchanger.get(domain_name,[])
        return g_mail_exchanger.get(domain_name,[])
其中有個函數用於獲取匿名郵箱服務器地址,使用正則分析返回值,代碼如下:

def _get_internet_address(content):
    internet_addresses=re.findall(r"(\S+)\s+internet\s+address\s*=\s*(\S+)",content)
    internet_addresses_map={}
    for internet_address in internet_addresses:
        internet_addresses_map[internet_address[0]]=internet_address[1]
    return internet_addresses_map

然後,有了地址後,我們需要通過解析出地址的IP,同樣,使用windows命令獲取結果並正則分析獲取IP,代碼如下:

def _getIP(domain_name,name_server=""):
    temp_file=os.getenv("temp")+"\\temp.lsh"
    os.system("nslookup -qt=a "+domain_name+" "+name_server+" >"+temp_file+" 2>&1")
    f=open(temp_file)
    c=f.read()
    f.close()
    os.remove(temp_file)
    ips=re.findall(domain_name+r"\s*Address\s*:\s*(\S+)",c,re.I)
    
    if ips:
        return ips[0][0]
    elif name_server=="":
        return _getIP(domain_name,"8.8.8.8")
    else:
        return None

有了郵箱服務器的IP,剩下的事情就是使用IP去發送郵件了,代碼比較簡單

def _send_to_mail_exchanger(mail_exchanger,mail_from,rcpt_to,From="",To="",Subject="",Date=None,Body="",attachments=None,encoding="gbk"):
    import smtplib,email
    from email.MIMEMultipart import MIMEMultipart
    from email.MIMEText import MIMEText
    from email.MIMEImage import MIMEImage

    # 構造MIMEMultipart對象做爲根容器
    main_msg=email.MIMEMultipart.MIMEMultipart()
    # 設置根容器屬性
    main_msg['From'] = From
    main_msg['To'] = To
    main_msg['Subject'] = Subject
    if Date:
	main_msg['Date'] = Date
    else:
	main_msg['Date'] = email.Utils.formatdate()
    
    # 構造MIMEText對象做爲郵件顯示內容並附加到根容器    
    text_msg = email.MIMEText.MIMEText(Body,'html', encoding)
    main_msg.attach(text_msg)

    # 構造MIMEBase對象做爲文件附件內容並附加到根容器  
    if attachments:	
	for attachment in attachments:    
	    if not os.path.isfile(attachment):
		continue
	    if IsImage(attachment):
		try:
		    fp = open(attachment, "rb")
		    file_msg = MIMEImage(fp.read())
		    fp.close()
		    file_msg.add_header("Content-ID", os.path.basename(attachment).replace(".jpg", "").replace(".png", ""))
		    main_msg.attach(file_msg)
		except:
		    pass
	    else:
		file_msg=email.MIMEBase.MIMEBase("application","octet-stream")
		f=open(attachment,'rb')
		file_msg.set_payload(f.read())
		f.close()
		email.Encoders.encode_base64(file_msg)
		file_msg.add_header('Content-Disposition','attachment',filename=os.path.basename(attachment))
		main_msg.attach(file_msg)
    
    # 用smtp發送郵件
    data=main_msg.as_string()
    for i in range(2):
	try:
	    Log(mail_exchanger)
	    server=smtplib.SMTP(mail_exchanger)
	    Log(mail_from)
	    Log(rcpt_to)
	    ret=server.sendmail(mail_from,rcpt_to,data)
	    break
	except:
	    import traceback
	    Log(traceback.format_exc())
	    
	    ret=False
	    try:
		server.quit()
	    except:
		pass
    try:
	server.quit()
    except:
	pass
    
    if ret==False or ret:
	#print "發往如下的郵件失敗:",rcpt_to
	return False
    return True
ok,這樣把整個流程整理清楚後,就可以自動發送郵件了

轉載請註明出處:http://blog.csdn.net/sogouauto


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章