Python自动发邮件遭遇UnicodeEncodeError错误求助
UnicodeEncodeError 发送邮件失败问题
我用Python编写的自动发邮件脚本,之前运行正常,后来突然出现编码错误:UnicodeEncodeError: 'ascii' codec can't encode characters in position 36-37: ordinal not in range(128),之后每次执行都会触发这个错误,具体报错信息为:UnicodeEncodeError: 'ascii' codec can't encode character '\xa0' in position 36: ordinal not in range(128)。
我已经尝试了以下解决方法,但问题依然存在:
- 将发件人邮箱(EMAIL)、收件人邮箱(receiver_email)编码为UTF-8
- 读写CSV文件时明确指定
encoding='utf-8' - 确保邮件内容整体采用UTF-8格式
错误发生在代码行server.sendmail(EMAIL, [receiver_email, bcc_email], text),完整的报错堆栈如下:
Traceback (most recent call last): File "C:\Users\Desktop\program\automated mail system.py", line 111, in sendBulkMails() File "C:\Users\Desktop\program\automated mail system.py", line 101, in sendBulkMails server.sendmail(EMAIL, File "C:\Users\Desktop\program\automated mail system.py", line 881, in sendmail (code, resp) = self.rcpt(each, rcpt_options) File "C:\Users\Desktop\program\automated mail system.py", line 553, in rcpt self.putcmd("rcpt", "TO:%s%s" % (quoteaddr(recip), optionlist)) File "C:\Users\Desktop\program\automated mail system.py", line 378, in putcmd self.send(f'{s}{CRLF}') File "C:\Users\Desktop\program\automated mail system.py", line 357, in send s = s.encode(self.command_encoding) UnicodeEncodeError: 'ascii' codec can't encode character '\xa0' in position 36: ordinal not in range(128)
我的代码
import smtplib import ssl import os import csv import fnmatch import logging import time import shutil logging.basicConfig(format='%(asctime)s %(message)s',level=logging.INFO) from email import encoders from email.mime.base import MIMEBase from email.mime.application import MIMEApplication from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.image import MIMEImage from email.header import Header, decode_header from email.utils import formataddr, encode_rfc2231 print("Send mails?") premQuestion = input("Y/N:") # get the date from folder name if premQuestion.upper() == "Y": rootdir = r'D:\Mailsunsent' destdir = r'D:\Mailssent' if len(os.listdir(rootdir)) == 0: print("The selected folder is empty!\nVerify!") else: for file in os.listdir (rootdir): d = os.path.join(rootdir, file) target = os.path.join(destdir, file) if os.path.isdir(d): str(d) fday = d.split()[-2:] # create the csv file after another with open('mailsload1.csv','r',newline='', encoding='utf-8') as csvin, \ open('mailsload2.csv','w',newline='', encoding='utf-8') as csvout: reader =csv.reader(csvin, delimiter=';') writer =csv.writer(csvout, delimiter=';') header = next(reader) writer.writerow(header) for name, nb, location, emailadress,senderMail,subject,passWord in reader: writer.writerow([name, nb, f"D:\\Mailsunsent\\Mails to sent {' '.join(fday)}\\{name}", emailadress, senderMail, subject, passWord ]) with open('mailsload2.csv','r',newline='', encoding='utf-8') as csvin: reader =csv.reader(csvin, delimiter=';') header = next(reader) data=[] for row in reader: dir_path = row[2] count = len(fnmatch.filter(os.listdir(dir_path), '*.*')) data.append(count) linesNb = reader.line_num with open('mailsload1.csv', 'r', encoding='utf-8') as file: reader = csv.reader(file, delimiter=';') rows = [row for row in reader] i = 0 for row in rows: for index, value in enumerate(row): if value == '0': row[index] = data[i] i+=1 with open('mailsload2.csv', 'w', newline='', encoding='utf-8') as file: writer = csv.writer(file,delimiter=';') writer.writerows(rows) countMails = 0 with open("mailsload2.csv", 'r', newline='', encoding='utf-8') as file: reader = csv.reader(file, delimiter=';') header = next(reader) # Skip header row for row in reader: if int(row[1]) > 0: SMTP_SERVER = "some server mail" PORT = 465 EMAIL = row[4] PASSWORD = row[6] subject = row[5] html = """<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Semnatura</title> </head> <body> <br> <br> <pre style="font-style: Arial;"> With pleasure,</pre> <p style="font-style: Arial;color: #00008B;"><b>Surname Name</b></p> <p style="font-style: Arial;"><b>Some firm</b></p> <p style="font-style: Arial;">Adress of firm</p> <p style="font-style: Arial;"><span style="color: #00008B;">Phone:</span> some phone number <span style="color: #00008B;">Email: </span><a href="mailto:mail@mail.com">mail@mail.com</a></p> </body> </html>""" bcc_email = row[4] receiver_email = row[3] message = MIMEMultipart() message["From"]= Header(EMAIL, charset='utf-8', errors='strict') message["To"]= Header(receiver_email, charset='utf-8', errors='strict') message["Cc"]= Header(EMAIL, charset='utf-8', errors='strict') message["Subject"]= Header(subject, charset='utf-8', errors='strict') message.attach(MIMEText(html, "html", 'utf-8')) dir_path = row[2] files = fnmatch.filter(os.listdir(dir_path), '*.*') for f in files: # add files to the message file_path = os.path.join(dir_path, f) with open(file_path, "rb") as attachment: part = MIMEBase('application', 'octet-stream') part.set_payload((attachment).read()) encoders.encode_base64(part) part.add_header('Content-Disposition', 'attachment', filename=f) message.attach(part) attachment.close() text = message.as_string() context = ssl.create_default_context() with smtplib.SMTP_SSL(SMTP_SERVER, PORT, context=context) as server: server.login(EMAIL, PASSWORD) server.sendmail(EMAIL, [receiver_email, bcc_email], text ) logging.info(f" Successfully sent email to {receiver_email}") server.quit() countMails += 1 time.sleep(20) print(f'S-au trimis {countMails} mailuri din data de {' '.join(fday)}.') shutil.move(d, target) else: quit()
内容的提问来源于stack exchange,提问作者MaxSteell
相关产品推荐
相关产品推荐

