Python中使用smtp在ubuntu云主机下无法发送MIMEMultipart内容的问题
最近尝试使用 python3 smtp 163 mail 定时发送 report。
- 在本地电信宽带下,使用 win10 的笔电可以成功发送 MIMEText 或 MIMEMultipart 构造的内容。
- 使用 ubuntu 华为云主机可以成功发送 MIMEText 但是无法成功发送带有图片的 MIMEMultipart。
报错 ''' smtplib.SMTPDataError (554, b'DT:SPM 163 smtp13,EcCowAD3vZXpsFVaNGqJBw--.42509S2 1515565290,please see http://mail.163.com/help/help_spam_16.htm?ip=117.78.31.36&hostid=smtp13&time=1515565290') '''
''' 以下是官网的解释 http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html • 554 DT:SPM 发送的邮件内容包含了未被许可的信息,或被系统识别为垃圾邮件。请检查是否有用户发送病毒或者垃圾邮件; '''
程序是一样一样的,不同的是开发环境。
我把邮件内容改了很多次依旧不行,目前怀疑是云主机网络环境的原因。
主机使用了弹性 IP 的代理,理论上来讲邮件都已经发到了 163 的服务器,为什么 win 下面发的能成功,ubuntu 下发的不能成功呢?
各位大哥是否有遇到过这样的情况?
非常感谢!!
Python中使用smtp在ubuntu云主机下无法发送MIMEMultipart内容的问题
markdown 显示不成功。。。大家将就先看,谢谢了!
这个问题我遇到过,是Ubuntu云主机上常见的SMTP配置问题。主要原因是云服务商的安全策略限制了邮件发送,特别是包含附件的邮件。
核心解决方案是使用SSL/TLS加密连接,并确保正确的端口和认证方式。下面是一个完整的可运行示例:
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
def send_email_with_attachment():
# 邮件配置 - 替换为你的实际信息
smtp_server = "smtp.gmail.com" # 或你的邮件服务商
smtp_port = 587 # TLS端口,也可以是465(SSL)
sender_email = "your_email@gmail.com"
sender_password = "your_app_password" # 注意:不是登录密码,是应用专用密码
receiver_email = "receiver@example.com"
# 创建MIMEMultipart邮件
msg = MIMEMultipart()
msg['From'] = sender_email
msg['To'] = receiver_email
msg['Subject'] = "测试邮件 - 包含附件"
# 邮件正文
body = "这是一封测试邮件,包含附件内容。"
msg.attach(MIMEText(body, 'plain'))
# 添加附件
attachment_data = b"这是附件的内容"
attachment = MIMEApplication(attachment_data, Name="test.txt")
attachment['Content-Disposition'] = f'attachment; filename="test.txt"'
msg.attach(attachment)
try:
# 建立SMTP连接
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls() # 启用TLS加密
server.login(sender_email, sender_password)
# 发送邮件
server.send_message(msg)
print("邮件发送成功!")
except Exception as e:
print(f"发送失败: {e}")
finally:
server.quit()
if __name__ == "__main__":
send_email_with_attachment()
关键点:
- 端口选择:使用587(TLS)或465(SSL),不要用25端口
- 认证方式:Gmail等需要应用专用密码,不是登录密码
- 加密连接:必须使用
starttls()或SSL连接 - 云主机限制:有些云厂商默认屏蔽SMTP,需要申请解封
如果还是不行,检查云主机的安全组/防火墙设置,确保出站SMTP端口开放。
总结:用TLS加密连接和正确的应用密码就能解决。
好多云平台对 25 端口上的末加密邮件都是有限制的。
改用加密端口发就行了。
同 2 楼观点,25 端口在国内的 idc 服务商是默认被封的

