it-swarm.it

Invio di posta da Python utilizzando SMTP

Sto usando il seguente metodo per inviare posta da Python usando SMTP. È il metodo giusto da usare o ci sono dei problemi che mi mancano?

from smtplib import SMTP
import datetime

debuglevel = 0

smtp = SMTP()
smtp.set_debuglevel(debuglevel)
smtp.connect('YOUR.MAIL.SERVER', 26)
smtp.login('[email protected]', 'PASSWORD')

from_addr = "John Doe <[email protected]>"
to_addr = "[email protected]"

subj = "hello"
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 )

smtp.sendmail(from_addr, to_addr, msg)
smtp.quit()
106
Eli Bendersky

Lo script che uso è abbastanza simile; Lo inserisco qui come esempio su come utilizzare l'e-mail. * Moduli per generare messaggi MIME; quindi questo script può essere facilmente modificato per allegare immagini, ecc.

Mi affido al mio ISP per aggiungere l'intestazione della data e dell'ora.

Il mio ISP mi richiede di utilizzare una connessione smtp sicura per inviare la posta, mi affido al modulo smtplib (scaricabile da http://www1.cs.columbia.edu/~db2501/ssmtplib.py )

Come nel tuo script, il nome utente e la password (indicati di seguito con valori fittizi), utilizzati per l'autenticazione sul server SMTP, sono in testo normale nell'origine. Questa è una debolezza della sicurezza; ma la migliore alternativa dipende da quanto è necessario (vuoi?) prestare attenzione a proteggerli.

=======================================

#! /usr/local/bin/python


SMTPserver = 'smtp.att.yahoo.com'
sender =     '[email protected]_email_domain.net'
destination = ['[email protected]_email_domain.com']

USERNAME = "USER_NAME_FOR_INTERNET_SERVICE_PROVIDER"
PASSWORD = "PASSWORD_INTERNET_SERVICE_PROVIDER"

# typical values for text_subtype are plain, html, xml
text_subtype = 'plain'


content="""\
Test message
"""

subject="Sent from Python"

import sys
import os
import re

from smtplib import SMTP_SSL as SMTP       # this invokes the secure SMTP protocol (port 465, uses SSL)
# from smtplib import SMTP                  # use this for standard SMTP protocol   (port 25, no encryption)

# old version
# from email.MIMEText import MIMEText
from email.mime.text import MIMEText

try:
    msg = MIMEText(content, text_subtype)
    msg['Subject']=       subject
    msg['From']   = sender # some SMTP servers will do this automatically, not all

    conn = SMTP(SMTPserver)
    conn.set_debuglevel(False)
    conn.login(USERNAME, PASSWORD)
    try:
        conn.sendmail(sender, destination, msg.as_string())
    finally:
        conn.quit()

except:
    sys.exit( "mail failed; %s" % "CUSTOM_ERROR" ) # give an error message
106

Il metodo che uso comunemente ... non molto diverso ma un po '

import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText

msg = MIMEMultipart()
msg['From'] = '[email protected]'
msg['To'] = '[email protected]'
msg['Subject'] = 'simple email in python'
message = 'here is the email'
msg.attach(MIMEText(message))

mailserver = smtplib.SMTP('smtp.gmail.com',587)
# identify ourselves to smtp gmail client
mailserver.ehlo()
# secure our email with tls encryption
mailserver.starttls()
# re-identify ourselves as an encrypted connection
mailserver.ehlo()
mailserver.login('[email protected]', 'mypassword')

mailserver.sendmail('[email protected]','[email protected]',msg.as_string())

mailserver.quit()

Questo è tutto

81
madman2890

Inoltre, se si desidera eseguire l'autenticazione smtp con TLS anziché SSL, è sufficiente modificare la porta (utilizzare 587) e fare smtp.starttls (). Questo ha funzionato per me:

...
smtp.connect('YOUR.MAIL.SERVER', 587)
smtp.ehlo()
smtp.starttls()
smtp.ehlo()
smtp.login('[email protected]', 'PASSWORD')
...
21
mandric

Il problema principale che vedo è che non stai gestendo alcun errore: .login () e .sendmail () hanno entrambi documentato eccezioni che possono essere lanciate, e sembra che .connect () debba avere un modo per indicare che era impossibile connettersi - probabilmente un'eccezione generata dal codice socket sottostante.

6
pjz

il seguente codice funziona bene per me:

import smtplib

to = '[email protected]'
gmail_user = '[email protected]'
gmail_pwd = 'yourpassword'
smtpserver = smtplib.SMTP("smtp.gmail.com",587)
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo() # extra characters to permit edit
smtpserver.login(gmail_user, gmail_pwd)
header = 'To:' + to + '\n' + 'From: ' + gmail_user + '\n' + 'Subject:testing \n'
print header
msg = header + '\n this is test msg from mkyong.com \n\n'
smtpserver.sendmail(gmail_user, to, msg)
print 'done!'
smtpserver.quit()

Rif: http://www.mkyong.com/python/how-do-send-email-in-python-via-smtplib/

5
Abdul Majeed

Che dire di questo?

import smtplib

SERVER = "localhost"

FROM = "[email protected]"
TO = ["[email protected]"] # must be a list

SUBJECT = "Hello!"

TEXT = "This message was sent with Python's smtplib."

# Prepare actual message

message = """\
From: %s
To: %s
Subject: %s

%s
""" % (FROM, ", ".join(TO), SUBJECT, TEXT)

# Send the mail

server = smtplib.SMTP(SERVER)
server.sendmail(FROM, TO, message)
server.quit()
5
Satish

Assicurati di non avere firewall che bloccano SMTP. La prima volta che ho provato a inviare un'e-mail, è stato bloccato sia da Windows Firewall che da McAfee - ci sono voluti un'eternità per trovarli entrambi.

5
Mark Ransom

Assicurati di formattare la data nel formato corretto - RFC2822 .

3
Douglas Leeder

Il codice di esempio che ho fatto per inviare la posta tramite SMTP.

import smtplib, ssl

smtp_server = "smtp.gmail.com"
port = 587  # For starttls
sender_email = "[email protected]"
receiver_email = "[email protected]"
password = "<your password here>"
message = """ Subject: Hi there

This message is sent from Python."""


# Create a secure SSL context
context = ssl.create_default_context()

# Try to log in to server and send email
server = smtplib.SMTP(smtp_server,port)

try:
    server.ehlo() # Can be omitted
    server.starttls(context=context) # Secure the connection
    server.ehlo() # Can be omitted
    server.login(sender_email, password)
    server.sendmail(sender_email, receiver_email, message)
except Exception as e:
    # Print any error messages to stdout
    print(e)
finally:
    server.quit()
2
Hariharan AR

Vedi tutte quelle risposte lunghe? Per favore, permettimi di autopromozione facendo tutto in un paio di righe.

Importa e collega:

import yagmail
yag = yagmail.SMTP('[email protected]', Host = 'YOUR.MAIL.SERVER', port = 26)

Quindi è solo una linea:

yag.send('[email protected]', 'hello', 'Hello\nThis is a mail from your server\n\nBye\n')

In realtà si chiuderà quando esce dal campo di applicazione (o può essere chiuso manualmente). Inoltre, ti permetterà di registrare il tuo nome utente nel tuo portachiavi in ​​modo tale da non dover scrivere la tua password nel tuo script (mi ha davvero infastidito prima di scrivere yagmail!)

Per il pacchetto/installazione, suggerimenti e suggerimenti, guarda git o pip , disponibile per entrambi Python 2 e 3.

2
PascalVKooten

Ecco un esempio funzionante per Python 3.x

#!/usr/bin/env python3

from email.message import EmailMessage
from getpass import getpass
from smtplib import SMTP_SSL
from sys import exit

smtp_server = 'smtp.gmail.com'
username = '[email protected]'
password = getpass('Enter Gmail password: ')

sender = '[email protected]'
destination = '[email protected]'
subject = 'Sent from Python 3.x'
content = 'Hello! This was sent to you via Python 3.x!'

# Create a text/plain message
msg = EmailMessage()
msg.set_content(content)

msg['Subject'] = subject
msg['From'] = sender
msg['To'] = destination

try:
    s = SMTP_SSL(smtp_server)
    s.login(username, password)
    try:
        s.send_message(msg)
    finally:
        s.quit()

except Exception as E:
    exit('Mail failed: {}'.format(str(E)))
0
Mark

puoi fare così

import smtplib
from email.mime.text import MIMEText
from email.header import Header


server = smtplib.SMTP('mail.servername.com', 25)
server.ehlo()
server.starttls()

server.login('username', 'password')
from = '[email protected]'
to = '[email protected]'
body = 'That A Message For My Girl Friend For tell Him If We will go to eat Something This Nigth'
subject = 'Invite to A Diner'
msg = MIMEText(body,'plain','utf-8')
msg['Subject'] = Header(subject, 'utf-8')
msg['From'] = Header(from, 'utf-8')
msg['To'] = Header(to, 'utf-8')
message = msg.as_string()
server.sendmail(from, to, message)
0
Skiller Dz