python 연구 노트(5) - SMTP는 QQ 사서함을 사용하여 이메일을 보냅니다.

목차

이메일을 보내

1. 준비작업:

2. 일반 텍스트 메시지 내용 보내기:

3. HTML 형식으로 콘텐츠 보내기:

4. 첨부 파일이 포함된 이메일을 보내세요:

5. 대량 발송(여러 사람에게 하나의 이메일 보내기):


이메일을 보내

        다음 예에서는 QQ 사서함을 발신자로 사용합니다.

 

1. 준비작업:

         QQ 사서함을 사용하여 이메일을 보내려면 " 설정 " => " 계정 "으로 이동하여 POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV 서비스를 활성화해야 합니다 .

        서비스를 시작한 후 서비스 관리를 클릭합니다 .

        그런 다음 계정 및 보안 페이지로 이동하고 인증 코드 생성을 클릭하여 인증 코드를 생성하고 인증 코드를 기록합니다.

참고:

https://wx.mail.qq.com/list/readtemplate?name=app_intro.html#/agreement/authorizationCode

2. 일반 텍스트 메시지 내용 보내기:

import smtplib
import time
from email.mime.text import MIMEText

def send_QQ_email_plain():
    sender = user = '[email protected]'    # 发送方的邮箱账号
    passwd = 'abcdefgxxxxx'            # 授权码

    receiver = '[email protected]'        # 接收方的邮箱账号,不一定是QQ邮箱

    # 纯文本内容 
    msg = MIMEText(f'Python 邮件发送测试 {time.time()}', 'plain', 'utf-8')

    # From 的内容是有要求的,前面的abc为自己定义的 nickname,如果是ASCII格式,则可以直接写
    msg['From'] = f'abc <[email protected]>' 
    msg['To'] = receiver
    msg['Subject'] = 'Python SMTP 邮件测试'         # 点开详情后的标题

    try:
        # 建立 SMTP 、SSL 的连接,连接发送方的邮箱服务器
        smtp = smtplib.SMTP_SSL('smtp.qq.com', 465)

        # 登录发送方的邮箱账号
        smtp.login(user, passwd)

        # 发送邮件 发送方,接收方,发送的内容
        smtp.sendmail(sender, receiver, msg.as_string())

        print('邮件发送成功')

        smtp.quit()
    except Exception as e:
        print(e)
        print('发送邮件失败')

        msg['양식'] 요구사항:

 

        사용자 정의 닉네임이 ASCII가 아닌 문자인 경우 직접 작성하면 다음과 같은 오류가 보고됩니다.

msg['From'] = f'好 <[email protected]>'

 

        올바른 형식은 다음과 같습니다.

msg['From'] = f'=?UTF-8?B?{base64.b64encode("好".encode()).decode()}?= <[email protected]>'

        수신자가 QQ 메일함인 경우 이전 닉네임이 이 위치에 표시됩니다.

        자신의 닉네임을 정의할 필요가 없다면 이메일 계정을 직접 사용할 수도 있습니다.

msg['From'] = '[email protected]'

        이메일 계정이 표시됩니다:

 

         세부정보를 보려면 이메일을 클릭하세요.

 

3. HTML 형식으로 콘텐츠 보내기:

import base64
import smtplib
import time
from email.mime.text import MIMEText

def send_QQ_mail_HTML():
    user = '[email protected]'
    passwd = 'abcdefxxxx'
    receiver = '[email protected]'

    # 直接写
    # html_content = '''
    #     <h1>这个是邮件的内容</h1>
    # '''

    # 读入 html 文件的内容
    with open('./for_email.html', mode='r', encoding='utf-8') as f:
        html_content = f.read()

    # 指定类型是 html
    msg = MIMEText(html_content, 'html', 'utf-8')
    msg['From'] = user
    msg['To'] = receiver
    msg['Subject'] = '测试发送 HTML 内容'

    try:
        smtp = smtplib.SMTP_SSL('smtp.qq.com', 465)
        smtp.login(user, passwd)
        smtp.sendmail(user, receiver, msg.as_string())
        print('发送成功')
    except:
        print('发送失败')

        for_email.html의 내용:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        h1{
            color: brown;
        }
        p{
            margin: 5px;
            color: purple;
        }
    </style>
</head>
<body>
    <h1>这是一个邮件内容的标头</h1>
    <img src="https://img1.baidu.com/it/u=1890390320,3399874998&fm=253&fmt=auto&app=120&f=JPEG?w=1422&h=800">
    <div>
        <h3>From合法性检查</h3>
        <p>一、根据RFC5322协议,邮件标头中需要包含'From'信息。</p>
        <p>二、根据RFC2047, RFC822协议,邮件标头中的'From'形式为:</p>
        <p>1. 邮箱地址形式:prefix@domain, 如 '[email protected]'。</p>
        <p>2. 昵称+空格+&lt;邮箱地址&gt;形式:nickname &lt;prefix@domain&gt;,其中,nickname为ASCII字符集中字符组合或编码文本:</p>
        <p>(1)如果昵称全为ASCII字符,如'ABC',邮箱地址为'[email protected]',则标头中的'From'为'ABC &lt;[email protected]&gt;'。
            注意'ABC'和'&lt;[email protected]&gt;'之间用空格隔开;</p>
        <p>(2)如果昵称包含非ASCII字符,如中文,则请使用base64对昵称进行编码。nickname最终的形式为
            :"=?" charset "?" encoding "?" encoded-text "?="。其中,charset为字符集;
            encoding为编码方式,'B'代表base64;encoded-text为编码后的文本。例如,昵称为'QQ邮箱昵称示例',
            邮箱地址为'[email protected]',则对昵称进行base64编码,字符集使用UTF-8,则
            nickname为 '=?UTF-8?B?UVHpgq7nrrHmmLXnp7DnpLrkvos=?=',最终邮件标头中的
            'From'为'"=?utf-8?B?UVHpgq7nrrHmmLXnp7DnpLrkvos=?=" &lt;[email protected]&gt;'。
            注意编码文本和邮件地址间用空格隔开。</p>
    </div>
</body>
</html>

 

        HTML에는 외부 링크를 참조하는 img 그림이 포함되어 있습니다. 수신자가 QQ 메일함인 경우 기본적으로 그림이 표시되지 않습니다.

        다른 메일함인 경우 사진이 표시될 수 있으며(예: 회사 WeChat 메일함) html 스타일이 손실되어 효과가 없을 수 있습니다.

4. 첨부 파일이 포함된 이메일을 보내세요:

import base64
import smtplib
import time
from email.mime.application import MIMEApplication
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

def send_QQ_email_mul():
    sender = user = '[email protected]'
    passwd = 'abcdefghijk'         # 不是密码,是生成的 授权码
    receiver = '[email protected]'

    content = MIMEMultipart()           # 创建一个包含多个部分的内容
    content['From'] = user
    content['To'] = receiver
    content['Subject'] = 'Test Email'

    # 添加文本内容
    # text = MIMEText('this is a test email.', 'plain', 'utf-8')
    # content.attach(text)

    # 添加html内容
    with open('./for_email.html', mode='r', encoding='utf-8') as f:
        html_content = f.read()
    msg = MIMEText(html_content, 'html', 'utf-8')
    content.attach(msg)

    # 添加附件
    with open('./data.xlsx', 'rb') as f:
        attachment = MIMEApplication(f.read())    # 读取为附件
        attachment.add_header('Content-Disposition', 'attachment', filename='data.xlsx')
        content.attach(attachment)

    try:
        smtp = smtplib.SMTP_SSL('smtp.qq.com', 465)
        smtp.login(user, passwd)
        smtp.sendmail(sender, receiver, content.as_string())
        print('邮件发送成功')
    except Exception as e:
        print(e)
        print('发送邮件失败')

5. 대량 발송(여러 사람에게 하나의 이메일 보내기):

        각 사람의 이메일 계정 배열로 수신자를 작성하면 됩니다.

import base64
import smtplib
import time
from email.mime.text import MIMEText

def send_QQ_mail():
    sender = user = '[email protected]'
    passwd = 'ABCD'

    # 写成数组,将发给这三者
    receiver = ['[email protected]','[email protected]','[email protected]']

    msg = MIMEText(f'Python 邮件发送测试 {time.time()}', 'plain', 'utf-8')
    msg['From'] = f'=?UTF-8?B?{base64.b64encode("好".encode()).decode()}?= <[email protected]>'
    msg['To'] = 'you'            # 每个人都会看到这个内容
    msg['Subject'] = 'Python SMTP 邮件测试'         # 点开详情后的标题

    try:
        # 建立 SMTP 、SSL 的连接
        smtp = smtplib.SMTP_SSL('smtp.qq.com', 465)
        # 登录
        smtp.login(user, passwd)
        # 发送邮件 发送方,接收方,发送的内容
        smtp.sendmail(sender, receiver, msg.as_string())
        print('邮件发送成功')
        smtp.quit()
    except Exception as e:
        print(e)
        print('发送邮件失败')

 

 

おすすめ

転載: blog.csdn.net/hao_13/article/details/132818286