1

I'm setting up Splunk to send e-mails through Amazon SES. But before doing this, I found a Python script (Splunk uses Python to send the mails) that I wanted to test which is not working on my Linux server. The output is shown below. I'm able to send test e-mails on the command line using Sendmail - so there is nothing wrong my Amazon SES credentials. Somehow Python doesn't parse the Auth info correctly?

Output

[root@HOSTNAME ~]# python ses.py
Message length is 47
send: 'ehlo HOSTNAME\r\n'
reply: '250-email-smtp.amazonaws.com\r\n'
reply: '250-8BITMIME\r\n'
reply: '250-SIZE 10485760\r\n'
reply: '250-STARTTLS\r\n'
reply: '250-AUTH PLAIN LOGIN\r\n'
reply: '250 Ok\r\n'
reply: retcode (250); Msg: email-smtp.amazonaws.com
8BITMIME
SIZE 10485760
STARTTLS
AUTH PLAIN LOGIN
Ok
send: 'STARTTLS\r\n'
reply: '220 Ready to start TLS\r\n'
reply: retcode (220); Msg: Ready to start TLS
send: 'ehlo HOSTNAME\r\n'
reply: '250-email-smtp.amazonaws.com\r\n'
reply: '250-8BITMIME\r\n'
reply: '250-SIZE 10485760\r\n'
reply: '250-STARTTLS\r\n'
reply: '250-AUTH PLAIN LOGIN\r\n'
reply: '250 Ok\r\n'
reply: retcode (250); Msg: email-smtp.amazonaws.com
8BITMIME
SIZE 10485760
STARTTLS
AUTH PLAIN LOGIN  
Ok
send: 'AUTH PLAIN            ASOIJFAIUSHDFIGASDALIUSFDILUAI2FIUWHIVHSLIHDVUISHDLVIUSLIDUVKSUHDLKVSUHD=\r\n'
reply: '535 Authentication Credentials Invalid\r\n'
reply: retcode (535); Msg: Authentication Credentials Invalid
Traceback (most recent call last):
File "ses.py", line 31, in <module>
server.login(smtp_username, smtp_password)
File "/usr/lib64/python2.6/smtplib.py", line 589, in login
raise SMTPAuthenticationError(code, resp)
smtplib.SMTPAuthenticationError: (535, 'Authentication Credentials Invalid')

This is the script I'm using to test which I got online.

#!/usr/bin/python
import smtplib

def prompt(prompt):
return raw_input(prompt).strip()

fromaddr = 'user@somehost'
toaddrs  = '[email protected]'
msg = """From: [email protected]

Hello, this is dog.
"""

print "Message length is " + repr(len(msg))

#Change according to your settings
smtp_server = 'email-smtp.us-east-1.amazonaws.com'
smtp_username = '[redacted]'
smtp_password = '[redacted]'
smtp_port = '587'
smtp_do_tls = True

server = smtplib.SMTP(
host = smtp_server,
port = smtp_port,
timeout = 10 
)
server.set_debuglevel(10)
server.starttls()
server.ehlo()
server.login(smtp_username, smtp_password)
server.sendmail(fromaddr, toaddrs, msg)
print server.quit()
5
  • Are you passing credential file in command ? Jan 13, 2014 at 15:10
  • Thanks. I just included the script I'm using to test. The creds are specified within the python script.
    – Lego
    Jan 13, 2014 at 15:18
  • You do not want to include the SMTP user and passwords. Those are your IAM credentials. Jan 16, 2014 at 19:06
  • Where did you generate your credentials? SES or via IAM and assigning to a group? Jan 16, 2014 at 21:46
  • tristan - I think you need to generate SMTP creds for SES and not use IAM creds. I'm able to send e-mails successfully using the creds perl script which Amazon provides ses-send-email.pl
    – Lego
    Jan 17, 2014 at 3:28

1 Answer 1

3

Perhaps not the answer you're looking for, but I'm using the Python boto library to handle AWS-related stuff:

import boto
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

def send_ses(fromaddr,
             subject,
             body,
             recipient,
             attachment=None,
             filename=''):
    """Send an email via the Amazon SES service.

    Example:
      send_ses('[email protected], 'greetings', "Hi!", '[email protected])

    Return:
      If 'ErrorResponse' appears in the return message from SES,
      return the message, otherwise return an empty '' string.
    """
    msg = MIMEMultipart()
    msg['Subject'] = subject
    msg['From'] = fromaddr
    msg['To'] = recipient
    msg.attach(MIMEText(body))
    if attachment:
        part = MIMEApplication(attachment)
        part.add_header('Content-Disposition', 'attachment', filename=filename)
        msg.attach(part)
    conn = boto.connect_ses()
    result = conn.send_raw_email(msg.as_string())
    return result if 'ErrorResponse' in result else ''
1
  • Thanks Jeff Bauer. I'm going to try this script and see if it works.
    – Lego
    Jan 17, 2014 at 3:28

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .