简体   繁体   English

Python - 发送电子邮件时出错(中继访问被拒绝)

[英]Python - Error (Relay access denied) while sending email

I am having error when trying to send an email with python sendmail.尝试使用 python sendmail 发送电子邮件时出现错误。 Here is my python code: (Pas d'objet)这是我的python代码:(Pas d'objet)

#! /usr/bin/python

import smtplib

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

# me == my email address
# you == recipient's email address
me = "my@email.com"
you = "email@gmail.com"

# Create message container - the correct MIME type is multipart/alternative.
msg = MIMEMultipart('alternative')
msg['Subject'] = "Link"
msg['From'] = me
msg['To'] = you

# Create the body of the message (a plain-text and an HTML version).
text = "Hi!\nHow are you?\nHere is the link you wanted:\nhttp://www.python.org"
html = """\
<html>
  <head></head>
  <body>
    <p>Hi!<br>
       How are you?<br>
       Here is the <a href="[http://www.python.org">link</a]http://www.python.org">link</a> you wanted.
    </p>
  </body>
</html>
"""

# Record the MIME types of both parts - text/plain and text/html.
part1 = MIMEText(text, 'plain')
part2 = MIMEText(html, 'html')

# Attach parts into message container.
# According to RFC 2046, the last part of a multipart message, in this case
# the HTML message, is best and preferred.
msg.attach(part1)
msg.attach(part2)

# Send the message via local SMTP server.
s = smtplib.SMTP('localhost')
# sendmail function takes 3 arguments: sender's address, recipient's address
# and message to send - here it is sent as one string.
s.sendmail(me, you, msg.as_string())
s.quit()

When I send this email, I have this error:当我发送此电子邮件时,出现以下错误:

Traceback (most recent call last):
  File "./mail.py", line 47, in <module>
    s.sendmail(me, you, msg.as_string())
  File "/usr/lib/python2.7/smtplib.py", line 747, in sendmail
    raise SMTPRecipientsRefused(senderrs)
smtplib.SMTPRecipientsRefused: {'email@gmail.com': (454, '4.7.1 <email@gmail.com>: Relay access denied')}

I really don't know why this is not working in production since it is working in a test environment.我真的不知道为什么这在生产中不起作用,因为它在测试环境中工作。 Can you help understand, please?能帮忙理解一下吗?

The Relay access denied message is important: It sounds like you're successfully making an SMTP connection (to localhost in your sample code), but that machine is refusing to accept the message: You likely need to adjust either, Relay access denied消息很重要:听起来您已成功建立 SMTP 连接(到示例代码中的localhost ),但该机器拒绝接受该消息:您可能需要进行调整,

  • your mail server configuration on localhost您在localhost上的邮件服务器配置
  • your code to send email in such a way that your localhost mail server will accept it.您的代码以这样的方式发送电子邮件,您的localhost邮件服务器将接受它。

In particular note that mail to port 25 (the default port for SMTP) is typically for incoming email.特别要注意,到端口 25(SMTP 的默认端口)的邮件通常用于传入电子邮件。 In your case you want the mail server to accept the message and send it on elsewhere ("relaying", thus the error message).在您的情况下,您希望邮件服务器接受消息并将其发送到其他地方(“中继”,因此是错误消息)。 It seems that your mail server ( localhost here) isn't setup to accept messages for non-local domains... at least not on port 25.似乎您的邮件服务器(此处为localhost )未设置为接受非本地域的邮件……至少不在端口 25 上。

The other important use of SMTP is "mail submission", and this is typically setup on a different port (normally 587, or 465 if SSL encrypted). SMTP 的另一个重要用途是“邮件提交”,这通常设置在不同的端口上(通常为 587,如果 SSL 加密则为 465)。 See if this is the case by using telnet on the command line;通过在命令行上使用 telnet 来查看是否是这种情况; also use EHLO <some_hostname> to see what the server offers (interesting for your issue are AUTH and STARTTLS ), if it responds on the port, for example,还使用EHLO <some_hostname>查看服务器提供的内容(对您的问题感兴趣的是AUTHSTARTTLS ),如果它在端口上响应,例如,

$ telnet localhost 587
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 localhost.example.org ESMTP Postfix (Ubuntu)
ehlo localhost.example.org
250-localhost.example.org
250-VARIOUS_FEATURES_ON_LINES_LIKE_THIS
250-STARTTLS
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
QUIT
221 2.0.0 Bye
Connection closed by foreign host.

Do this for port 25 too and compare the results: That should give you clues on how to proceed - maybe you need to AUTH for example, or use port 587, or you may need to adjust your ( localhost ) mail server configuration so it acts as a "smarthost" to forward email out to the 'net.也对端口 25 执行此操作并比较结果:这应该为您提供有关如何进行的线索 - 例如,您可能需要AUTH ,或使用端口 587,或者您可能需要调整您的( localhost )邮件服务器配置以使其起作用作为“智能主机”将电子邮件转发到“网络”。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM