SMTP发送邮件的时候,并没有特殊的通信语句告诉邮件服务器 谁是主送,谁是抄送/密送,这三个角色都是以同样的方式告诉邮件服务器的,然后重点在邮件内容里。

邮件内容分为头和体两部分(就像http),头部包含了各种meta信息,其中说明了谁要用to,谁要cc,谁要bcc.

一个典型的带to和bcc的邮件发送过程debug日志如下:

send: 'ehlo E42.lan\r\n'

reply: b'250-smtp.qq.com\r\n'

reply: b'250-PIPELINING\r\n'

reply: b'250-SIZE 73400320\r\n'

reply: b'250-AUTH LOGIN PLAIN\r\n'

reply: b'250-AUTH=LOGIN\r\n'

reply: b'250-MAILCOMPRESS\r\n'

reply: b'250 8BITMIME\r\n'

reply: retcode (250); Msg: b'smtp.qq.com\nPIPELINING\nSIZE 73400320\nAUTH LOGIN PLAIN\nAUTH=LOGIN\nMAILCOMPRESS\n8BITMIME'

send: 'AUTH PLAIN xxxxxxxxxxxxxxxxxxxxxxxxx\r\n'

reply: b'235 Authentication successful\r\n'

reply: retcode (235); Msg: b'Authentication successful'

send: 'mail FROM: size=1412\r\n'

reply: b'250 Ok\r\n'

reply: retcode (250); Msg: b'Ok'

send: 'rcpt TO:\r\n'

reply: b'250 Ok\r\n'

reply: retcode (250); Msg: b'Ok'

send: 'rcpt TO:\r\n'

reply: b'250 Ok\r\n'

reply: retcode (250); Msg: b'Ok'

send: 'data\r\n'

reply: b'354 End data with .\r\n'

reply: retcode (354); Msg: b'End data with .'

data: (354, b'End data with .')

send: b'Content-Type: multipart/alternative; boundary="===============6519358828643049548=="\r\nMIME-Version: 1.0\r\nAccept-Language: zh-CN\r\nAccept-Charset: ISO-8859-1,utf-8\r\nFrom: support \r\nTo: xxxxx@126.com\r\nSubject: =?utf-8?b?5Yiw5pyf5o+Q6YaS?=\r\nBcc: xxxxx@smail.nju.edu.cn\r\n\r\n--===============6519358828643049548==\r\nContent-Type: text/html; charset="utf-8"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: base64\r\n\r\nPCFET0N 这里省略一长串正文 tbD4K\r\n\r\n--===============6519358828643049548==--\r\n.\r\n'

reply: b'250 Ok: queued as \r\n'

reply: retcode (250); Msg: b'Ok: queued as'

data: (250, b'Ok: queued as')

send: 'quit\r\n'

reply: b'221 Bye\r\n'

reply: retcode (221); Msg: b'Bye'

下面是python代码:

#!/usr/bin/env python3

# coding: utf-8

#

# Created by dylanchu on 2019/7/5

import smtplib

from email.mime.multipart import MIMEMultipart

from email.mime.text import MIMEText

from email.utils import formataddr

class MyMailer(object):

def __init__(self, config: dict):

""" config['bcc'] should be a list """

self.Host = config['host']

self.Port = config['port']

self.Email = config['email']

self.Password = config['password']

self.From = config['from']

self.using_ssl = config['using_ssl']

self.Bcc = config['bcc']

if not isinstance(self.Bcc, list):

raise Exception('passed in "bcc" should be a list')

def send_mail(self, recipient, subject, content):

if recipient == '' or subject == '' or content == '':

raise Exception('recipient/subject/content should not be empty!!')

# Create message container - the correct MIME type is multipart/alternative.

msg = MIMEMultipart('alternative')

msg["Accept-Language"] = "zh-CN"

msg["Accept-Charset"] = "ISO-8859-1,utf-8"

msg['From'] = formataddr([self.From, self.Email])

msg['To'] = recipient

msg['Subject'] = subject

# msg format should be 'plain' or 'html'

body = MIMEText(content, 'html', 'utf-8')

msg.attach(body)

if self.Bcc and '@' in self.Bcc[0]:

msg['Bcc'] = ','.join(self.Bcc)

recipient = [recipient] + self.Bcc

try:

if self.using_ssl:

smtp = smtplib.SMTP_SSL(self.Host, self.Port, timeout=30)

else:

smtp = smtplib.SMTP(self.Host, self.Port, timeout=30)

smtp.set_debuglevel(1)

smtp.login(self.Email, self.Password)

smtp.sendmail(self.Email, recipient, msg.as_string())

smtp.quit()

print("email sent successfully")

except Exception as e:

print("email sent failed with error: %s" % e)

作为to和bcc看到的邮件都是这样的:

python 邮件抄送是什么意思_python使用SMTP发邮件时使用Cc(抄送)和Bcc(密送)...相关推荐

  1. python用smtp发邮件怎么抄送_python使用SMTP发邮件时使用Cc(抄送)和Bcc(密送)...

    SMTP发送邮件的时候,并没有特殊的通信语句告诉邮件服务器 谁是主送,谁是抄送/密送,这三个角色都是以同样的方式告诉邮件服务器的,然后重点在邮件内容里. 邮件内容分为头和体两部分(就像http),头部 ...

  2. python凯撒密码详解_四十八、Python用smtp发邮件详解(163和QQ邮箱)

    Python发邮件详解 一.利用163的smtp发送邮件 import smtplibfrom email.mime.text import MIMETextfrom email.header imp ...

  3. 【python起床服务】播放起床铃+给老板发邮件辞职

    [python起床服务] 播放起床铃+给老板发邮件辞职 pyttsx3 播放音频 1. 播放 mp3 文件 2. 人声读文本 测试系统的语音包 播放音频的代码 发邮件辞职 1. 发送方邮箱开启smtp ...

  4. 配置GitLab 用smtp发邮件 (gitlab-6.7.3)

    原 配置GitLab 用smtp发邮件 (gitlab-6.7.3) 摘要 先编辑 config/environments/production.rb 再编辑 config/initializers/ ...

  5. php发送邮件smtp源码,php下使用SMTP发邮件的代码

    首页 > 网络编程 > PHP编程 > php技巧 > php下使用SMTP发邮件的代码 php下使用SMTP发邮件的代码 2008-01-10 20:37:22 作者: ph ...

  6. python使用SMTP发邮件时使用Cc(抄送)和Bcc(密送)

    SMTP发送邮件的时候,并没有特殊的通信语句告诉邮件服务器 谁是主送,谁是抄送/密送,这三个角色都是以同样的方式告诉邮件服务器的,然后重点在邮件内容里. 邮件内容分为头和体两部分(就像http),头部 ...

  7. python读取邮件发送日期和时间_Python读取指定日期邮件的实例

    背景:9月份有部分数据缺失,这部分数据在邮箱里,需要重新拉取,但是每天几百封邮件,总共有6.7万封邮件,使用stat()和retr(which)结合遍历很 耗时 基于如上背景,初始大致思路为: 使用二 ...

  8. python发邮件给女朋友代码_python代码实现发邮件

    代码实现发邮件 Python的smtplib提供了一种很方便的途径发送电子邮件.它对smtp协议进行了简单的封装. 这里以QQ邮箱为例,首先要拿到授权码,这里登录你的QQ邮箱,在设置中,选择账号选项, ...

  9. python邮件合并的基本操作步骤_Python如何实现反向邮件合并功能

    摘要:邮件合并是Office的一项功能,可便捷地批量生成文档,却无法从大量Word文档中汇总信息.结合实际应用,阐述基于Python语言对Word文档进行批量导入.读取其中的表格与段落.汇总信息至Ex ...

  10. 用python自动化发送邮件(python零基础也可以快速上手,自己发邮件哦)(*^ワ^*)

    作为一个刚感还不算入门的python小白,我来分享一个我最经学到的一个python在高效率发送邮件这方面,欢迎大家一起讨论一起优化,同时也欢迎大家一起纠错.(想找原链接可以自行去翻阅哦!) 1.首先我 ...

最新文章

  1. 机械转行的都干啥去了?机械转行计算机难吗?
  2. KBMMW 4.80.00 发布
  3. ❗HTML引入CSS的三种常用方式汇总❗
  4. [mmu/cache]-cache的一些基本概念介绍
  5. hadoop3.1伪分布式部署
  6. Centos配置在线yum源
  7. MAC下快速打开指定目录
  8. 魅蓝2 android 8,魅蓝E2和魅蓝2哪个好
  9. 关于如何在网页中添加自己的QQ客服方法
  10. abaqus编写本构方程vumat_abaqusvumat子程序
  11. 黄聪:用于 Web 应用程序项目部署的 Web.config 转换语法
  12. Web.config中注册用户控件和自定义控件
  13. DataFrame对比RDD
  14. 【虎牙直播源】浏览器抓取真实直播源地址(纯前端JS解析源码)
  15. 鼠标移入显示图片案例
  16. 微信短信显示服务器解包异常,图解微信常见帐号异常处理办法
  17. guided filter
  18. 学习光线追踪(16)---折射计算[1]
  19. Java前叉夹器_新手知识:为什么说公路直装夹器更好呢?
  20. 聊聊外包团队的高效管理机制

热门文章

  1. 云服务器申请退款,腾讯云服务器申请自助退款的操作流程及图文教程
  2. 计算机文件丢失系统无法启动,windows7文件丢失无法启动怎么修复_win7系统显示文件丢失无法启动修复方法-win7之家...
  3. git生成sshkey 并添加SSH key
  4. 聊聊运营商对UDP的QoS限制和应对
  5. arm模拟器手机版_在 Android 模拟器上运行 ARM 应用
  6. Poj 2456 Aggressive cows
  7. c语言抖动算法,游戏中抖动(振动)算法的实现
  8. 北京等保测评机构项目测评收费价格标准参考
  9. 以debug模式启动PostgreSQL服务
  10. 2017年语义理解总结(一)