Python中使用smtp在ubuntu云主机下无法发送MIMEMultipart内容的问题

最近尝试使用 python3 smtp 163 mail 定时发送 report。

  1. 在本地电信宽带下,使用 win10 的笔电可以成功发送 MIMEText 或 MIMEMultipart 构造的内容。
  2. 使用 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内容的问题

4 回复

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()

关键点:

  1. 端口选择:使用587(TLS)或465(SSL),不要用25端口
  2. 认证方式:Gmail等需要应用专用密码,不是登录密码
  3. 加密连接:必须使用starttls()或SSL连接
  4. 云主机限制:有些云厂商默认屏蔽SMTP,需要申请解封

如果还是不行,检查云主机的安全组/防火墙设置,确保出站SMTP端口开放。

总结:用TLS加密连接和正确的应用密码就能解决。

好多云平台对 25 端口上的末加密邮件都是有限制的。
改用加密端口发就行了。

同 2 楼观点,25 端口在国内的 idc 服务商是默认被封的

回到顶部