python邮件自动发送------(带界面附源码)

python邮件自动发送

注:仅用于学习,切莫做其他用途。

基础知识

SMTP

全称“简单邮件传输协议”

  • 基于TCP/IP的协议
  • 可以对连接进行认证,也可以不认证
  • 可以对连接进行加密,也可以不加密

主要作用:

1、提交邮件。当用户在电脑上输入电子邮件信息时,电子邮件客户端会使用SMTP将用户输入的电子邮件提交至服务器,由该服务器负责将电子邮件发送至接收服务器。

2、传输邮件。电子邮件服务器使用SMTP来传输消息。每条消息中途都会经过互联网上的多台邮件服务器,直到到达负责接手电子邮件地址域(domain,电子邮件地址中在@符号后面的部分)的服务器为止。

常见邮箱服务器(SMTP,POP3)地址,端口

详见
gmail(google.com)
POP3服务器地址:pop.gmail.com(SSL启用 端口:995)
SMTP服务器地址:smtp.gmail.com(SSL启用 端口:587)

163.com:
POP3服务器地址:pop.163.com(端口:110)
SMTP服务器地址:smtp.163.com(端口:25)

QQ邮箱

POP3服务器地址:pop.qq.com(端口:110)

SMTP服务器地址:smtp.qq.com (端口:25)

SMTP服务器需要身份验证

QQ企业邮箱

POP3服务器地址:pop.exmail.qq.com (SSL启用 端口:995)

SMTP服务器地址:smtp.exmail.qq.com(SSL启用 端口:587/465)

python库

smtplib模块

SMTP.set_debuglevel(level) 设置输出debug调试信息,默认不输出
SMTP.docmd(cmd[, argstring]) 发送一个命令到SMTP服务器
SMTP.connect([host[, port]]) 连接到指定的SMTP服务器
SMTP.helo([hostname]) 使用helo指令向SMTP服务器确认你的身份
SMTP.ehlo(hostname) 使用ehlo指令像ESMTP(SMTP扩展)确认你的身份
SMTP.ehlo_or_helo_if_needed() 如果在以前的会话连接中没有提供ehlo或者helo指令,这个方法会调用ehlo()或helo()
SMTP.has_extn(name) 判断指定名称是否在SMTP服务器上
SMTP.verify(address) 判断邮件地址是否在SMTP服务器上
SMTP.starttls([keyfile[, certfile]]) 使SMTP连接运行在TLS模式,所有的SMTP指令都会被加密
SMTP.login(user, password) 登录SMTP服务器
SMTP.sendmail(from_addr, to_addrs, msg, mail_options=[], rcpt_options=[]) 发送邮件from_addr:邮件发件人to_addrs:邮件收件人msg:发送消息
SMTP.quit() 关闭SMTP会话
SMTP.close() 关闭SMTP服务器连接

关于错误解决

1、smtplib.SMTPAuthenticationError: (535, b’Error: authentication failed’)

image-20201023083319948

smtper.login(sender,'password')

问题解决

'password’处要填入网易邮箱网页中的授权码。

2、smtplib.SMTPDataError: (554, b’DT:SPM 163 smtp9,DcCowAAXm4ybIZJfrAHIMg–.47672S2 1603412379,please see http://mail.163.com/help/help_spam_16.htm?ip=117.32.216.90&hostid=smtp9&time=1603412379’)

问题原因

163邮箱设置有反垃圾邮件机制,该邮件已被当作垃圾邮件。

问题解决

问题出现在代码中关于信件收发人的格式部分,需将message中的From和To改成以下格式

message['From'] = "[email protected]"
message['To'] = "[email protected]"

邮件攻击代码(带tkinter界面)

啥是tkinter界面

发送邮箱只限于网易邮箱

import tkinter as tk
from tkinter import messagebox
from smtplib import SMTP
from email.header import Header
from email.mime.text import MIMEText
import time
#设置tkinter主界面
window = tk.Tk()
window.title('攻击邮件')
window.geometry('800x700')
#设置各种输入框
l_1 = tk.Label(window, text='请输入发送邮箱:')
l_1.grid(row=0)
e_sender = tk.Entry(window, show = None)
e_sender.grid(row=0, column=1, sticky=tk.W)
l_2 = tk.Label(window, text='请输入发送邮箱授权码:')
l_2.grid(row=1)
e_password = tk.Entry(window, show = None)
e_password.grid(row=1, column=1, sticky=tk.W)
tk.Label(window, text="请输入接收邮箱:").grid(row=2)
e_receivers = tk.Entry(window, width=70,show = None)
e_receivers.grid(row=2, column=1, sticky=tk.W)
tk.Label(window, text='请输入发送内容标题:').grid(row=3)
e_title = tk.Entry(window, show=None)
e_title.grid(row=3, column=1, sticky=tk.W)
tk.Label(window, text='请输入发送内容:').grid(row=4)
t = tk.Text(window)
t.grid(row=4, column=1, sticky=tk.W)
tk.Label(window, text='请输入发送次数:').grid(row=5)
e_times = tk.Entry(window, show = None)
e_times.grid(row=5, column=1, sticky=tk.W)
tk.Label(window, text='请设置发送时间间隔(单位s):').grid(row=6)
e_sleep = tk.Entry(window, show = None)
e_sleep.grid(row=6, column=1, sticky=tk.W)
#获取用户输入的值赋值给变量
def submit():
    global sender
    sender = e_sender.get()
    global password
    password = e_password.get()
    global receivers
    receivers = e_receivers.get()
    global something
    something = t.get('0.0','end')
    global times
    times = e_times.get()
    global sleep
    sleep = e_sleep.get()
    global title
    title = e_title.get()
#发送邮件    
def do():
    message = MIMEText(something, 'plain', 'utf-8')
    message['From'] =sender  #发件人
    message['To'] = receivers   #收件人
    subject = title
    message['Subject'] = Header(subject, 'utf-8') #邮件头设置
    smtper = SMTP('smtp.163.com')     #服务器地址
    #请自行修改下面的登录口令
    smtper.login(sender,password) #此处password输入授权码
    #循环发送times次
    for i in range(int(times)):
        smtper.sendmail(sender, receivers, message.as_string()) 
        time.sleep(int(sleep)) #设置发送间隔
    tk.messagebox.showinfo(title='好哇', message='邮件发送成功'+times+'次!')   
    
tk.Button(window, text='提交', command=submit).grid(row=7)
tk.Button(window, text='发送', command=do).grid(row=7, column=1)  
window.mainloop()


运行结果:

python邮件自动发送------(带界面附源码)_第1张图片

你可能感兴趣的:(网络安全,python,python,安全)