programing

Python으로 이메일 보내는 방법

newsource 2022. 9. 17. 10:43

Python으로 이메일 보내는 방법

이 코드는 정상적으로 동작하며, 메일은 정상적으로 송신됩니다.

import smtplib
#SERVER = "localhost"

FROM = 'monty@python.com'

TO = ["jon@mycompany.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('myserver')
server.sendmail(FROM, TO, message)
server.quit()

단, 다음과 같은 함수로 랩을 시도하면 다음과 같습니다.

def sendMail(FROM,TO,SUBJECT,TEXT,SERVER):
    import smtplib
    """this is some test documentation in the function"""
    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()

그리고 다음과 같은 오류가 발생합니다.

 Traceback (most recent call last):
  File "C:/Python31/mailtest1.py", line 8, in <module>
    sendmail.sendMail(sender,recipients,subject,body,server)
  File "C:/Python31\sendmail.py", line 13, in sendMail
    server.sendmail(FROM, TO, message)
  File "C:\Python31\lib\smtplib.py", line 720, in sendmail
    self.rset()
  File "C:\Python31\lib\smtplib.py", line 444, in rset
    return self.docmd("rset")
  File "C:\Python31\lib\smtplib.py", line 368, in docmd
    return self.getreply()
  File "C:\Python31\lib\smtplib.py", line 345, in getreply
    raise SMTPServerDisconnected("Connection unexpectedly closed")
smtplib.SMTPServerDisconnected: Connection unexpectedly closed

왜 그런지 아는 사람 있나요?

표준 패키지와 함께 메일을 보내는 것을 추천합니다.다음 예시를 참조하십시오(Python 문서에서 복제).이 접근방식을 따를 경우 "간단한" 작업은 매우 간단하며, 더 복잡한 작업(바이너리 오브젝트 연결 또는 플레인 전송 등)도 가능합니다.HTML 멀티파트 메시지)는 매우 빠르게 수행됩니다.

# Import smtplib for the actual sending function
import smtplib

# Import the email modules we'll need
from email.mime.text import MIMEText

# Open a plain text file for reading.  For this example, assume that
# the text file contains only ASCII characters.
with open(textfile, 'rb') as fp:
    # Create a text/plain message
    msg = MIMEText(fp.read())

# me == the sender's email address
# you == the recipient's email address
msg['Subject'] = 'The contents of %s' % textfile
msg['From'] = me
msg['To'] = you

# Send the message via our own SMTP server, but don't include the
# envelope header.
s = smtplib.SMTP('localhost')
s.sendmail(me, [you], msg.as_string())
s.quit()

여러 수신처로 이메일을 보내는 경우 Python 설명서의 예를 따를 수도 있습니다.

# Import smtplib for the actual sending function
import smtplib

# Here are the email package modules we'll need
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart

# Create the container (outer) email message.
msg = MIMEMultipart()
msg['Subject'] = 'Our family reunion'
# me == the sender's email address
# family = the list of all recipients' email addresses
msg['From'] = me
msg['To'] = ', '.join(family)
msg.preamble = 'Our family reunion'

# Assume we know that the image files are all in PNG format
for file in pngfiles:
    # Open the files in binary mode.  Let the MIMEImage class automatically
    # guess the specific image type.
    with open(file, 'rb') as fp:
        img = MIMEImage(fp.read())
    msg.attach(img)

# Send the email via our own SMTP server.
s = smtplib.SMTP('localhost')
s.sendmail(me, family, msg.as_string())
s.quit()

바와 같이 은 '하다' 입니다.To MIMEText개체는 쉼표로 구분된 이메일 주소로 구성된 문자열이어야 합니다. 「」의 두 인수는 「」입니다.sendmail함수는 문자열 목록이어야 합니다(각 문자열은 이메일 주소임).

「」의의 전자 경우는, 다음과 같습니다.person1@example.com,person2@example.com , , , , 입니다.person3@example.com 생략 , 하다, 하다, 하다, 하다, 하다, 하다.

to = ["person1@example.com", "person2@example.com", "person3@example.com"]
msg['To'] = ",".join(to)
s.sendmail(me, to, msg.as_string())

",".join(to)된 단일 .

당신의 질문으로 보아 Python 튜토리얼을 거치지 않은 것으로 알고 있습니다.Python을 이용하려면 이 튜토리얼은 필수입니다.이 문서는 표준 라이브러리에 매우 적합합니다.

Python으로 메일을 보내야 할 는 메일건 API를 사용하므로 메일 발송 시 번거로움이 많습니다.그들은 매달 5,000통의 무료 이메일을 보낼 수 있는 멋진 앱/api를 가지고 있다.

이메일을 보내는 방법은 다음과 같습니다.

def send_simple_message():
    return requests.post(
        "https://api.mailgun.net/v3/YOUR_DOMAIN_NAME/messages",
        auth=("api", "YOUR_API_KEY"),
        data={"from": "Excited User <mailgun@YOUR_DOMAIN_NAME>",
              "to": ["bar@example.com", "YOU@YOUR_DOMAIN_NAME"],
              "subject": "Hello",
              "text": "Testing some Mailgun awesomness!"})

이벤트 등을 추적할 수도 있습니다.퀵 스타트 가이드를 참조해 주세요.

yagmail 패키지에 대한 조언으로 메일 송신을 돕고 싶습니다(저는 관리자로서 광고에 대해 죄송하지만, 매우 도움이 될 것 같습니다.

전체 코드는 다음과 같습니다.

import yagmail
yag = yagmail.SMTP(FROM, 'pass')
yag.send(TO, SUBJECT, TEXT)

되어 있는 것에 주의해 를 들어,는, 「」를 생략할 수 .예를 들어, 자신에게 송신하고 싶은 경우는 생략할 수 있습니다.TO주어가 필요 없는 경우에는 생략해도 됩니다.

게다가 HTML 코드나 이미지(및 그 외의 파일)를 첨부하기 쉽게 하는 것도 목적입니다.

콘텐츠를 저장할 때 다음과 같은 작업을 수행할 수 있습니다.

contents = ['Body text, and here is an embedded image:', 'http://somedomain/image.png',
            'You can also find an audio file attached.', '/local/path/song.mp3']

와, 첨부파일을 보내는 것은 간단하다!yagmail을 사용하지 않으면 약 20줄 소요됩니다.

또, 한번 설정하면, 패스워드를 다시 입력할 필요가 없어져 있습니다.이 경우 다음과 같은 작업을 수행할 수 있습니다.

import yagmail
yagmail.SMTP().send(contents = contents)

훨씬 더 간결하게!

GITHUB를 보시거나 직접 설치하세요.pip install yagmail.

들여쓰기 문제가 있다.다음 코드가 작동합니다.

import textwrap

def sendMail(FROM,TO,SUBJECT,TEXT,SERVER):
    import smtplib
    """this is some test documentation in the function"""
    message = textwrap.dedent("""\
        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()

은 Python의 입니다.3.x합니다.2.x:

import smtplib
from email.message import EmailMessage
def send_mail(to_email, subject, message, server='smtp.example.cn',
              from_email='xx@example.com'):
    # import smtplib
    msg = EmailMessage()
    msg['Subject'] = subject
    msg['From'] = from_email
    msg['To'] = ', '.join(to_email)
    msg.set_content(message)
    print(msg)
    server = smtplib.SMTP(server)
    server.set_debuglevel(1)
    server.login(from_email, 'password')  # user & password
    server.send_message(msg)
    server.quit()
    print('successfully sent the mail.')

다음 함수를 호출합니다.

send_mail(to_email=['12345@qq.com', '12345@126.com'],
          subject='hello', message='Your analysis has done!')

아래는 중국어 사용자만 가능합니다.

126/163 의 「」를 사용하는 경우는, 다음과 같이 「」를 설정할 필요가 있습니다.

여기에 이미지 설명 입력

참조: https://stackoverflow.com/a/41470149/2803344 https://docs.python.org/3/library/email.examples.html#email-examples

함수(정상)에서 코드를 들여쓰면서 원시 메시지 문자열의 행도 들여쓰게 되었습니다.단, 선행 공백은 RFC 2822의 섹션 2.2.3 및 3.2.3에서 설명한 바와 같이 헤더 행의 폴딩(연결)을 의미합니다.인터넷메시지 형식:

각 헤더 필드는 필드 이름, 콜론 및 필드 본문으로 구성된 논리적으로 한 줄의 문자입니다.단, 편의상 및 행당998/78 문자의 제한에 대처하기 위해 헤더필드의 필드 본문 부분을 여러 줄 표현으로 분할할 수 있습니다.이것을 「폴딩」이라고 부릅니다.

の in in 。sendmail 회선이 되어 「 있습니다.또, 「」, 「」(접속)을 .

From: monty@python.com    To: jon@mycompany.com    Subject: Hello!    This message was sent with Python's smtplib.

우리 마음이 암시하는 것 말고는smtplibTo: ★★★★★★★★★★★★★★★★★」Subject:이러한 이름은 행의 선두에서만 인식되기 때문에 헤더는 더 이상 인식되지 않습니다. ★★smtplib는, 매우 긴 것을 전제로 있습니다.이메일 주소는, 「」, 「」입니다.

monty@python.com    To: jon@mycompany.com    Subject: Hello!    This message was sent with Python's smtplib.

이것은 동작하지 않기 때문에, 예외가 발생합니다.

: 하는 것이다.★★★★★★★★★★★★★★★★★★,message츠키노이는 (Zeeshan이 제안한 대로) 함수에 의해 수행되거나 소스 코드에서 즉시 수행될 수 있습니다.

import smtplib

def sendMail(FROM,TO,SUBJECT,TEXT,SERVER):
    """this is some test documentation in the function"""
    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()

이제 전개는 발생하지 않고, 송신할 수 있습니다.

From: monty@python.com
To: jon@mycompany.com
Subject: Hello!

This message was sent with Python's smtplib.

예전 코드로 작동한 것과 실행한 것이 그것입니다.

또한 RFC 섹션 3.5(필수)를 수용하기 위해 헤더와 본문 사이에 빈 줄을 유지하고 Python 스타일가이드 PEP-0008(옵션)에 따라 포함을 함수 외부에 배치했습니다.

전자 메일 계정의 알 수 없는 소스(외부 소스)에서 전자 메일을 보내고 받을 수 있는 권한을 보낸 사람과 받는 사람 모두에게 부여했는지 확인하십시오.

import smtplib

#Ports 465 and 587 are intended for email client to email server communication - sending email
server = smtplib.SMTP('smtp.gmail.com', 587)

#starttls() is a way to take an existing insecure connection and upgrade it to a secure connection using SSL/TLS.
server.starttls()

#Next, log in to the server
server.login("#email", "#password")

msg = "Hello! This Message was sent by the help of Python"

#Send the mail
server.sendmail("#Sender", "#Reciever", msg)

여기에 이미지 설명 입력

아마 당신의 메시지에 탭을 붙이고 있는 것 같아요.sendMail에 전달하기 전에 메시지를 출력합니다.

이제 막 어떻게 돌아가는지 알게 되었기 때문에 여기서 내 의견을 말하려고 합니다.

SERVER 접속 설정에 포트가 지정되어 있지 않은 것 같습니다.기본 포트 25를 사용하지 않는SMTP 서버에 접속하려고 했을 때 약간 영향이 있었습니다.

smtplib에 따르면.SMTP 문서, ehlo 또는 helo 요청/응답은 자동으로 처리되므로 이 문제에 대해 걱정할 필요가 없습니다(단, 다른 문제가 모두 발생할 경우 확인해야 합니다).

또, SMTP 서버 자체에 SMTP 접속을 허가하고 있는지 어떤지 자문해 볼 필요가 있습니다.G메일이나 ZOHO와 같은 일부 사이트에서는 실제로 들어가서 이메일 계정 내에서 IMAP 연결을 활성화해야 합니다.메일 서버가 'localhost'에서 오지 않는 SMTP 연결을 허용하지 않을 수 있습니다.알아볼 게 있어요

마지막으로 TLS에서 접속을 시작할 수 있습니다.현재 대부분의 서버에는 이런 유형의 인증이 필요합니다.

이메일에 TO 필드 두 개를 입력했습니다.메시지 [']TO'] 및 msg[']FROM'] msg 딕셔너리 항목에서는 전자 메일 자체의 헤더에 올바른 정보를 표시할 수 있습니다.이러한 정보는 전자 메일의 수신측 필드에 표시됩니다(이 필드에 답장 필드를 추가할 수도 있습니다).[TO] 필드 및 [FROM]필드 자체는 서버에 필요한 것입니다.일부 전자 메일 서버가 올바른 전자 메일 헤더가 없으면 전자 메일을 거부한다는 이야기를 들은 적이 있습니다.

이것은 로컬 컴퓨터와 리모트 SMTP 서버(표시된 바와 같이 ZOHO)를 사용하여 *.txt 파일의 내용을 이메일로 보내는 데 도움이 되는 기능에서 사용한 코드입니다.

def emailResults(folder, filename):

    # body of the message
    doc = folder + filename + '.txt'
    with open(doc, 'r') as readText:
        msg = MIMEText(readText.read())

    # headers
    TO = 'to_user@domain.com'
    msg['To'] = TO
    FROM = 'from_user@domain.com'
    msg['From'] = FROM
    msg['Subject'] = 'email subject |' + filename

    # SMTP
    send = smtplib.SMTP('smtp.zoho.com', 587)
    send.starttls()
    send.login('from_user@domain.com', 'password')
    send.sendmail(FROM, TO, msg.as_string())
    send.quit()

gmail을 사용한 또 다른 구현은 다음과 같습니다.

import smtplib

def send_email(email_address: str, subject: str, body: str):
"""
send_email sends an email to the email address specified in the
argument.

Parameters
----------
email_address: email address of the recipient
subject: subject of the email
body: body of the email
"""

server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login("email_address", "password")
server.sendmail("email_address", email_address,
                "Subject: {}\n\n{}".format(subject, body))
server.quit()

이메일 발송 패키지 옵션이 만족스럽지 않아서 나만의 이메일 발송인을 만들고 오픈소스로 만들기로 했습니다.사용하기 쉽고 고급 사용 사례도 가능합니다.

설치하는 방법:

pip install redmail

사용방법:

from redmail import EmailSender
email = EmailSender(
    host="<SMTP HOST ADDRESS>",
    port=<PORT NUMBER>,
)

email.send(
    sender="me@example.com",
    receivers=["you@example.com"],
    subject="An example email",
    text="Hi, this is text body.",
    html="<h1>Hi,</h1><p>this is HTML body</p>"
)

서버에 사용자와 패스워드가 필요한 경우 패스하기만 하면 됩니다.user_name그리고.password에게EmailSender.

에는, 많은 기능이 포함되어 있습니다.send방법:

  • 첨부 파일 포함
  • HTML 본문에 직접 이미지 포함
  • 진자템플릿
  • 개봉 후 보다 예쁜 HTML 테이블

문서: https://red-mail.readthedocs.io/en/latest/

소스 코드: https://github.com/Miksus/red-mail

간단한 함수를 작성했습니다.send_email()에 의한 전자 메일 송신의 경우smtplib그리고.email패키지( 기사에 링크)또한dotenv발송인의 이메일 및 비밀번호를 로드하는 패키지입니다(코드에 기밀은 보관하지 마십시오!).나는 이메일 서비스를 위해 Gmail을 사용하고 있었다.비밀번호는App Password(다음은 구글 문서입니다.App Password).

import os
import smtplib
from email.message import EmailMessage
from dotenv import load_dotenv
_ = load_dotenv()


def send_email(to, subject, message):
    try:
        email_address = os.environ.get("EMAIL_ADDRESS")
        email_password = os.environ.get("EMAIL_PASSWORD")

        if email_address is None or email_password is None:
            # no email address or password
            # something is not configured properly
            print("Did you set email address and password correctly?")
            return False

        # create email
        msg = EmailMessage()
        msg['Subject'] = subject
        msg['From'] = email_address
        msg['To'] = to
        msg.set_content(message)

        # send email
        with smtplib.SMTP_SSL('smtp.gmail.com', 465) as smtp:
            smtp.login(email_address, email_password)
            smtp.send_message(msg)
        return True
    except Exception as e:
        print("Problem during send email")
        print(str(e))
    return False

위의 접근방식은 간단한 이메일 전송에 적합합니다.HTML 컨텐츠나 첨부 파일등의 고도의 기능을 찾고 있는 경우는, 물론 수작업으로 코딩할 수 있습니다만, 예를 들면, 기존의 패키지를 사용하는 것을 추천합니다.

Gmail은 하루에 500개의 이메일을 보낼 수 있다.하루에 많은 이메일을 보내는 경우 Amazon SES, MailGun, MailJet 또는 SendGrid와 같은 트랜잭션 이메일 서비스 공급자를 고려하십시오.

import smtplib

s = smtplib.SMTP(your smtp server, smtp port) #SMTP session

message = "Hii!!!"

s.sendmail("sender", "Receiver", message) # sending the mail

s.quit() # terminating the session

SMTP 모듈은 컨텍스트 매니저를 지원하므로 수동으로 quit()를 호출할 필요가 없습니다.이것에 의해, 예외가 있는 경우에서도, 반드시 quit()가 호출됩니다.

    with smtplib.SMTP_SSL('smtp.gmail.com', 465) as server:
        server.ehlo()
        server.login(user, password)
        server.sendmail(from, to, body)
import smtplib, ssl

port = 587  # For starttls
smtp_server = "smtp.office365.com"
sender_email = "170111018@student.mit.edu.tr"
receiver_email = "professordave@hotmail.com"
password = "12345678"
message = """\
Subject: Final exam

Teacher when is the final exam?"""

def SendMailf():
    context = ssl.create_default_context()
    with smtplib.SMTP(smtp_server, port) as server:
        server.ehlo()  # Can be omitted
        server.starttls(context=context)
        server.ehlo()  # Can be omitted
        server.login(sender_email, password)
        server.sendmail(sender_email, receiver_email, message)
        print("mail send")

예를 들어 다음과 같은 예시를 여러 번 만지작거리더니 이제 이 방법이 도움이 됩니다.

import smtplib
from email.mime.text import MIMEText

# SMTP sendmail server mail relay
host = 'mail.server.com'
port = 587 # starttls not SSL 465 e.g gmail, port 25 blocked by most ISPs & AWS
sender_email = 'name@server.com'
recipient_email = 'name@domain.com'
password = 'YourSMTPServerAuthenticationPass'
subject = "Server - "
body = "Message from server"

def sendemail(host, port, sender_email, recipient_email, password, subject, body):
    try:
        p1 = f'<p><HR><BR>{recipient_email}<BR>'
        p2 = f'<h2><font color="green">{subject}</font></h2>'
        p3 = f'<p>{body}'
        p4 = f'<p>Kind Regards,<BR><BR>{sender_email}<BR><HR>'
        
        message = MIMEText((p1+p2+p3+p4), 'html')  
        # servers may not accept non RFC 5321 / RFC 5322 / compliant TXT & HTML typos

        message['From'] = f'Sender Name <{sender_email}>'
        message['To'] = f'Receiver Name <{recipient_email}>'
        message['Cc'] = f'Receiver2 Name <>'
        message['Subject'] = f'{subject}'
        msg = message.as_string()

        server = smtplib.SMTP(host, port)
        print("Connection Status: Connected")
        server.set_debuglevel(1)
        server.ehlo()
        server.starttls()
        server.ehlo()
        server.login(sender_email, password)
        print("Connection Status: Logged in")
        server.sendmail(sender_email, recipient_email, msg)
        print("Status: Email as HTML successfully sent")

    except Exception as e:
            print(e)
            print("Error: unable to send email")

# Run
sendemail(host, port, sender_email, recipient_email, password, subject, body)
print("Status: Exit")

코드에 관한 한 근본적으로 문제가 있는 것은 아닌 것 같습니다만, 실제로 그 함수를 어떻게 부르고 있는지는 불명확합니다.서버가 응답하지 않으면 SMTPServerDisconnected 오류가 발생한다는 것만 생각할 수 있습니다.smtplib에서 getreply() 함수를 검색하면 아이디어가 떠오릅니다.

def getreply(self):
    """Get a reply from the server.

    Returns a tuple consisting of:

      - server response code (e.g. '250', or such, if all goes well)
        Note: returns -1 if it can't read response code.

      - server response string corresponding to response code (multiline
        responses are converted to a single, multiline string).

    Raises SMTPServerDisconnected if end-of-file is reached.
    """

함수 호출을 사용하여 이메일을 보내는 예도 https://github.com/rreddy80/sendEmails/blob/master/sendEmailAttachments.py에서 확인하십시오(DRY 접근법).

언급URL : https://stackoverflow.com/questions/6270782/how-to-send-an-email-with-python