I'm trying to send an email in Python
It's working without problem with gmail with this code :
import smtplib
sender = 'xxx#xxx'
receivers = ['xxx#gmail.com']
message = "hello"
try:
smtpObj = smtplib.SMTP('smtp.gmail.com:587')
smtpObj.starttls()
smtpObj.login('xxxx#gmail.com', 'my_password')
smtpObj.sendmail(sender, receivers, message)
smtpObj.quit()
print("okay")
except:
print("notokay")
But when i use it with office 365, the email is send but the message is empty.
It's the same code but with 'smtp.office365.com:587' with my correct login and password.
import smtplib
from email.mime.text import MIMEText
msg = MIMEText('hello')
msg['Subject'] = 'Urgent message'
msg['From'] = 'xxx#xxx'
msg['To'] = 'xxx#gmail.com'
s = smtplib.SMTP('smtp.gmail.com:587')
s.starttls()
s.login('xxx#gmail.com', 'my_password')
s.sendmail('xxx#xxx', 'xxx#gmail.com', msg.as_string())
s.quit()
Try the following, it might be because you need to create a MIMEText context for the formatting to be accepted by office365.
Related
I'm sending emails with Python, but the msg["Subject"] variable populates the body of the email instead of the subject box, and the variable body, populates nothing...
Everything else works fine, but I can't figure out why the subject is the body and the body is empty?
What have I missed?
Here's the code:
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
msg = MIMEMultipart()
msg['From'] = "myemail#gmail.com"
msg['To'] = 'anemail#hotmail.com'
msg['Subject'] = "for next delivery, please supply"
body = Merged_Dp_Ind_str
msg.attach(MIMEText(body, 'plain'))
text = msg.as_string()
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login('username#gmail.com', 'password1')
server.sendmail(msg['From'], msg['To'], msg['Subject'])
server.quit()
screenshot of the inbox
Your message is fine, but you are not actually sending it; you are only sending the Subject.
server.sendmail(msg['From'], msg['To'], msg['Subject'])
You apparently mean
server.sendmail(msg['From'], msg['To'], text)
However, you should probably update your code to use the modern Python 3.6+ APIs instead.
The proper modern way to format and send the message is something like
import smtplib
from email.message import EmailMessage
msg = EmailMessage()
msg['From'] = "myemail#gmail.com"
msg['To'] = 'anemail#hotmail.com'
msg['Subject'] = "for next delivery, please supply"
msg.set_content(Merged_Dp_Ind_str)
with smtplib.SMTP('smtp.gmail.com', 587) as server:
server.starttls()
server.login('username#gmail.com', 'password1')
server.send_message(msg)
server.quit()
I am trying to send an email. The code I am using is found below:
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
email_user = 'email#gmail.com'
email_password = 'password'
email_send = 'receiver#gmail.com'
subject = 'subject'
msg = MIMEMultipart()
msg['From'] = email_user
msg['To'] = email_send
msg['Subject'] = subject
body = 'Hi there, sending this email from Python!'
msg.attach(MIMEText(body,'plain'))
try:
text = msg.as_string()
server = smtplib.SMTP('smtp.gmail.com', port=587)
server.starttls()
server.login(email_user, email_password)
server.sendmail(email_user,email_send,text)
server.quit()
print('successfully sent the mail')
except:
print("failed to send mail")
I get an error "failed to send mail" with the error message:
SMTPAuthenticationError: (535, b'5.7.8 Username and Password not accepted. Learn more at\n5.7.8 https://support.google.com/mail/?p=BadCredentials t10sm6451859wra.16 - gsmtp')
The error occurs on the server.login() line, I am not able to login.
I checked other post and it says, it has to do with wrong credentials but my credentials are correct. I have check and double checked.
What could be the problem with this and how do I resolve it?
Send an email using python is easy, you may have encountered mistakes in your snippet code above and I am lazy to debug your code. But here might be the code you prefer.
The smtp.gmail.com,465 make your code secure. This snippet of code will send email to recipient through spam but lot number of emails you wish to send, will not be blocked by Gmail, you also can use bot to send email through recipient via this snippet of code.
Send Multiple Recipients
In the to line, just separate recipients by comma
to = [
'<recipient_email_address1>',
'<recipient_email_address2>',
'<recipient_email_address3>']
import smtplib
def sendEmailFunc():
gmail_user = '<your_sender_email_address_here>'
gmail_password = '<credential_password_of_above_email>'
sent_from = gmail_user
to = ['<recipient_email_address>']
subject = '<write_your_email_subject_here>'
body = "<write_your_email_body_here>"
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 Successfully====')
except:
print ('Something went wrong...')
NOTE
Please be careful with your indentation.
Hope this helpful for you.
Thank you.
I have a python script to send email and it works just fine but the problem is when I check my email inbox.
I want that username to be customize username and not the whole email address.
The format you should use for the from address is:
Your Name <username#domain.com>
If you are using multipart message, and render markdown, if you want beautiful messages.
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
multipart_msg = MIMEMultipart("alternative")
multipart_msg["Subject"] = message.splitlines()[0]
multipart_msg["From"] = DISPLAY_NAME + f' <{SENDER_EMAIL}>'
multipart_msg["To"] = receiver
text = message
html = markdown.markdown(text)
part1 = MIMEText(text, "plain")
part2 = MIMEText(html, "html")
multipart_msg.attach(part1)
multipart_msg.attach(part2)
server.sendmail(SENDER_EMAIL, receiver,
multipart_msg.as_string())
I got this code at https://en.wikibooks.org/wiki/Python_Programming/Email
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
fromaddr = "youremailid#gmail.com"
toaddr = "target#example.com"
msg = MIMEMultipart()
msg['From'] = fromaddr
msg['To'] = toaddr
msg['Subject'] = ""
body = "This is just a test email. Do not reply to this"
msg.attach(MIMEText(body, 'plain'))
import smtplib
server = smtplib.SMTP('smtp.gmail.com', 587)
server.ehlo()
server.starttls()
server.ehlo()
server.login("youremailusername", "password")
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
Format for from address is
username#server.com
Format for to address is
username#server.com
and smtplib.SMTP accepts 0 or 2 parameters.
The first parameter is type str and the second parameter is type int
I have a script that sends a .png file with SMTP. When I use a hotmail account;
smtplib.SMTP('smtp.live.com', 587)
It works without any problem. But when I use a gmail account;
smtplib.SMTP('smtp.gmail.com', 587)
An error raises: SMTPServerDisconnected: Connection unexpectedly closed
I've changed smtplib.SMTP('smtp.gmail.com', 587) to smtplib.SMTP('localhost') but didn't work. How can I fix this gmail problem?
Try this code,its working fine for me,
import smtplib
## email sending function
def email_sender(input_message, email_to, client):
''' function to send email '''
to = email_to
gmail_user = '' ## email of sender account
gmail_pwd = '' ## password of sender account
smtpserver = smtplib.SMTP("smtp.gmail.com",587)
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo
smtpserver.login(gmail_user, gmail_pwd)
header = 'To:' + to + '\n' + 'From: ' + gmail_user + '\n' +'Subject:site down! \n'
input_message = input_message + client
msg = header + input_message
smtpserver.sendmail(gmail_user, to, msg)
smtpserver.close()
you can user smtplib and email for sending emails, this code working for me after i follow this steps.
steps are
Sign in to Gmail.
Click the gear in the top right .
Select Settings.
Click Forwarding and POP/IMAP.
Select Enable IMAP.
6.Click Save Changes
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
me = "your email"
my_password = r"your password"
you = "to email id"
msg = MIMEMultipart('alternative')
msg['Subject'] = "Alert"
msg['From'] = me
msg['To'] = you
html = '<html><body><p>Hi, I have the following alerts for you!</p></body></html>'
part2 = MIMEText(html, 'html')
msg.attach(part2)
s = smtplib.SMTP_SSL('smtp.gmail.com')
s.login(me, my_password)
s.sendmail(me, you, msg.as_string())
print s
s.quit()
I've tried sending mail with python from gmail and it works fine. But the problem is when I created the Mail class with one method to whom I send specific string from my code, it can't be send.
class Mail:
def send_mail(self, msg):
import smtplib
fromaddr = 'something#something.com'
toaddrs = 'something#gmail.com'
msg = msg + "something"
print msg
username = 'something'
password = 'something'
server = smtplib.SMTP('smtp.gmail.com:587')
server.starttls()
server.login(username,password)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()
This way it sends mail but the only thing in mail is "something" that I added to string, and print msg outputs the whole string plus "something". What could be the problem?
This is the whole class for now, and it's called
mail = Mail()
mail.send_mail(message)
I don't know what was the problem, but I managed to send it using MIME that's already in python
So here is the code that works:
def send_mail(self, message):
import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
gmailUser = 'something#gmail.com'
gmailPassword = 'something'
recipient = 'something#something.com'
msg = MIMEMultipart()
msg['From'] = gmailUser
msg['To'] = recipient
msg['Subject'] = "Subject"
msg.attach(MIMEText(message))
mailServer = smtplib.SMTP('smtp.gmail.com', 587)
mailServer.ehlo()
mailServer.starttls()
mailServer.ehlo()
mailServer.login(gmailUser, gmailPassword)
mailServer.sendmail(gmailUser, recipient, msg.as_string())
mailServer.close()
The problem is most likely that the content of the message seems to requite an extra line break between the addresses and the body of the message. The solution given by iblazevic is a much more readable way of doing it anyway though.