使用smtplib发送希伯来语邮件出现编码异常求助
解决希伯来语邮件显示字节串的问题
问题根源
你遇到的核心问题是手动将字符串编码成字节串后直接拼接进邮件内容,同时多余的字符拆分操作破坏了希伯来语的正常显示:
- 调用
.encode('utf-8')把Unicode字符串转成了bytes对象,Python拼接时会将其转换成带b''和十六进制编码的字符串表示 u' '.join(text)会把希伯来语单词的每个字符间加空格,导致文本被拆得支离破碎- 直接用字符串构造邮件内容,未指定编码头,邮件客户端无法正确识别希伯来语编码
解决方案
- 移除冗余操作:Selenium获取的
textContent本身就是可直接使用的Unicode字符串,不需要手动编码或拆分字符 - 用MIMEText构造邮件:自动设置正确的编码和内容类型,确保希伯来语正常显示
- 修复价格提取逻辑:原代码的价格拆分顺序有误,需根据页面实际文本格式调整
修正后的代码段
# 修正价格提取逻辑(根据页面实际价格格式调整,示例假设页面价格为"90 69"这类小数在前、整数在后的格式) price_text = driver.find_element(By.XPATH, '//*[@id="results-boxes"]/a[3]/div/div[2]').get_attribute("textContent").strip() price_parts = price_text.split(" ") # 注意:若页面价格是"69.90"格式,需改用split(".")拆分 similac_gold_price_dec = int(price_parts[0].strip()) similac_gold_price = int(price_parts[-1].strip()) # 直接获取希伯来语文本,无需额外编码 similac_grams = driver.find_element(By.XPATH, '//*[@id="results-boxes"]/a[4]/div/div[3]/div/div/span[1]').get_attribute("textContent").strip() if similac_gold_price < 70: text = driver.find_element(By.XPATH, '//*[@id="results-boxes"]/a[3]/div/div[3]/div/h4').get_attribute('textContent').strip() # 用MIMEText构造邮件,指定utf-8编码 msg_body = f"{text} with a price of {similac_gold_price}.{similac_gold_price_dec} ({similac_grams})" msg = MIMEText(msg_body, 'plain', 'utf-8') msg['Subject'] = "Similac Offer!" msg['From'] = my_email msg['To'] = "CCC" with smtplib.SMTP("smtp.gmail.com", 587) as connection: connection.starttls() connection.login(user=my_email, password=password) # 发送构造好的MIMEText对象 connection.send_message(msg)
额外说明
- 若页面价格是
69.90这类带小数点的格式,需把价格拆分逻辑改成price_parts = price_text.split("."),再分别取整数和小数部分 - 确保你的Gmail账户已开启SMTP访问(启用2FA的用户需使用应用专用密码)
内容的提问来源于stack exchange,提问作者Refael Bitton
相关产品推荐
相关产品推荐

