Python - Error (Relay access denied) while sending email

半世苍凉 提交于 2021-02-07 06:06:33

问题


I am having error when trying to send an email with python sendmail. Here is my python code: (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?


回答1:


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,

  • your mail server configuration on localhost
  • your code to send email in such a way that your localhost mail server will accept it.

In particular note that mail to port 25 (the default port for SMTP) is typically for incoming email. 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.

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). See if this is the case by using telnet on the command line; 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,

$ 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.



来源:https://stackoverflow.com/questions/45675473/python-error-relay-access-denied-while-sending-email

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!