鱼C论坛

 找回密码
 立即注册
查看: 2345|回复: 4

邮件自动发送有时候可以运行有时候又报错,萌新求解

[复制链接]
发表于 2019-11-27 16:52:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
萌新一个,现在想用python搭建一个自动化发报表的小程序,遇到了一个问题:这个代码有时候可以运行,有时候又会报错(通常循环没运行完中途报错),报错内容比较奇怪,打开模块包代码也开不懂,所以前来求助。报错的区域我用红字标记了,麻烦大佬们帮帮忙看看,报错内容我已经放上去了。



import win32com.client
from PIL import ImageGrab
import uuid
import time
import datetime
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
from email.mime.application import MIMEApplication
from email.mime.base import MIMEBase
from email.header import Header
#日期函数
now = datetime.datetime.now()
date=datetime.datetime.strftime(now-datetime.timedelta(days = 1), '%Y%m%d')

# 截图邮件正文内容
def copypicture(file_path,sheet_name,range):
    w = win32com.client.Dispatch('Excel.Application')
    wb = w.Workbooks.Open(file_path)
    ws = wb.Worksheets(sheet_name)
    ws.Range(range).CopyPicture()
    ws.Paste(ws.Range('Z1'))
    new_shape_name = sheet_name
    w.Selection.ShapeRange.Name =  new_shape_name
    ws.Shapes(new_shape_name).Copy()
    img = ImageGrab.grabclipboard()
    img.save ('C:\\Users\\lujinjian\Desktop\\粤南大区续费报表\\全网通明细\\'+sheet_name +str(date)+'.png')
    wb.SaveAs ('C:\\Users\\lujinjian\Desktop\\粤南大区续费报表\\全网通明细\\'+sheet_name+str(date)+'.xlsx')
    wb.Close()
    print(sheet_name+"已经保存")

def sent_mail(user_name,receivers_name,password,city,picture_file_path,file_path):
    user = user_name     #发送人邮件
    pwd = password   #密码
    receivers = receivers_name  #收件人
    msg = MIMEMultipart()
    msg.attach(MIMEText('<p><img src="cid:1"></p>', 'html', 'utf-8'))
    fp1 = open(picture_file_path, 'rb')
    msgImage = MIMEImage(fp1.read())
    fp1.close()
    msgImage.add_header('Content-ID', '<1>')
    msg.attach(msgImage)
   
    #添加附件
    att = MIMEApplication(open(file_path,'rb').read())
    att.add_header('Content-Disposition', 'attachment', filename=Header(city +date+'.xlsx','utf-8').encode())
    msg.attach(att)

    #添加收件发件人信息
    msg['From'] = "{}".format(user)
    msg['To'] = receivers_name
    msg['Subject'] = city+ '续费日报_'+date
   
    #发送邮件
    try:
        smtp = smtplib.SMTP()
        smtp.connect('smtp.exmail.qq.com')
        smtp.login(user,pwd)
        smtp.sendmail(user, receivers, msg.as_string())
        smtp.close()
        print("邮件发送成功")
    except:
        print("邮件发送不成功")

#循环操作
city_fasong = {'惠州':'B1:T200','南宁':'B1:T248','中山':'B1:T164','珠海':'B1:T128','东莞':'B1:T265'}  
user_name = ('lujinjian@58.com')
yy_receivers = ('lujinjian@58.com,wangxiao19')
password = 'cHScQqNjoExNcPXR'
city_receivers ={'东莞':'lujinjian@58.com','惠州':'wangxiao19','南宁':'wangxiao19','中山':'wangxiao19','珠海':'wangxiao19'}
for key in city_fasong.keys():
    city = key
    file_path =('C:\\Users\\lujinjian\Desktop\\粤南大区续费报表\\全网通明细\\'+city+'.xlsx')
    value = city_fasong[key]
    copypicture(file_path,key,value)
    picture_file_path = ('C:\\Users\\lujinjian\Desktop\\粤南大区续费报表\\全网通明细\\'+city +str(date)+'.png')
    file_path = ('C:\\Users\\lujinjian\Desktop\\粤南大区续费报表\\全网通明细\\'+city +str(date)+'.xlsx')
    all_receivers = yy_receivers + city_receivers[key]
    sent_mail(user_name,all_receivers,password,city,picture_file_path,file_path)

输出内容:

惠州已经保存
邮件发送成功
Traceback (most recent call last):
  File "C:\Users\lujinjian\Desktop\粤南大区续费报表\全网通明细\测试.py", line 73, in <module>
    copypicture(file_path,key,value)
  File "C:\Users\lujinjian\Desktop\粤南大区续费报表\全网通明细\测试.py", line 26, in copypicture
    img.save ('C:\\Users\\lujinjian\Desktop\\粤南大区续费报表\\全网通明细\\'+sheet_name +str(date)+'.png')
AttributeError: 'NoneType' object has no attribute 'save'
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-11-27 20:36:02 | 显示全部楼层
没用过,你img是Nonetype,那就是你的img没有从剪切板获得,一步一步往前找,很有可能你的MIME什么的爬取的资源就是伪图片
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-29 02:09:48 From FishC Mobile | 显示全部楼层
本帖最后由 XiaoPaiShen 于 2019-11-29 07:07 编辑

你有多个excel文件,每个文件中有不同的sheet,sheet的名字是城市名
对吗?

应该将程序分成两个部分:
1. 将制作图片,保存excel文件
2. 确保5个城市的图片和excel文件都已生成,再发送电子邮件
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-29 02:43:57 | 显示全部楼层
同意二楼,这类报错经常遇到,一般是没获取到图片,处理的时候就报错。
保存前面可以加一个判断是否获取到图片的语句,保存图片时也可加个 try……except……,总之要考虑出错的时候的处理逻辑
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-19 15:09:33 | 显示全部楼层
##更新如下,已经可以正常运作了
import win32com.client
from PIL import ImageGrab
import uuid
import time
import datetime
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
from email.mime.application import MIMEApplication
from email.mime.base import MIMEBase
from email.header import Header
now = datetime.datetime.now()
date=datetime.datetime.strftime(now-datetime.timedelta(days = 1), '%Y%m%d')


def copypicture(file_path,sheet_name,range):
    w = win32com.client.Dispatch('Excel.Application')
    w.Visible = False  # 可视化
    w.DisplayAlerts = False  # 是否显示警告
    wb = w.Workbooks.Open(file_path)
    ws = wb.Worksheets(sheet_name)
    new_shape_name = '截图'
    ws.Range(range).CopyPicture()
    #ws.Paste(ws.Range('w1'))
    ws.Paste()   
    w.Selection.ShapeRange.Name = new_shape_name
    ws.Shapes(new_shape_name).Copy()
    img = ImageGrab.grabclipboard()
    try:
        img.save ('C:\\Users\\lujinjian\Desktop\\粤南大区续费报表\\全网通明细\\图片\\'+sheet_name +str(date)+'.png')
        print(sheet_name+"已经保存")
    except AttributeError:
        print("Couldn't save img {}".format(img))
        
    wb.Close(SaveChanges=0)
   


def sent_mail(user_name,receivers_name,password,city,picture_file_path,file_path):
    user = user_name
    pwd = password
    receivers = receivers_name  #收件人
    msg = MIMEMultipart()
    msg.attach(MIMEText('<p><img src="cid:1"></p>', 'html', 'utf-8'))
    fp1 = open(picture_file_path, 'rb')
    msgImage = MIMEImage(fp1.read())
    fp1.close()
    msgImage.add_header('Content-ID', '<1>')
    msg.attach(msgImage)
   
    #添加附件
    att = MIMEApplication(open(file_path,'rb').read())
    att.add_header('Content-Disposition', 'attachment', filename=Header(city +date+'.xlsx','utf-8').encode())
    msg.attach(att)

    #添加收件发件人信息
    msg['From'] = "{}".format(user)
    msg['To'] = receivers_name
    msg['Subject'] = city+ '续费日报_'+date
   
    #发送邮件
    try:
        smtp = smtplib.SMTP()
        smtp.connect('smtp.exmail.qq.com')
        smtp.login(user,pwd)
        smtp.sendmail(user, receivers, msg.as_string())
        smtp.close()
        print(city+"邮件发送成功")
    except:
        print("邮件发送不成功")



#循环
user_name = ('lujinjian@58.com')
yy_receivers = ('hbg-ocdso-yn@58.com')
password = 'cHScQqNjoExNcPXR'
city_receivers ={'东莞':'hbgdg@58.com,hbg-ocdso-yn@58.com','惠州':'fc-hz@58.com,hbg-ocdso-yn@58.com','南宁':'fc-nn@58.com,hbg-ocdso-yn@58.com','中山':'58fc-zs@58.com,hbg-ocdso-yn@58.com','珠海':'dl-broker-zhuhaisales@anjuke.com,hbg-ocdso-yn@58.com'}
city_range = {'东莞':'B1:T272','中山':'B1:T161','惠州':'B1:T202','珠海':'B1:T132','南宁':'B1:T242'}

for key in city_receivers.keys():
    city = key
    picture_file_path = ('C:\\Users\\lujinjian\Desktop\\粤南大区续费报表\\全网通明细\\图片\\'+city +str(date)+'.png')
    file_path2 = ('C:\\Users\\lujinjian\Desktop\\粤南大区续费报表\\全网通明细\\'+city +'.xlsx')
    all_receivers = city_receivers[key]
    range = city_range[key]
    copypicture(file_path2,city,range)
    sent_mail(user_name,all_receivers,password,city,picture_file_path,file_path2)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-21 02:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表