Ubuntu下使用ssmtp发送邮件时主题行构造问题咨询
解决ssmtp发送邮件时主题为空或参数解析错误的问题
问题分析
你遇到的问题根源在于ssmtp对-s参数的空格处理逻辑:
- 给主题手动添加双引号时,ssmtp或邮件客户端可能无法正确识别引号内的内容,导致主题显示为空;
- 去掉引号后,ssmtp会将主题中的空格视为参数分隔符,错误地把主题的后续部分当作收件人地址,触发
501格式错误。
解决方案
方法1:通过邮件正文添加主题头部(推荐)
最可靠的方式是在邮件内容中包含标准的邮件头部(包括Subject),而非依赖-s参数。这种方式完全符合邮件协议,避免参数解析问题:
with open(config_filename) as config_file: configuration_contents = config_file.read() version = "0.28" subject = f"TurAlu {version} Configuration file contents" # 构造完整邮件内容,包含必要的头部信息 email_content = ( f"From: your-sender-address@example.com\n" f"To: {recipient}\n" f"Subject: {subject}\n\n" f"{configuration_contents}" ) email_content_encoded = email_content.encode() # 调用ssmtp时仅传递收件人,邮件内容通过input传入 return_status = subprocess.run(["ssmtp", recipient], input=email_content_encoded)
方法2:正确传递带空格的主题参数
如果坚持使用-s参数,需要确保主题作为单个参数传递,且让ssmtp正确识别空格。可以通过在主题字符串外层用单引号包裹双引号(或转义双引号),确保ssmtp解析时保留空格:
with open(config_filename) as config_file: configuration_contents = config_file.read() configuration_contents_encoded = configuration_contents.encode() version = "0.28" # 用单引号包裹双引号,确保subprocess传递完整主题 subject = f"'TurAlu {version} Configuration file contents'" return_status = subprocess.run(["ssmtp", "-s", subject, recipient], input=configuration_contents_encoded)
注意:这种方式依赖ssmtp的参数解析逻辑,不同版本可能存在差异,因此优先推荐方法1。
内容的提问来源于stack exchange,提问作者Ukimiku
相关产品推荐
相关产品推荐

