今天习得用python写一个连续发送QQ邮件的脚本,经过测试,成功给国内外的服务器发送邮件,包括QQ邮箱、163邮箱、google邮箱,香港科技大学的邮箱和爱丁堡大学的邮箱。一下逐步解答相关技巧。
首先,执行如下操作,__init__ 标志该文件夹是一个python程序包
$mkdir automail $cd automail $gedit qqmail $touch __init__
打开 qqmail ,写入如下代码。
1 #-*- coding: utf -8 -*- 2 import sys, os, re, urllib, urlparse 3 import smtplib 4 import traceback 5 from email.mime.text import MIMEText 6 from email.mime.multipart import MIMEMultipart 7 8 def sendmail(subject,msg,toaddrs,fromaddr,smtpaddr,password): 9 ‘‘‘ 10 @subject:邮件主题 11 @msg:邮件内容 12 @toaddrs:收信人的邮箱地址 13 @fromaddr:发信人的邮箱地址 14 @smtpaddr:smtp服务地址,可以在邮箱看,比如163邮箱为smtp.163.com 15 @password:发信人的邮箱密码 16 ‘‘‘ 17 mail_msg = MIMEMultipart() 18 if not isinstance(subject,unicode): 19 subject = unicode(subject, ‘utf-8‘) 20 mail_msg[‘Subject‘] = subject 21 mail_msg[‘From‘] = fromaddr 22 mail_msg[‘To‘] = toaddrs 23 mail_msg.attach(MIMEText(msg, ‘plain‘, ‘utf-8‘)) 24 #mail_msg.attach(MIMEText(msg, ‘html‘, ‘utf-8‘)) 25 try: 26 s = smtplib.SMTP() 27 s.connect(smtpaddr) #连接smtp服务器 28 s.login(fromaddr,password) #登录邮箱 29 s.sendmail(fromaddr, toaddrs, mail_msg.as_string()) #发送邮件 30 print "mail sent to %s succeed!" % (toaddrs) 31 s.quit() 32 except Exception,e: 33 print "Error: unable to send email to %s!" % (toaddrs) 34 print traceback.format_exc() 35 36 if __name__ == ‘__main__‘: 37 fromaddr = "[email protected]" 38 smtpaddr = "smtp.qq.com" 40 subject = "Robio2018" 41 password = "svwpwgunhrbpbjha" 42 file_object = open(‘letter‘) 43 msg = file_object.read() 44 file_object.close() 45 for toaddrs in open("namelist"): 46 prof = toaddrs 47 sendmail(subject,msg,prof,fromaddr,smtpaddr,password)
代码解读:
-
import email import smtplib
SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件。
-
def sendmail(subject,msg,toaddrs,fromaddr,smtpaddr,password)
最核心的代码就是该函数,正确填写该函数的实参、设置邮箱允许第三方操作。
-
mail_msg.attach(MIMEText(msg, ‘plain‘, ‘utf-8‘))
第23行,第一个参数是邮件正文内容;第二个参数 ‘plain‘ ,因为我们发送的是纯文本的邮件;第三个参数保证多语言的兼容性。关于发送多种类型的邮件,可以参考廖雪峰老师的教程。
-
file_object = open(‘letter‘) msg = file_object.read() file_object.close()
代码42-44,打开与脚本处于同一个路径中的letter文档,读取全部内容并存储于一个大型的msg字符串中,及时关闭该文档,不然会一直占用内存。如果每次都要手动关闭比较麻烦,python有一个with 关键字可以自动关闭文档,请自行百度。
-
for toaddrs in open("namelist")
第45行,使用一个for循环逐行从收件人邮箱列表中读取收件人邮箱。
原文地址:https://www.cnblogs.com/gdut-gordon/p/9259639.html
时间: 2024-10-01 00:01:08