smtplib.SMTPConnectError: (554, b’Local Policy Violation’)
当python用SMTP来发送邮件出现554这个错误的时候,我们该怎么办
首先这个问题是权限问题,你用来发送邮件的这个服务器,不在接收服务器的白名单里面,使得发送邮件一直被拒绝访问,视作垃圾邮件。这样因为一些客户的环境就使得我们很难受了,那面对这种问题我们要怎么解决,首先我们要确定接收邮件的服务器的白名单的IP地址是多少。因为只有确认这一步才开始下面的步骤,不然就无法运行
确定好白名单的ip地址之后我们就先绑定白名单的ip地址,使得我们成功发送邮件
具体代码实现步骤
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
import socket
import smtplib
from email.mime.text import MIMEText
from email.header import Header
def sendMailBySocket(sender, receiver, data):
"""
@description: 使用socket方式发送邮件
:param sender: 发件人邮箱
:param receiver: 收件人邮箱
:param data: 邮件内容
:return: BOOL
"""
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 要被绑定白名单的ip地址,
s.bind(('xxx.xxx.xxx.xxx', 0))
try:
# 连接smtp server
s.connect(('xxx.xxx.xxx.xxx', 25)) #STMP服务器地址
# s.send("EHLO server\r\n".encode(encoding='utf-8'))
s.send("MAIL FROM:{}\r\n".format(sender).encode(encoding='utf-8'))
s.send("RCPT TO:{}\r\n".format(receiver).encode(encoding='utf-8'))
s.send("DATA\r\n".encode(encoding='utf-8'))
s.send(data.encode('utf-8'))
s.send("\r\n.\r\n".encode(encoding='utf-8'))
print(s.recv(1024))#这句不能删,否则会无法发送出去
s.send("QUIT\r\n".encode(encoding='utf-8'))
return True
except Exception as e:
print(e)
return False
finally:
s.close()
def sendmail():
sender = 'from@runoob.com'
receivers = ['429240967@qq.com'] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
# 三个参数:第一个为文本内容,第二个 plain 设置文本格式,第三个 utf-8 设置编码
message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8')
message['From'] = Header("菜鸟教程", 'utf-8') # 发送者
message['To'] = Header("测试", 'utf-8') # 接收者
subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')
try:
sendMailBySocket(sender, receivers, message.as_string())
if result is True:
print('send success')
else:
print('send fail')
except smtplib.SMTPException:
print("Error: 无法发送邮件")
sendmail()