I have a class sendmail and I am trying to call it in other classes.The argument will determine which email to send. The argument in the sendmail class will send mail according to parameters given to it from other classes where it is being called.However,when executing it, I get error message saying argument not defined.
Here is my code:
#!/usr/bin/python
import smtplib
class sendmail(argument):
TO = 'yourmail#gmail.com'
if argument=='PIR':
SUBJECT = 'PIR'
TEXT = 'Motion is detected'
gmail_sender = 'mymail#gmail.com'
gmail_passwd = 'mypwd'
server = smtplib.SMTP('smtp.gmail.com', 587)
server.ehlo()
server.starttls()
server.ehlo
server.login(gmail_sender, gmail_passwd)
BODY = '\r\n'.join([
'TO: %s' % TO,
'From: %s' % gmail_sender ,
'Subject: %s' % SUBJECT ,
'',
TEXT
])
try:
server.sendmail(gmail_sender, [TO], BODY)
print 'email sent'
except:
print 'error'
server.quit()
I think what you're looking for is a static function.
import smtplib
class MailUtils:
#staticmethod
def sendmail(argument):
TO = 'yourmail#gmail.com'
if argument=='PIR':
SUBJECT = 'PIR'
TEXT = 'Motion is detected'
gmail_sender = 'mymail#gmail.com'
gmail_passwd = 'mypwd'
server = smtplib.SMTP('smtp.gmail.com', 587)
server.ehlo()
server.starttls()
server.ehlo
server.login(gmail_sender, gmail_passwd)
BODY = '\r\n'.join([
'TO: %s' % TO,
'From: %s' % gmail_sender ,
'Subject: %s' % SUBJECT ,
'',
TEXT
])
try:
server.sendmail(gmail_sender, [TO], BODY)
print 'email sent'
except:
print 'error'
server.quit()
You would use it by doing this:
import MailUtils
MailUtils.sendmail(argument)
Note: As mentioned in the comments below, this approach works best if the class contains multiple related functions, not just a single one.
Related
for i in range(3):
gmail_user = 'email'
gmail_password = 'pass'
sent_from = gmail_user
to = ['email']
subject = 'Lorem ipsum dolor sit amet'
body = rand_quote
email_text = ("""\
From: %s
To: %s
Subject: %s
%s
""" % (sent_from, ", ".join(to), subject, body))
try:
smtp_server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
smtp_server.ehlo()
smtp_server.login(gmail_user, gmail_password)
smtp_server.sendmail(sent_from, to, email_text)
smtp_server.close()
print ("Email sent successfully!")
except Exception as ex:
print ("Something went wrong….",ex)
When I remove the for loop the code runs great with the subject and body sending properly however when I try to run something like the code above the email comes is sent as such.
When you moved text """ """ then it added spaces before From:, To:, Subject: and it treads it as part of body.
You have to move all lines in """ """ to the left.
for i in range(3):
gmail_user = 'email'
gmail_password = 'pass'
sent_from = gmail_user
to = ['email']
subject = 'Lorem ipsum dolor sit amet'
body = rand_quote
email_text = ("""\
From: %s
To: %s
Subject: %s
%s
""" % (sent_from, ", ".join(to), subject, body))
try:
smtp_server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
smtp_server.ehlo()
smtp_server.login(gmail_user, gmail_password)
smtp_server.sendmail(sent_from, to, email_text)
smtp_server.close()
print ("Email sent successfully!")
except Exception as ex:
print ("Something went wrong….",ex)
BTW:
See also #tripleee comment below.
Some examples in documentation: email.examples
when i send an email message like this i cant get the subject get into the message(i get it in the body). what can i do to change it? thank you!
def SendEmailNotHTML(EmailToList,EmailBody,EmailSubject):
mail_from = settings.SMTP_USER
try:
for current_mail_to in EmailToList:
fromaddr = settings.SMTP_USER
toaddrs = current_mail_to
msg = "\r\n".join([
"Subject: {0}".format(EmailSubject),
"",
"{0}".format(EmailBody)
])
print(msg)
my_email = MIMEText(msg, "plain")
username = settings.SMTP_USER
password = settings.SMTP_PASSWORD
server = smtplib.SMTP('smtp.gmail.com:25')
server.ehlo()
server.starttls()
server.login(username,password)
server.sendmail(fromaddr, toaddrs, my_email.as_string())
server.quit()
except Exception as e:
print('cant send email' + str(e))
I'm using this code to send email and it works, but when I receive email the subject looks like this and also has no message:
" No subject"
afsagsag#gmail.com To: Subject: OMG Super Important Message Good morning, <afsagsag#gmail.com>
import smtplib
import carriers
def amtg():
gmail_user = 'sgfsfsfsf#gmail.com'
gmail_password = 'rtgassds'
sent_from = gmail_user
to = ['sgssfsd#gmail.com']
subject = 'OMG Super Important Message'
body = carriers.rsting + carriers.amtg1
email_text = """\
From: %s
To: %s
subject: %s
%s
""" % (sent_from, ", ".join(to), subject, body)
try:
server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
server.ehlo()
server.login(gmail_user, gmail_password)
server.sendmail(sent_from, to, email_text)
server.close()
print ('Email sent!')
except:
print ('Something went wrong...')
This is the code I have running, which is supposedly working totally fine, but it is not actually sending the email to the address I specify. It does not have anything to do with the CSV because I have another script doing the same thing and working just fine. The problem is that the email is being placed in the senders inbox... which is weird.
I would rather use this script since it's nicely object oriented and it has all the proper subject fields, etc.
import smtplib
import pandas as pd
class Gmail(object):
def __init__(self, email, password, recepient):
self.email = email
self.password = password
self.recepient = recepient
self.server = 'smtp.gmail.com'
self.port = 465
session = smtplib.SMTP_SSL(self.server, self.port)
session.ehlo
session.login(self.email, self.password)
self.session = session
print('Connected to Gmail account successfully.')
def send_message(self, subject, body):
headers = [
"From: " + self.email,
"Subject: " + subject,
"To: " + self.recepient,
"MIME-Version: 1.0",
"Content-Type: text/html"]
headers = "\r\n".join(headers)
self.session.sendmail(
self.email,
self.email,
headers + "\r\n\r\n" + body)
print('- Message has been sent.')
df = pd.read_csv('test.csv', error_bad_lines=False)
for index, row in df.iterrows():
print('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
comp_name = (row['name'])
print('Email to: ' + comp_name)
rec = (row['email'])
print('Email to: ' + rec)
gm = Gmail('email#gmail.com', 'password', rec)
gm.send_message('email to ' + comp_name, '<b>This is a test<b>')
print('-- Message for ' + rec + ' (' + comp_name + ') is completed.')
print('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
print('*********************************')
print('Finish reading through CSV.')
print('*********************************')
print('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
Let me know if there is something wrong. I would really like this to work.
Just so that you can see it is working, here is the other script I am testing it against (which is poorly formatted) and it is completely functioning properly.
import smtplib
import pandas as pd
df = pd.read_csv('test.csv', error_bad_lines=False)
gmail_user = 'email#gmail.com'
gmail_password = 'password'
for index, row in df.iterrows():
sent_from = gmail_user
to = (row['email'])
subject = 'Important Message'
body = 'Hey, whats up'
rec = (row['email'])
comp_name = (row['name'])
print('Email to: ' + comp_name)
print('Email to: ' + rec)
email_text = """\
From: %s
To: %s
Subject: %s
%s
""" % (sent_from, to, subject, body)
try:
server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
server.ehlo()
server.login(gmail_user, gmail_password)
server.sendmail(sent_from, to, email_text)
server.close()
print ('-- Email sent!')
except:
print ('-- Something went wrong...')
print('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
print('*********************************')
print('Finish reading through CSV.')
print('*********************************')
print('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
You should pass the recipient instead of the sender.
self.session.sendmail(
self.email,
# self.email, <- wrong here
self.recepient,
headers + "\r\n\r\n" + body)
I'm trying to email multiple recipients using the pyton script below. I've searched the forum for answers, but have not been able to implement any of them correctly. If anyone has a moment to review my script and spot/resolve the problem it would be greatly appreciated.
Here's my script, I gather my issue is in the 'sendmail' portion, but can't figure out how to fix it:
gmail_user = "sender#email.com"
gmail_pwd = "sender_password"
recipients = ['recipient1#email.com','recipient2#email.com']
def mail(to, subject, text, attach):
msg = MIMEMultipart()
msg['From'] = gmail_user
msg['To'] = ", ".join(recipients)
msg['Subject'] = subject
msg.attach(MIMEText(text))
part = MIMEBase('application', 'octet-stream')
part.set_payload(open(attach, 'rb').read())
Encoders.encode_base64(part)
part.add_header('Content-Disposition',
'attachment; filename="%s"' % os.path.basename(attach))
msg.attach(part)
mailServer = smtplib.SMTP("smtp.gmail.com", 587)
mailServer.ehlo()
mailServer.starttls()
mailServer.ehlo()
mailServer.login(gmail_user, gmail_pwd)
mailServer.sendmail(gmail_user, to, msg.as_string())
mailServer.close()
mail("recipient1#email.com, recipient2#email.com",
"Subject",
"Message",
"attchachment")
Any insight would be greatly appreciated.
Best,
Matt
It should be more like
mail(["recipient1#email.com", "recipient2#email.com"],
"Subject",
"Message",
"attchachment")
You already have a array of recipients declared,that too globally,You can use that without passing it as an argument to mail.
I wrote this bit of code to do exactly what you want. If you find a bug let me know (I've tested it and it works):
import email as em
import smtplib as smtp
import os
ENDPOINTS = {KEY: 'value#domain.com'}
class BoxWriter(object):
def __init__(self):
pass
def dispatch(self, files, box_target, additional_targets=None, email_subject=None, body='New figures'):
"""
Send an email to multiple recipients
:param files: list of files to send--requires full path
:param box_target: Relevant entry ENDPOINTS dict
:param additional_targets: other addresses to send the same email
:param email_subject: optional title for email
"""
destination = ENDPOINTS.get(box_target, None)
if destination is None:
raise Exception('Target folder on Box does not exist')
recipients = [destination]
if additional_targets is not None:
recipients.extend(additional_targets)
subject = 'Updating files'
if email_subject is not None:
subject = email_subject
message = em.MIMEMultipart.MIMEMultipart()
message['From'] = 'user#domain.com'
message['To'] = ', '.join(recipients)
message['Date'] = em.Utils.formatdate(localtime=True)
message['Subject'] = subject
message.attach(em.MIMEText.MIMEText(body + '\n' +'Contents: \n{0}'.format('\n'.join(files))))
for f in files:
base = em.MIMEBase.MIMEBase('application', "octet-stream")
base.set_payload(open(f, 'rb').read())
em.Encoders.encode_base64(base)
base.add_header('Content-Disposition', 'attachment; filename={0}'.format(os.path.basename(f)))
message.attach(base)
conn = smtp.SMTP('smtp.gmail.com', 587)
un = 'user#gmail.com'
pw = 'test1234'
conn.starttls()
conn.login(un, pw)
conn.sendmail('user#domain.com', recipients, message.as_string())
conn.close()
I was facing the same issue, I fixed this issue now. Here is my code -
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import smtplib
import datetime
def sendMail():
message = MIMEMultipart()
message["To"] = "xxxxx#xxxx.com,yyyy#yyyy.com"
message["Cc"] = "zzzzzz#gmail.com,*********#gmail.com"
message["From"] = "xxxxxxxx#gmail.com"
message["Password"] = "***************"
server = 'smtp.gmail.com:587'
try:
now = datetime.datetime.now()
message['Subject'] = "cxxdRL Table status (Super Important Message) - "+str(now)
server = smtplib.SMTP(server)
server.ehlo()
server.starttls()
server.login(message["From"], message["Password"])
server.sendmail(message["From"], message["To"].split(",") + message["Cc"].split(","), message.as_string())
server.quit()
print('Mail sent')
except:
print('Something went wrong...')
sendMail()