<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Sending Email from Python in Python Questions</title>
    <link>https://community.esri.com/t5/python-questions/sending-email-from-python/m-p/188723#M14504</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;BLOCKQUOTE class="jive-quote"&gt; I'm running Python 2.6.5. Yes this will be part of a script that updates a File Geodatabase automatically used by ArcServer as a feature landbase. I want the email to send to myself and another individual when the process succeeds or fails.&amp;nbsp;&amp;nbsp; &lt;BR /&gt; &lt;BR /&gt;manhunter trying to run that throws&amp;nbsp;&amp;nbsp; &lt;SPAN style="color:&amp;quot;#FF0000&amp;quot;;"&gt;ImportError: No module named mah.wxDialogs&lt;/SPAN&gt; &lt;BR /&gt; &lt;BR /&gt;Thanks I appreciate the help.&lt;/BLOCKQUOTE&gt;&lt;BR /&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Here, this should work. Like I said, I copied this from a larger program I use, so the imports and references to frames, etc. needed to be cleaned up a little. &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;

import os, time, sys
import smtplib
from socket import gaierror

from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.utils import COMMASPACE, formatdate
from email import Encoders

def sendMail(host, user, pwd, port, subject, tls,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sender, to, cc, files, text, pid='0'):
&amp;nbsp;&amp;nbsp;&amp;nbsp; '''main email sending function'''
##&amp;nbsp;&amp;nbsp;&amp;nbsp; print host, user, pwd, port, tls
&amp;nbsp;&amp;nbsp;&amp;nbsp; msg = MIMEMultipart()
&amp;nbsp;&amp;nbsp;&amp;nbsp; msg['From'] = strOrBust(sender)
&amp;nbsp;&amp;nbsp;&amp;nbsp; msg['To'] = strOrBust(COMMASPACE.join(to))
&amp;nbsp;&amp;nbsp;&amp;nbsp; if cc:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; msg['Cc'] = strOrBust(COMMASPACE.join(cc))
&amp;nbsp;&amp;nbsp;&amp;nbsp; msg['Date'] = strOrBust(formatdate(localtime=True))
&amp;nbsp;&amp;nbsp;&amp;nbsp; msg['Subject'] = strOrBust(subject)

&amp;nbsp;&amp;nbsp;&amp;nbsp; #encode body unicode to str before sending
&amp;nbsp;&amp;nbsp;&amp;nbsp; msg.attach(MIMEText(strOrBust(text)))

&amp;nbsp;&amp;nbsp;&amp;nbsp; for file in files:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #run with basic bag of bits, using mimetypes to try to figure out
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #file type is not worth the effort, and is not as reliable
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; part = MIMEBase('application', "octet-stream")
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; part.set_payload( open(file,"rb").read() )
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Encoders.encode_base64(part)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; part.add_header('Content-Disposition', 'attachment; filename="%s"'
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; % os.path.basename(file))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; msg.attach(part)

&amp;nbsp;&amp;nbsp;&amp;nbsp; try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; server = smtplib.SMTP(host, port)
&amp;nbsp;&amp;nbsp;&amp;nbsp; except (smtplib.SMTPException, gaierror), error:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print str(error) + '&amp;nbsp; Cannot connect to Server!','Failed!'
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return

&amp;nbsp;&amp;nbsp;&amp;nbsp; # Optional, but it gives you a nice view of the conversation
##&amp;nbsp;&amp;nbsp;&amp;nbsp; server.set_debuglevel(1)

&amp;nbsp;&amp;nbsp;&amp;nbsp; server.ehlo()
&amp;nbsp;&amp;nbsp;&amp;nbsp; if tls:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; server.starttls()
&amp;nbsp;&amp;nbsp;&amp;nbsp; server.ehlo()
&amp;nbsp;&amp;nbsp;&amp;nbsp; if user:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; server.login(user, pwd)
&amp;nbsp;&amp;nbsp;&amp;nbsp; #sendmail doesn't care about to and cc, so add them together
&amp;nbsp;&amp;nbsp;&amp;nbsp; #then uniqify
&amp;nbsp;&amp;nbsp;&amp;nbsp; toall = to + cc
&amp;nbsp;&amp;nbsp;&amp;nbsp; toall = uniqify(toall)

&amp;nbsp;&amp;nbsp;&amp;nbsp; try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; server.sendmail(sender, toall, msg.as_string())
&amp;nbsp;&amp;nbsp;&amp;nbsp; except smtplib.SMTPException, error:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print str(error),'Failed!'
&amp;nbsp;&amp;nbsp;&amp;nbsp; server.close()
&amp;nbsp;&amp;nbsp;&amp;nbsp; return

def strOrBust(obj, encoding='utf-8'):
&amp;nbsp;&amp;nbsp;&amp;nbsp; '''converts unicode objects or other objects to str or returns original
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; encoded to enncoding'''
&amp;nbsp;&amp;nbsp;&amp;nbsp; if isinstance(obj, basestring):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if not isinstance(obj, str):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; obj = obj.encode(encoding, 'ignore')
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; obj = obj.encode(encoding)
&amp;nbsp;&amp;nbsp;&amp;nbsp; else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; obj = str(obj).encode(encoding)
&amp;nbsp;&amp;nbsp;&amp;nbsp; return obj

def uniqify(seq):
&amp;nbsp;&amp;nbsp;&amp;nbsp; ''' Order preserving uniqifier for list, tuple or string'''
&amp;nbsp;&amp;nbsp;&amp;nbsp; seen = set()
&amp;nbsp;&amp;nbsp;&amp;nbsp; return [x for x in seq if x not in seen and not seen.add(x)]

&lt;/PRE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Mike&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Sat, 11 Dec 2021 09:31:21 GMT</pubDate>
    <dc:creator>MikeHunter</dc:creator>
    <dc:date>2021-12-11T09:31:21Z</dc:date>
    <item>
      <title>Sending Email from Python</title>
      <link>https://community.esri.com/t5/python-questions/sending-email-from-python/m-p/188719#M14500</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;I am trying to get this to work:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;import smtplib
from smtplib import SMTP_SSL as SMTP
import datetime

HOST = "xxxxxxxx.enterprise.xxxx.com"
PORT = 25
FROM = "xxxx.xxxxxxxx@xxxx.com"
TO = ["xxxx.xxxxxxxxx@xxxx.com"]
SUBJECT = "Test"
BODY = "Success"

BODY = BODY + "!"

smtp = smtplib.SMTP(HOST,PORT)
smtp.connect(HOST, PORT)
smtp.login("xxxxxx\xxxxx", "xxxxx")
smtp.ehlo()
smtp.sendmail(FROM,TO,body)
smtp.quit()


server.set_debuglevel(0)&lt;/PRE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;But I keep getting the following error:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;[Errno 10054] An existing connection was forcibly closed by the remote host&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Can't see anything obvious I'm doing wrong. Any ideas? Thanks.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 12 Dec 2021 16:09:49 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/sending-email-from-python/m-p/188719#M14500</guid>
      <dc:creator>MarcCusumano</dc:creator>
      <dc:date>2021-12-12T16:09:49Z</dc:date>
    </item>
    <item>
      <title>Re: Sending Email from Python</title>
      <link>https://community.esri.com/t5/python-questions/sending-email-from-python/m-p/188720#M14501</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;What version of python are you using? Also if you are using a domain log in you will need to send it raw, otherwise it may be interpreted as an escape.&lt;/SPAN&gt;&lt;BR /&gt;&lt;PRE __default_attr="plain" __jive_macro_name="code" class="jive_macro_code jive_text_macro"&gt;r"xxxxxx\xxxxx"&lt;/PRE&gt;&lt;BR /&gt;&lt;SPAN&gt;I assume you are trying to run this on a schedule when you are not logged in? Is that why you need to specify specific log on credentials? More detail of what you are trying to accomplish and your environment would help. You would probably get a better response from a more general python forum like stack exchange since this really doesn't have anything to do with ArcGIS.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 17 Jul 2012 13:53:30 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/sending-email-from-python/m-p/188720#M14501</guid>
      <dc:creator>MathewCoyle</dc:creator>
      <dc:date>2012-07-17T13:53:30Z</dc:date>
    </item>
    <item>
      <title>Re: Sending Email from Python</title>
      <link>https://community.esri.com/t5/python-questions/sending-email-from-python/m-p/188721#M14502</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;I'm guessing that you either are trying to send from a company network that does not allow smtp usage, or you simply need to use tsl.&amp;nbsp; And use the email library, it handles all the ugly stuff for you.&amp;nbsp; Here's a function that does what you are trying to do.&amp;nbsp; All the args are strings except port (int), tls (boolean) and files (list of file names of attachments).&amp;nbsp; The code below is part of a larger program, so some of the imports may not be needed.&amp;nbsp; &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;

import os, time, sys
import smtplib
from socket import gaierror

from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.utils import COMMASPACE, formatdate
from email import Encoders

from mah.wxDialogs import ibox, getfiles, ibox
import utils

def sendMail(host, user, pwd, port, subject, tls,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sender, to, cc, files, text, pid='0'):
&amp;nbsp;&amp;nbsp;&amp;nbsp; '''main email sending function'''
##&amp;nbsp;&amp;nbsp;&amp;nbsp; print host, user, pwd, port, tls
&amp;nbsp;&amp;nbsp;&amp;nbsp; msg = MIMEMultipart()
&amp;nbsp;&amp;nbsp;&amp;nbsp; msg['From'] = strOrBust(sender)
&amp;nbsp;&amp;nbsp;&amp;nbsp; msg['To'] = strOrBust(COMMASPACE.join(to))
&amp;nbsp;&amp;nbsp;&amp;nbsp; if cc:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; msg['Cc'] = strOrBust(COMMASPACE.join(cc))
&amp;nbsp;&amp;nbsp;&amp;nbsp; msg['Date'] = strOrBust(formatdate(localtime=True))
&amp;nbsp;&amp;nbsp;&amp;nbsp; msg['Subject'] = strOrBust(subject)

&amp;nbsp;&amp;nbsp;&amp;nbsp; #encode body unicode to str before sending
&amp;nbsp;&amp;nbsp;&amp;nbsp; msg.attach(MIMEText(strOrBust(text)))

&amp;nbsp;&amp;nbsp;&amp;nbsp; for file in files:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #run with basic bag of bits, using mimetypes to try to figure out
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #file type is not worth the effort, and is not as reliable
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; part = MIMEBase('application', "octet-stream")
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; part.set_payload( open(file,"rb").read() )
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Encoders.encode_base64(part)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; part.add_header('Content-Disposition', 'attachment; filename="%s"'
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; % os.path.basename(file))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; msg.attach(part)

&amp;nbsp;&amp;nbsp;&amp;nbsp; try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; server = smtplib.SMTP(host, port)
&amp;nbsp;&amp;nbsp;&amp;nbsp; except (smtplib.SMTPException, gaierror), error:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mailer.sb.SetStatusText('Failed to send email')
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ibox(str(error) + '&amp;nbsp; Cannot connect to Server!','Failed!')
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return

&amp;nbsp;&amp;nbsp;&amp;nbsp; # Optional, but it gives you a nice view of the conversation
##&amp;nbsp;&amp;nbsp;&amp;nbsp; server.set_debuglevel(1)

&amp;nbsp;&amp;nbsp;&amp;nbsp; server.ehlo()
&amp;nbsp;&amp;nbsp;&amp;nbsp; if tls:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; server.starttls()
&amp;nbsp;&amp;nbsp;&amp;nbsp; server.ehlo()
&amp;nbsp;&amp;nbsp;&amp;nbsp; if user:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; server.login(user, pwd)
&amp;nbsp;&amp;nbsp;&amp;nbsp; #sendmail doesn't care about to and cc, so add them together
&amp;nbsp;&amp;nbsp;&amp;nbsp; #then uniqify
&amp;nbsp;&amp;nbsp;&amp;nbsp; toall = to + cc
&amp;nbsp;&amp;nbsp;&amp;nbsp; toall = uniqify(toall)

&amp;nbsp;&amp;nbsp;&amp;nbsp; try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; server.sendmail(sender, toall, msg.as_string())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if mailer:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mailer.sb.SetStatusText('Message ' + pid +
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' was successfully sent')
&amp;nbsp;&amp;nbsp;&amp;nbsp; except smtplib.SMTPException, error:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if mailer:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mailer.sb.SetStatusText('Failed to send email')
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ibox(str(error),'Failed!')
&amp;nbsp;&amp;nbsp;&amp;nbsp; server.close()
&amp;nbsp;&amp;nbsp;&amp;nbsp; return

def strOrBust(obj, encoding='utf-8'):
&amp;nbsp;&amp;nbsp;&amp;nbsp; '''converts unicode objects or other objects to str or returns original
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; encoded to enncoding'''
&amp;nbsp;&amp;nbsp;&amp;nbsp; if isinstance(obj, basestring):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if not isinstance(obj, str):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; obj = obj.encode(encoding, 'ignore')
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; obj = obj.encode(encoding)
&amp;nbsp;&amp;nbsp;&amp;nbsp; else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; obj = str(obj).encode(encoding)
&amp;nbsp;&amp;nbsp;&amp;nbsp; return obj

def uniqify(seq):
&amp;nbsp;&amp;nbsp;&amp;nbsp; ''' Order preserving uniqifier for list, tuple or string'''
&amp;nbsp;&amp;nbsp;&amp;nbsp; seen = set()
&amp;nbsp;&amp;nbsp;&amp;nbsp; return [x for x in seq if x not in seen and not seen.add(x)]


&lt;/PRE&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;good luck&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Mike&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sat, 11 Dec 2021 09:31:18 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/sending-email-from-python/m-p/188721#M14502</guid>
      <dc:creator>MikeHunter</dc:creator>
      <dc:date>2021-12-11T09:31:18Z</dc:date>
    </item>
    <item>
      <title>Re: Sending Email from Python</title>
      <link>https://community.esri.com/t5/python-questions/sending-email-from-python/m-p/188722#M14503</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;I'm running Python 2.6.5. Yes this will be part of a script that updates a File Geodatabase automatically used by ArcServer as a feature landbase. I want the email to send to myself and another individual when the process succeeds or fails. &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;manhunter trying to run that throws ImportError: No module named mah.wxDialogs&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Thanks I appreciate the help.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 18 Jul 2012 11:12:37 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/sending-email-from-python/m-p/188722#M14503</guid>
      <dc:creator>MarcCusumano</dc:creator>
      <dc:date>2012-07-18T11:12:37Z</dc:date>
    </item>
    <item>
      <title>Re: Sending Email from Python</title>
      <link>https://community.esri.com/t5/python-questions/sending-email-from-python/m-p/188723#M14504</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;BLOCKQUOTE class="jive-quote"&gt; I'm running Python 2.6.5. Yes this will be part of a script that updates a File Geodatabase automatically used by ArcServer as a feature landbase. I want the email to send to myself and another individual when the process succeeds or fails.&amp;nbsp;&amp;nbsp; &lt;BR /&gt; &lt;BR /&gt;manhunter trying to run that throws&amp;nbsp;&amp;nbsp; &lt;SPAN style="color:&amp;quot;#FF0000&amp;quot;;"&gt;ImportError: No module named mah.wxDialogs&lt;/SPAN&gt; &lt;BR /&gt; &lt;BR /&gt;Thanks I appreciate the help.&lt;/BLOCKQUOTE&gt;&lt;BR /&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Here, this should work. Like I said, I copied this from a larger program I use, so the imports and references to frames, etc. needed to be cleaned up a little. &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;

import os, time, sys
import smtplib
from socket import gaierror

from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.utils import COMMASPACE, formatdate
from email import Encoders

def sendMail(host, user, pwd, port, subject, tls,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sender, to, cc, files, text, pid='0'):
&amp;nbsp;&amp;nbsp;&amp;nbsp; '''main email sending function'''
##&amp;nbsp;&amp;nbsp;&amp;nbsp; print host, user, pwd, port, tls
&amp;nbsp;&amp;nbsp;&amp;nbsp; msg = MIMEMultipart()
&amp;nbsp;&amp;nbsp;&amp;nbsp; msg['From'] = strOrBust(sender)
&amp;nbsp;&amp;nbsp;&amp;nbsp; msg['To'] = strOrBust(COMMASPACE.join(to))
&amp;nbsp;&amp;nbsp;&amp;nbsp; if cc:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; msg['Cc'] = strOrBust(COMMASPACE.join(cc))
&amp;nbsp;&amp;nbsp;&amp;nbsp; msg['Date'] = strOrBust(formatdate(localtime=True))
&amp;nbsp;&amp;nbsp;&amp;nbsp; msg['Subject'] = strOrBust(subject)

&amp;nbsp;&amp;nbsp;&amp;nbsp; #encode body unicode to str before sending
&amp;nbsp;&amp;nbsp;&amp;nbsp; msg.attach(MIMEText(strOrBust(text)))

&amp;nbsp;&amp;nbsp;&amp;nbsp; for file in files:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #run with basic bag of bits, using mimetypes to try to figure out
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #file type is not worth the effort, and is not as reliable
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; part = MIMEBase('application', "octet-stream")
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; part.set_payload( open(file,"rb").read() )
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Encoders.encode_base64(part)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; part.add_header('Content-Disposition', 'attachment; filename="%s"'
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; % os.path.basename(file))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; msg.attach(part)

&amp;nbsp;&amp;nbsp;&amp;nbsp; try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; server = smtplib.SMTP(host, port)
&amp;nbsp;&amp;nbsp;&amp;nbsp; except (smtplib.SMTPException, gaierror), error:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print str(error) + '&amp;nbsp; Cannot connect to Server!','Failed!'
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return

&amp;nbsp;&amp;nbsp;&amp;nbsp; # Optional, but it gives you a nice view of the conversation
##&amp;nbsp;&amp;nbsp;&amp;nbsp; server.set_debuglevel(1)

&amp;nbsp;&amp;nbsp;&amp;nbsp; server.ehlo()
&amp;nbsp;&amp;nbsp;&amp;nbsp; if tls:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; server.starttls()
&amp;nbsp;&amp;nbsp;&amp;nbsp; server.ehlo()
&amp;nbsp;&amp;nbsp;&amp;nbsp; if user:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; server.login(user, pwd)
&amp;nbsp;&amp;nbsp;&amp;nbsp; #sendmail doesn't care about to and cc, so add them together
&amp;nbsp;&amp;nbsp;&amp;nbsp; #then uniqify
&amp;nbsp;&amp;nbsp;&amp;nbsp; toall = to + cc
&amp;nbsp;&amp;nbsp;&amp;nbsp; toall = uniqify(toall)

&amp;nbsp;&amp;nbsp;&amp;nbsp; try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; server.sendmail(sender, toall, msg.as_string())
&amp;nbsp;&amp;nbsp;&amp;nbsp; except smtplib.SMTPException, error:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print str(error),'Failed!'
&amp;nbsp;&amp;nbsp;&amp;nbsp; server.close()
&amp;nbsp;&amp;nbsp;&amp;nbsp; return

def strOrBust(obj, encoding='utf-8'):
&amp;nbsp;&amp;nbsp;&amp;nbsp; '''converts unicode objects or other objects to str or returns original
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; encoded to enncoding'''
&amp;nbsp;&amp;nbsp;&amp;nbsp; if isinstance(obj, basestring):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if not isinstance(obj, str):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; obj = obj.encode(encoding, 'ignore')
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; obj = obj.encode(encoding)
&amp;nbsp;&amp;nbsp;&amp;nbsp; else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; obj = str(obj).encode(encoding)
&amp;nbsp;&amp;nbsp;&amp;nbsp; return obj

def uniqify(seq):
&amp;nbsp;&amp;nbsp;&amp;nbsp; ''' Order preserving uniqifier for list, tuple or string'''
&amp;nbsp;&amp;nbsp;&amp;nbsp; seen = set()
&amp;nbsp;&amp;nbsp;&amp;nbsp; return [x for x in seq if x not in seen and not seen.add(x)]

&lt;/PRE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Mike&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sat, 11 Dec 2021 09:31:21 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/sending-email-from-python/m-p/188723#M14504</guid>
      <dc:creator>MikeHunter</dc:creator>
      <dc:date>2021-12-11T09:31:21Z</dc:date>
    </item>
    <item>
      <title>Re: Sending Email from Python</title>
      <link>https://community.esri.com/t5/python-questions/sending-email-from-python/m-p/188724#M14505</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;I got it, was actually quite simple:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="plain" name="code"&gt;import smtplib import datetime import logging&amp;nbsp; HOST = "mailhost.xxxx.com" PORT = 25 from_addr = r"xxxx.xxxxxxx@xxxx.com" to_addr = r"xxxx.xxxxxxx@xxxx.com" subj = "ArcServer Update Script" date = datetime.datetime.now().strftime( "%d/%m/%Y %H:%M" ) message_text = "Hello\nThis is a mail from your server\n\nBye\n" msg = "From: %s\nTo: %s\nSubject: %s\nDate: %s\n\n%s" % ( from_addr, to_addr, subj, date, message_text )&amp;nbsp; try: &amp;nbsp;&amp;nbsp;&amp;nbsp; test = "test"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; smtp = smtplib.SMTP(HOST, PORT) &amp;nbsp;&amp;nbsp;&amp;nbsp; smtp.sendmail(from_addr,to_addr,msg + "%s" %(test)) &amp;nbsp;&amp;nbsp;&amp;nbsp; smtp.quit()&amp;nbsp; except Exception as e: &amp;nbsp;&amp;nbsp;&amp;nbsp; print e &amp;nbsp;&amp;nbsp;&amp;nbsp; logging.error(": %s" %(e))&lt;/PRE&gt;&lt;DIV style="display:none;"&gt; &lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 20 Jul 2012 18:17:55 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/sending-email-from-python/m-p/188724#M14505</guid>
      <dc:creator>MarcCusumano</dc:creator>
      <dc:date>2012-07-20T18:17:55Z</dc:date>
    </item>
  </channel>
</rss>

