'Sending e-mails using yahoo account in python

I have yahoo account. Is there any python code to send email from my account ?



Solution 1:[1]

I racked my head (briefly) regarding using yahoo's smtp server. 465 just would not work. I decided to go the TLS route over port 587 and I was able to authenticate and send email.

import smtplib
from email.mime.text import MIMEText
SMTP_SERVER = "smtp.mail.yahoo.com"
SMTP_PORT = 587
SMTP_USERNAME = "username"
SMTP_PASSWORD = "password"
EMAIL_FROM = "[email protected]"
EMAIL_TO = "[email protected]"
EMAIL_SUBJECT = "REMINDER:"
co_msg = """
Hello, [username]! Just wanted to send a friendly appointment
reminder for your appointment:
[Company]
Where: [companyAddress]
Time: [appointmentTime]
Company URL: [companyUrl]
Change appointment?? Add Service??
change notification preference (text msg/email)
"""
def send_email():
    msg = MIMEText(co_msg)
    msg['Subject'] = EMAIL_SUBJECT + "Company - Service at appointmentTime"
    msg['From'] = EMAIL_FROM 
    msg['To'] = EMAIL_TO
    debuglevel = True
    mail = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
    mail.set_debuglevel(debuglevel)
    mail.starttls()
    mail.login(SMTP_USERNAME, SMTP_PASSWORD)
    mail.sendmail(EMAIL_FROM, EMAIL_TO, msg.as_string())
    mail.quit()

if __name__=='__main__':
send_email()

Solution 2:[2]

Visit yahoo account security page here

You'll need to generate an app password - it's an option towards the bottom of the screen. Use the password Yahoo generated on this page in your script.

Solution 3:[3]

To support non-ascii characters; you could use email package:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from email.header    import Header
from email.mime.text import MIMEText
from getpass import getpass
from smtplib import SMTP_SSL

# provide credentials
login = '[email protected]'
password = getpass('Password for "%s": ' % login)

# create message
msg = MIMEText('message body…', 'plain', 'utf-8')
msg['Subject'] = Header('subject…', 'utf-8')
msg['From'] = login
msg['To'] = ', '.join([login, ])

# send it   
s = SMTP_SSL('smtp.mail.yahoo.com', timeout=10) #NOTE: no server cert. check
s.set_debuglevel(0)
try:
    s.login(login, password)
    s.sendmail(msg['From'], msg['To'], msg.as_string())
finally:
    s.quit()

Solution 4:[4]

There are a couple of issues. One is addressed by an answer already posted.

  1. Use TLS (Port 465)
  2. Make sure you have an app password. Yahoo and other email services have updated their authentication practices to limit things that can login without 2 factor authentication. If you want to authenticate with smtplib you need to create an app password here: https://login.yahoo.com/myaccount/security/app-password

If you do that then you'll be able to send emails

Solution 5:[5]

For A good year and a half I had the following def working fine on PC's and Pi's. I had a script emailing me every Saturday at noon as a general health check. The working part was..

def my_callback():  
    server = smtplib.SMTP('smtp.mail.yahoo.com:587')
    server.starttls()
    server.login(username,password)
    server.sendmail(fromaddr, toaddrs, message)
    server.quit()

The about two weeks ago its stopped working on all my devices. Running through the script I found that the "server.starttls()" line was the source of the failure. Investigating around I came to find that reverting to port 465 and SSL, dropping the server.starttls() fixed the Issue.

def my_callback():  
    server = smtplib.SMTP_SSL('smtp.mail.yahoo.com', 465)
    server.login(username,password)
     server.sendmail(fromaddr, toaddrs, message)
    server.quit()

Anybody else have this issue? Have Yahoo changed something?

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 xpros
Solution 2 Elliot
Solution 3 jfs
Solution 4 Dom DaFonte
Solution 5 Kiwa Macey