>  기사  >  백엔드 개발  >  자동 이메일 스크립트를 만들기 위한 Python 코드 예제를 가르쳐주세요.

자동 이메일 스크립트를 만들기 위한 Python 코드 예제를 가르쳐주세요.

Y2J
Y2J원래의
2017-04-27 11:58:462813검색

이 글은 주로 Python 자동 이메일 스크립트 관련 지식을 소개합니다. 참고할만한 가치가 아주 좋습니다. 아래 에디터로 살펴보겠습니다

Origin

이 기간 동안 에 그룹 이메일을 보내기 위한 스크립트를 만들었습니다. 친구들.. 방지하기 위해 스팸들어가려고 많은 노력을 했는데 방금 끝냈는데 스팸 진입률이 50%인데 스팸 진입률을 낮추고 싶다면 나쁘지 않다고 생각합니다. 아마도 호스트를 구입하려면 돈을 써야 할 것 같습니다. 일단 한 달 동안 출시하고 효과를 확인한 다음 확장하십시오.

스크립트는 주로 Python으로 작성되고 smtplib 라이브러리에 의해 조정됩니다. 인터넷에서 많이 검색할 수 있는 기본 사항입니다. 오늘은 스팸 시스템에 들어가지 않는 방법을 주로 설명하겠습니다. 전체 시스템을 구축하는 것입니다. 어쩌면 제가 Python을 시작한 지 얼마 되지 않아 잘못된 작성 방법이 많을 수 있으니 지적해 주시기 바랍니다~

구성

CentOS7.0 시스템

Python 3.4

CentOS7.0의 기본 버전은 Python2.7.5입니다. 먼저 Python 버전을 업그레이드해 보겠습니다.

#wget https://www.python.org/ftp/python/3.4.3/Python-3.4.3.tgz

Python3.4를 다운로드하세요. version

#tar -xf Python-3.4.3.tgz
#cd Python-3.4.3/
#./configure

여기에서 구성할 때 사용자 환경에 gcc 컴파일 환경이 설치되어 있지 않을 수 있습니다. 다음 명령문을 실행한 후

#yum -y install gcc
#yum -y install gdb
#yum -y install gcc-c++

컴파일하고 설치하세요. 🎜>파이썬 버전이 교체되었기 때문에 이후에는 yum이 정상적으로 사용되지 않을 수 있습니다.

#make
#make install

두 파일을 변경하고 이 두 파일의 헤더에 있는 #!/usr/bin/python을 다음으로 변경해야 합니다. #!/usr/bin/python2.7. 저장하고 종료하면 yum이 가득 차면 부활합니다.

컴파일한 후 python3.4를 기본 Python 구문 분석으로 설정합니다.

#ln -s /usr/local/bin/python3.4 /usr/bin/python링크 완료 후 Python 버전 확인

#python -VPython3.4가 나타나면 버전을 나타냅니다. 전환 완료

시스템 아키텍처

자동 이메일 스크립트를 만들기 위한 Python 코드 예제를 가르쳐주세요.계정 : 발신자의 이메일 계정, 내 163 이메일, 시나 이메일을 저장하는 데 사용되는 디렉토리 , 소후 이메일, 톰 이메일이 전부 타오바오에서 SMTP 서비스를 보낼 수 있는 계정을 30개 구매했는데, 한 끼 식사비도 안 되는 가격으로 받을 수 있어요. 계정 비밀번호는 [:]로 구분하고, 각 계정은 [로 구분해요. ,].

공통: Rinzhi 시스템 구성 파일과 로그 시스템 소스 코드가 포함된 참조 클래스 폴더

Conf: 전역 구성 파일, 현재 유용하지 않음

이미지: 이미지 리소스

로그: 날짜로 구분되는 로그 파일

로그백업: 만료된 로그를 백업하는 데 사용되는 로그 백업 파일

보내는 메일: 사용받는 사람의 이메일 정보를 저장하려면 [,]를 사용하여 계정을 구분하세요.

mail_html.py: 주요 실행 스크립트

README.md: git 버전 관리를 위한 사용자 지침, 코드를 사용합니다. 클라우드는 내 코드를 관리합니다

로그 시스템

스크립트 시스템의 경우 로그는 매우 중요한 역할을 하며, 특히 스크립트가 잘못되어 언제 확인해야 하는지를 확인해야 합니다. 틀렸습니다. 매우 중요합니다. 인터넷에서 로그 로깅 시스템에 대한 코드도 얻었습니다. 매우 유용하고 모두가 참고할 수 있을 것 같습니다~

주요 아이디어는 로그를 인쇄하는 것입니다. 지정된 파일에 복사해서 로그를 출력합니다. 화면에 나오면 더 이상 말하지 않겠습니다. 인터넷에서 가져온 코드이므로 올려두겠습니다~

rree

로그 시스템의 구성 파일

#vim /usr/bin/yum
#vim /usr/libexec/urlgrabber-ext-down

원하는 대로 경로를 저장할 수 있습니다.

# coding: utf-8

#from lxml import etree
import logging.handlers
import logging
import os
import sys
import time
import datetime

try: 
 import xml.etree.cElementTree as ET 
except ImportError: 
 import xml.etree.ElementTree as ET 

# 提供日志功能
class logger:
 # 先读取XML文件中的配置数据
 # 由于config.xml放置在与当前文件相同的目录下,因此通过 __file__ 来获取XML文件的目录,然后再拼接成绝对路径
 # 这里利用了lxml库来解析XML
 root = ET.parse(os.path.join(os.path.dirname(__file__), 'config.xml')).getroot()
 # 读取日志文件保存路径
 logpath = root.find('logpath').text
 # 读取日志文件容量,转换为字节
 logsize = 1024*1024*int(root.find('logsize').text)
 # 读取日志文件保存个数
 lognum = int(root.find('lognum').text)

 # 添加分天日志名
 now = datetime.datetime.now()
 now_time = now.strftime('%Y%m%d')
 log_file_name = sys.argv[0].split('/')[-1].split('.')[0] + '_' + now_time
 # 日志文件名:由用例脚本的名称,结合日志保存路径,得到日志文件的绝对路径
 logname = os.path.join(logpath, log_file_name)

 # 初始化logger
 log = logging.getLogger()
 # 日志格式,可以根据需要设置
 fmt = logging.Formatter('[%(asctime)s][%(filename)s][line:%(lineno)d][%(levelname)s] %(message)s', '%Y-%m-%d %H:%M:%S')

 # 日志输出到文件,这里用到了上面获取的日志名称,大小,保存个数
 handle1 = logging.handlers.RotatingFileHandler(logname, maxBytes=logsize, backupCount=lognum)
 handle1.setFormatter(fmt)
 # 同时输出到屏幕,便于实施观察
 handle2 = logging.StreamHandler(stream=sys.stdout)
 handle2.setFormatter(fmt)
 log.addHandler(handle1)
 log.addHandler(handle2)

 # 设置日志基本,这里设置为INFO,表示只有INFO级别及以上的会打印
 log.setLevel(logging.INFO)

 # 日志接口,用户只需调用这里的接口即可,这里只定位了INFO, WARNING, ERROR三个级别的日志,可根据需要定义更多接口
 @classmethod
 def info(cls, msg):
  cls.log.info(msg)
  return

 @classmethod
 def warning(cls, msg):
  cls.log.warning(msg)
  return
 @classmethod
 def error(cls, msg):
  cls.log.error(msg)
  return

오류 사용법, 정보를 오류로 대체

메인 파일 실행

스팸 언급, 여러분 가장 먼저 떠오르는 것은 짜증나는 마케팅 이메일이 쓰레기통에 있다는 것입니다. 하지만 이메일 내용을 잘 작성했다면 차단을 피할 수 있을까요? 그렇다면 이메일은 기계에 의해 차단됩니다. 그런 일을 하는 기계라면 쉽습니다. 먼저 기계가 어떻게 작동하는지 알아야 합니다.

스팸으로 분류된 대부분의 이메일은 내용이 변하지 않고 IP가 변하지 않는다는 두 가지 특징을 가지고 있습니다. 실제로 내용이 계속 바뀌고 IP가 계속 바뀌면 이론적으로 스팸메일함에 들어가는 것을 피할 수 있습니다. 하지만 이를 위해서는 인력, 물적 자원이 그리 많지 않기 때문에 우리가 해야 할 일은 확률적인 문제를 해결하는 것입니다.

콘텐츠 혼란여러 템플릿 세트를 사용하여 중첩할 수 있지만 이 문제는 해결하기 쉽습니다. IP는 그대로 유지됩니다. 사실 아직 해결하지 못했습니다. 주된 이유는 돈을 지출하는 것이 두렵기 때문입니다. 콘텐츠가 차단되지 않습니다.

자, 먼저 이메일 제목 30개와 이메일 콘텐츠 템플릿 30세트를 준비하겠습니다. 전역 제목 구성은 다음과 같습니다.

자동 이메일 스크립트를 만들기 위한 Python 코드 예제를 가르쳐주세요.이렇게 됩니다. 장점은 이메일 내용이 차단되는 것을 방지할 수 있다는 것입니다. 30초마다 이메일을 보낸다고 가정하면 20분 내에 어떤 이메일도 중복되지 않습니다. 우리는 이메일 도메인 이름을 허용하는 관점에서 이를 고려합니다. 즉, 마케팅 대상이 모두 QQ 메일함인 경우 20분 이내에 QQ 메일함 서버에서 수신한 동일한 IP의 메일 내용이 달라집니다. 대부분 금지되는 것을 피할 수 있습니다.

账户混淆

设置这么多账号是干嘛用的呢,主要还是想混淆机器,让垃圾邮件进率更低。

下面我个人经过测试,发现邮箱服务器具有的一些特性。

163邮箱

163邮箱设置了每天每个账号邮件发送的上限位50封,账号554出错重发的时间是3小时。

tom邮箱

tom邮箱每天邮件发送数量不做限制,我们也假设是50封,但是每封邮件之间的发送间隔一定要超过30秒,要不然会被短时间连接数过大报错。

sohu邮箱

业界良心,基本上没出过啥错误,一直保持着良好的发送成功率。我们也将其定位发送间隔30秒,每日上线50封。

sina邮箱

恶心的玩意儿,每次发送邮箱前需要先登录,认证手机号,每个手机号5个邮箱哈,但是效果显著,认证完毕,和sohu一样,基本没出错过。

时间混淆

有了这些基础,我们就可以知道了,我们有120个账号,30个邮件模板,每天一刻不停的发送,每封邮件之间的间隔为30秒,一天的邮件发送量在2800封左右。

我觉得一天2800封,如果有钱的话,一台ESC的费用是3元每天,独立ip哈,如果找第三方发送,一封邮件是3分钱,量大2分钱,他们是EDM的,我测试过1500封,达到率不足千分之一。也就是说,我们发送1500封,只需要1块多钱,找第三方发送,1500封怎么也得40块钱。成本是不是很低。

好的,那就来看看邮件是如何发送的吧。

邮件发送

下面我们来看下我的主文件是如何搞的

#coding=utf-8
import smtplib
import mimetypes
import time
import datetime

from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage

#引入外部文件
from Common.log import *

导入模块,以来的外部库和内部的文件

#目录主位置
_root_dir = '/Users/litao/Desktop/mail_html/'
_title_common = '愚人节'
愚人节主题礼物,也是为了以后省事,subject和内容中设计到title的均会被改为愚人节,马上愚人节了吗,营销方式,代码实现,异常方便修改。

#邮箱内容设置
_content = """\
<html>
 <style> .title{font-weight:bold;font-size:18px;}</style>
 <body>
  <p>
   <img src="cid:image1">
   <br><br>
   <span
   class="title">【愚人节】将至,您还没准备礼物?那你一定会过个开心的愚人节的</span>
   <br>
   愚人节就要来啦,礼朵朵给大伙准备了大批量的礼物伴你度过愚人节,具体百度一下【礼朵朵】,赶紧进站选礼物吧~
   <br>
   选礼物前别忘了先去心愿墙许愿哟,你的愿望可能被礼朵朵看到,可以帮你实现哟,实现的时候别忘了来礼朵朵还愿哈~
   <br><br>
   <span class="title">【礼朵朵】介绍</span>
   <br>
   国人从古至今都有送礼的习俗,送礼作为传统之一,一直流传至今,礼尚往来成为人生必修课。
   <br>
   【礼朵朵】集合商业送礼和现代送礼搭建礼物导购分享平台【朵朵礼物】,带给老少皆宜的送礼分享体验新体验。
   <br>
   与此同时,礼朵朵还给大伙准备了礼物攻略【礼物说】,让大家可以对礼物有个更全面的了解~
   <br><br>
   <span class="title">百度搜索【礼朵朵】,开启你的礼物新旅程吧~</span>
   <br><br>
  </p>
 </body>
</html> 
"""

营销内容模板,html模式实现邮件的发送,少不了有模板~

#发送邮箱smtp地址
_smtp_address = [&#39;smtp.163.com&#39;,&#39;smtp.sina.cn&#39;,&#39;smtp.tom.com&#39;,&#39;smtp.sohu.com&#39;]

smtp地址数组,用于在不同的邮件服务器间切换。

def sendMail(sender,reciver,subject,content,passwd,smtpadd):
 username=sender
 password=passwd
 msg=MIMEMultipart(&#39;related&#39;)
 msg[&#39;Subject&#39;]=subject
 #html格式
 html=content
 htm = MIMEText(html,&#39;html&#39;,&#39;utf-8&#39;)
 msg.attach(htm)
 #构造图片
 fp=open(_root_dir+&#39;Image/logo_small.png&#39;,&#39;rb&#39;)
 msgImage=MIMEImage(fp.read())
 fp.close()
 msgImage.add_header("Content-ID", "<image1>")
 msg.attach(msgImage)
 fp2=open(_root_dir+&#39;Image/yurenjie.png&#39;,&#39;rb&#39;)
 msgImage2=MIMEImage(fp2.read())
 fp2.close()
 msgImage2.add_header(&#39;Content-Disposition&#39;, &#39;attachment&#39;,
       filename="愚人节活动海报.jpg")
 msg.attach(msgImage2)
 msg[&#39;From&#39;]=sender
 msg[&#39;To&#39;]=reciver

 #发送邮件
 smtp=smtplib.SMTP()
 smtp.connect(smtpadd)
 smtp.login(username, password)
 smtp.sendmail(sender, reciver, msg.as_string())
 smtp.quit()

发邮件方法,里面有两个地方需要注意,一个是

msgImage.add_header("Content-ID", "<image1>")
msg.attach(msgImage)

将邮件模板中的image1的img标签内容替换成我们想要的图片

第二个

 fp2=open(_root_dir+&#39;Image/yurenjie.png&#39;,&#39;rb&#39;)
 msgImage2=MIMEImage(fp2.read())
 fp2.close()
 msgImage2.add_header(&#39;Content-Disposition&#39;, &#39;attachment&#39;,
       filename="愚人节活动海报.jpg")

插入附件,图片是一个海报,说起海报,强烈建议大家使用创客贴这个平台,非常好用。

下面就是发送邮件啦!!!

#发送邮件
 smtp=smtplib.SMTP()
 smtp.connect(smtpadd)
 smtp.login(username, password)
 smtp.sendmail(sender, reciver, msg.as_string())
 smtp.quit()

通用方法,将文件中的以,分割的内容以数组形式返回

#读取文件中的数据,并将使用,分割的数据变为数组
def readFileToSplit(filepath):
 file_stream = open(filepath)
 try:
  data = file_stream.read()
 finally:
  file_stream.close()
 data_split = data.split(&#39;,&#39;)
 return data_split

主方法

1、切割账号

2、切换邮件服务器

3、每发送一封邮件,休息25秒,切换账号,继续发送

4、日志记录

5、错误处理

if __name__=="__main__":
 content=_content
 # 接收人的邮箱按照每天2000封来,每天的邮箱都需要更换,文件名最后以日期为准,邮件发送量以日志为准
 recivers=readFileToSplit(_root_dir+&#39;Sendmail/mail_test.txt&#39;)
 # 把4个邮箱的账号都获取到,方便下面for循环中使用
 account_163=readFileToSplit(_root_dir+&#39;Account/account163&#39;)
 account_sina=readFileToSplit(_root_dir+&#39;Account/accountsina&#39;)
 account_tom = readFileToSplit(_root_dir+&#39;Account/accounttom&#39;)
 account_sohu = readFileToSplit(_root_dir+&#39;Account/accountsohu&#39;)

 # 获取邮件发送模板
 # 注意模板之间的切换

 #log_file_stream = open(_root_dir+&#39;log&#39;, &#39;w+&#39;)
 logger.info(&#39;&#39;)
 logger.info(&#39;脚本开始------------------------------------------------------------------&#39;)

 # 统计邮件发送量
 send_num = 0
 # 统计发送出错量
 error_num = 0
 # 统计发送失败的邮箱发送账号
 send_success_account = []
 # 统计发送成功的邮箱发送账号
 send_failure_account = []

 subject_num = len(_subject)

 # 最后统计没有发出去的邮箱号,放到下日,继续发送
 for i in range(0, len(recivers)):
  try:
   sendindex = i - error_num
   num = i % 30
   account = account_163[num].split(&#39;:&#39;)
   addindex=i%4
   subjectindex = sendindex%subject_num
   if addindex == 1:
    account=account_sina[num].split(&#39;:&#39;)
   elif addindex == 2:
    account=account_tom[num].split(&#39;:&#39;)
   elif addindex == 3:
    account=account_sohu[num].split(&#39;:&#39;)
   sender=account[0]
   passwd=account[1]
   smtpadd = _smtp_address[addindex]
   #smtpstr=str(&#39;163&#39;)
   sendMail(sender, recivers[sendindex], _subject[subjectindex], content, passwd, smtpadd)
   #print(&#39;发送账号&#39;, sender, &#39;正在发送&#39;)
   str_success_1 = &#39;发送账号【&#39;+sender+&#39;】正在发送&#39;
   logger.info(str_success_1)
   #writeLog(log_file_stream,str_success_1)
   #print(&#39;接收序号&#39;, i, recivers[i],&#39;发送成功&#39;)
   str_success_2 = &#39;接受序号【&#39;+str(i)+&#39;】【&#39;+recivers[sendindex]+&#39;】发送成功&#39;
   #writeLog(log_file_stream,str_success_2)
   logger.info(str_success_2)
   logger.info(&#39;&#39;)
   #print(&#39;&#39;)
   send_num+=1
   send_success_account.append(sender)
   time.sleep(25)
  except Exception as e:
   #print(&#39;停止于:&#39;, i, recivers[i],&#39;,发送失败&#39;)
   str_failure_1 = &#39;产生错误于:【&#39;+sender+&#39;】发送失败&#39;
   #writeLog(log_file_stream,str_failure_1)
   logger.error(str_failure_1)
   #print(e)
   str_failure_2 = str(e)
   #writeLog(log_file_stream,str_failure_2)
   logger.error(str_failure_2)
   logger.info(&#39;&#39;)
   error_num+=1
   send_failure_account.append(sender)
   #print(&#39;&#39;)
   #break
 #print(&#39;安全抵达底部&#39;)
 #writeLog(log_file_stream,&#39;脚本结束&#39;)
 set(send_success_account)
 set(send_failure_account)
 logger.info(&#39;邮件总数量【&#39;+str(len(recivers))+&#39;】&#39;)
 logger.info(&#39;总计发送邮件数量【&#39;+str(send_num)+&#39;】&#39;)
 logger.info(&#39;总计发送错误数量【&#39;+str(error_num)+&#39;】&#39;)
 logger.info(&#39;成功邮箱账号集合:&#39;+&#39;,&#39;.join(send_success_account))
 logger.info(&#39;失败邮箱账号集合:&#39;+&#39;,&#39;.join(send_failure_account))
 logger.info(&#39;脚本结束------------------------------------------------------------------&#39;)
 logger.info(&#39;&#39;)
 #log_file_stream.close()

代码就这么多,至于subject邮件主题和模板怎么搞,可以自由发挥哈,可以放在主执行文件中,也可以放到配置文件中,实现可以配置,这里就不再赘述啦

开工

下面就可以开工啦,直接到项目主目录

#python mail_html.py

위 내용은 자동 이메일 스크립트를 만들기 위한 Python 코드 예제를 가르쳐주세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.