[python] SMTP를 사용하여 Python에서 메일 보내기

SMTP를 사용하여 Python에서 메일을 보내려면 다음 방법을 사용하고 있습니다. 사용하기에 올바른 방법입니까 아니면 내가 놓친 것이 있습니까?

from smtplib import SMTP
import datetime

debuglevel = 0

smtp = SMTP()
smtp.set_debuglevel(debuglevel)
smtp.connect('YOUR.MAIL.SERVER', 26)
smtp.login('USERNAME@DOMAIN', 'PASSWORD')

from_addr = "John Doe <john@doe.net>"
to_addr = "foo@bar.com"

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



답변

내가 사용하는 스크립트는 매우 유사합니다. email. * 모듈을 사용하여 MIME 메시지를 생성하는 방법에 대한 예제로 여기에 게시합니다. 따라서이 스크립트는 사진 등을 첨부하기 위해 쉽게 수정할 수 있습니다.

내 ISP에 의존하여 날짜 시간 헤더를 추가합니다.

내 ISP에서 메일을 보내기 위해 보안 smtp 연결을 사용해야합니다. 저는 smtplib 모듈 ( http://www1.cs.columbia.edu/~db2501/ssmtplib.py 에서 다운로드 가능 )을 사용합니다.

스크립트에서와 같이 SMTP 서버에서 인증하는 데 사용되는 사용자 이름과 비밀번호 (아래에 더미 값 제공)는 소스에서 일반 텍스트로되어 있습니다. 이것은 보안 취약점입니다. 그러나 최선의 대안은 이들을 보호하는 데 얼마나주의해야하는지에 달려 있습니다.

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

#! /usr/local/bin/python


SMTPserver = 'smtp.att.yahoo.com'
sender =     'me@my_email_domain.net'
destination = ['recipient@her_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


답변

제가 일반적으로 사용하는 방법은 …별로 다르지 않지만 조금

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

msg = MIMEMultipart()
msg['From'] = 'me@gmail.com'
msg['To'] = 'you@gmail.com'
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('me@gmail.com', 'mypassword')

mailserver.sendmail('me@gmail.com','you@gmail.com',msg.as_string())

mailserver.quit()

그게 다야


답변

또한 SSL이 아닌 TLS로 smtp 인증을 수행하려면 포트를 변경 (587 사용)하고 smtp.starttls ()를 수행하면됩니다. 이것은 나를 위해 일했습니다.

...
smtp.connect('YOUR.MAIL.SERVER', 587)
smtp.ehlo()
smtp.starttls()
smtp.ehlo()
smtp.login('USERNAME@DOMAIN', 'PASSWORD')
...


답변

내가 본 주요 문제점은 오류를 처리하지 않는다는 것입니다. .login () 및 .sendmail () 모두 발생할 수있는 예외를 문서화했으며, .connect ()에 오류가 있음을 나타내는 방법이 있어야합니다. 연결할 수 없음-아마도 기본 소켓 코드에서 발생한 예외 일 수 있습니다.


답변

SMTP를 차단하는 방화벽이 없는지 확인하십시오. 처음으로 이메일을 보내려고했을 때 Windows 방화벽과 McAfee에 의해 차단되었습니다. 둘 다 찾는 데 오랜 시간이 걸렸습니다.


답변

이건 어때?

import smtplib

SERVER = "localhost"

FROM = "sender@example.com"
TO = ["user@example.com"] # 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()


답변

다음 코드는 저에게 잘 작동합니다.

import smtplib

to = 'mkyong2002@yahoo.com'
gmail_user = 'mkyong2002@gmail.com'
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()

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