it-swarm-vi.tech

Gửi thư từ Python bằng cách sử dụng SMTP

Tôi đang sử dụng phương thức sau để gửi thư từ Python bằng cách sử dụng SMTP. Đây có phải là phương pháp phù hợp để sử dụng hay có những vấn đề mà tôi đang thiếu?

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

Kịch bản tôi sử dụng khá giống nhau; Tôi đăng nó ở đây như một ví dụ về cách sử dụng email. * Các mô-đun để tạo tin nhắn MIME; vì vậy tập lệnh này có thể dễ dàng sửa đổi để đính kèm hình ảnh, v.v.

Tôi dựa vào ISP của tôi để thêm tiêu đề thời gian ngày.

ISP của tôi yêu cầu tôi sử dụng kết nối smtp an toàn để gửi thư, tôi dựa vào mô-đun smtplib (có thể tải xuống tại http://www1.cs.columbia.edu/~db2501/ssmtplib.py )

Như trong tập lệnh của bạn, tên người dùng và mật khẩu, (được đưa ra các giá trị giả bên dưới), được sử dụng để xác thực trên máy chủ SMTP, ở dạng văn bản thuần trong nguồn. Đây là một điểm yếu bảo mật; nhưng sự thay thế tốt nhất phụ thuộc vào mức độ cẩn thận mà bạn cần (muốn?) trong việc bảo vệ những thứ này.

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

#! /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
Vincent Marchetti

Phương pháp tôi thường sử dụng ... không khác nhiều nhưng một chút

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()

Đó là nó

81
madman2890

Ngoài ra nếu bạn muốn thực hiện smtp auth với TLS trái ngược với SSL thì bạn chỉ cần thay đổi cổng (sử dụng 587) và làm smtp.starttls (). Điều này làm việc cho tôi:

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

Gotcha chính tôi thấy là bạn không xử lý bất kỳ lỗi nào: cả không thể kết nối - có thể là một ngoại lệ được ném bởi mã ổ cắm bên dưới.

6
pjz

mã sau đang hoạt động tốt cho tôi:

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()

Tham chiếu: http://www.mkyong.com/python/how-do-send-email-in-python-via-smtplib/

5
Abdul Majeed

Cái này thì sao?

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

Hãy chắc chắn rằng bạn không có bất kỳ tường lửa nào chặn SMTP. Lần đầu tiên tôi cố gắng gửi email, nó đã bị chặn bởi cả Windows Firewall và McAfee - mất mãi mãi để tìm thấy cả hai.

5
Mark Ransom

Bạn nên đảm bảo rằng bạn định dạng ngày theo định dạng chính xác - RFC2822 .

3
Douglas Leeder

Mã ví dụ mà tôi đã làm để gửi thư bằng cách sử dụng 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

Xem tất cả những câu trả lời lenghty? Xin cho phép tôi tự quảng bá bằng cách thực hiện tất cả trong một vài dòng.

Nhập và kết nối:

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

Sau đó, nó chỉ là một lót:

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

Nó thực sự sẽ đóng khi đi ra khỏi phạm vi (hoặc có thể được đóng bằng tay). Hơn nữa, nó sẽ cho phép bạn đăng ký tên người dùng của mình trong khóa để bạn không phải viết mật khẩu trong tập lệnh của mình (điều này thực sự làm phiền tôi trước khi viết yagmail!)

Đối với gói/cài đặt, mẹo và thủ thuật vui lòng xem git hoặc pip , có sẵn cho cả Python 2 và 3.

2
PascalVKooten

Đây là một ví dụ hoạt động cho 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

bạn có thể làm như thế

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