python發送email郵件


一.開啟郵箱SMTP服務

發送郵件需要使用SMTP服務器,常用的免費服務器有:163、126、qq等郵箱。

QQ郵箱配置方式如下:

1) 登錄qq郵箱,選擇【設置】-【賬戶】

2) 在POP3/IMAP/SMAP/Exchage/CardDAV/CalDAV服務中,找到POP3/SMTP服務和IMAP/SMTP服務,點擊開啟。

 

163郵箱配置方式如下:

1)注冊163郵箱,登錄后設置。

2) 在新頁面點擊“客戶端授權密碼”,勾選“開啟”,彈出新窗口填寫手機驗證碼。

3) 填寫授權碼

4) 提示開啟成功。

二、使用python發送郵件

  • 使用python自帶的模塊:smptlib、email
import smtplib
from email.mime.text import MIMEText
from email.header import Header

1、發送普通的郵件

# 發送郵件的步驟
import smtplib
from email.mime.text import MIMEText     # 用來構造文本類型的郵件
from email.header import Header          # 用來構造郵件的頭部
# 第一步:創建一個SMTP的對象
s = smtplib.SMTP()
# 第二步:連接到SMTP的服務器
host = 'smtp.163.com'    # 設置163郵箱服務器,端口為:25
port = 25
#  host = 'smtp.qq.com'  port = 465  # 設置qq郵箱服務器,端口為:465
s.connect(host,port)       # 連接服務器
# s.connect(host = 'smtp.163.com',port = 25)
# 第三步:登錄SMTP服務器
mail_user = '18814726725@163.com'           # 163郵箱的用戶名
mail_pass = 'password'                      # 注意:此處填寫的是郵箱的SMTP服務器授權碼
s.login(user=mail_user,password=mail_pass)
# 第四步:構建郵件內容
content = '使用python測試發送郵件'             # 構建郵件內容
msg = MIMEText(content,_charset='utf8')     # _charset 指定編碼格式
msg['Subject'] = Header('測試報告','utf8')   # 郵件主題
msg['From'] = 'wl18814726725@163.com'       # 發件人郵箱,可傳入列表,用於給多個人發送文件
msg['To'] = '1572533878@qq.com'             # 收件人

# 第五步:發送郵件
s.sendmail(from_addr=msg['From'],to_addrs=msg['To'],msg=msg.as_string())     #將郵件內容轉換為字符串

2、發送HTML格式郵件及附件

import smtplib
from email.mime.text import MIMEText     # 文本類型的郵件,用來構造郵件
from email.header import Header          # 用來構造郵件的頭部
from email.mime.application import MIMEApplication   
from email.mime.multipart import MIMEMultipart  # 用來構造附件

# 發送郵件的步驟
# 第一步:創建一個SMTP的對象
s = smtplib.SMTP()
# 第二步:連接到SMTP的服務器
host = 'smtp.163.com'    # 設置163郵箱服務器,端口為:25
port = 25
#  host = 'smtp.qq.com'    # 設置qq郵箱服務器,端口為:465
s.connect(host,port)   # 連接服務器
# 第三步:登錄SMTP服務器
mail_user = 'wl18814726725@163.com'     # 163郵箱的用戶名
mail_pass = 'wl987654321'               # 注意:此處填寫的是郵箱的SMTP服務器授權碼
s.login(user=mail_user,password=mail_pass)

# 構造文本郵件內容
content = '使用python測試發送郵件'             # 構建郵件內容
textcontent = MIMEText(content,_charset='utf8')        # _charset 指定編碼格式
# 構造附件(二進制字節流形式)
part = MIMEApplication(open("report.html",'rb').read(),_subtype=None) 
# part = MIMEApplication(open("report.html",'rb').read()) 需要查看_subtype=None 是否會引發異常
part.add_header('content-disposition', 'attachment', filename='report18.html')  # 對方收到郵件之后,附件在郵件中顯示的名稱
# 封裝一封郵件
msg = MIMEMultipart()
# 加入文本內容
msg.attach(textcontent)
msg.attach(part)
# 發送郵件
msg['From'] = 'wl18814726725@163.com'       #發件人郵箱
msg['To'] = '1572533878@qq.com'             #收件人

#第五步:發送郵件
s.sendmail(from_addr='wl18814726725@163.com',to_addrs='1572533878@qq.com',msg=msg.as_string())      # 將郵件內容轉換為字符串
  定義send_email函數
import smtplib
from email.mime.text import MIMEText     #文本類型的郵件,用來構造郵件
from email.header import Header          #用來構造郵件的頭部
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart  #用來構造附件

def send_email(filepath):
    """
    :param filepath:   #傳入報告文件的路徑
    :return:
    """
    # 發送郵件的步驟
    # 第一步:創建一個SMTP的對象
    s = smtplib.SMTP()
    # 第二步:連接到SMTP的服務器
    host = 'smtp.163.com'    #設置163郵箱服務器,端口為:25
    port = 25
    #  host = 'smtp.qq.com'    #設置qq郵箱服務器,端口為:465
    s.connect(host,port)   #連接服務器
    # 第三步:登錄SMTP服務器
    mail_user = 'wl18814726725@163.com'     #163郵箱的用戶名
    mail_pass = 'wl987654321'               #注意:此處填寫的是郵箱的SMTP服務器授權碼
    s.login(user=mail_user,password=mail_pass)

    #構造文本郵件內容
    content = '使用python測試發送郵件'             #構建郵件內容
    textcontent = MIMEText(content,_charset='utf8')        #_charset 指定編碼格式
    #構造附件(二進制字節流形式)
    part = MIMEApplication(open(filepath,'rb').read())
    part.add_header('content-disposition', 'attachment', filename='report988.html')  #對方收到郵件之后,附件在郵件中顯示的名稱
    # 封裝一封郵件
    msg = MIMEMultipart()
    #加入附件和文本內容
    msg.attach(textcontent)
    msg.attach(part)
    #發送郵件
    msg['From'] = 'wl18814726725@163.com'       #發件人郵箱
    msg['To'] = '1572533878@qq.com'             #收件人

    #第五步:發送郵件
    s.sendmail(from_addr=msg['From'],to_addrs=msg['To'],msg=msg.as_string())      #將郵件內容轉換為字符串

send_email('report.html')

定義send_email函數

import smtplib
from email.mime.text import MIMEText     # 文本類型的郵件,用來構造郵件
from email.header import Header          # 用來構造郵件的頭部
from email.mime.application import MIMEApplication   
from email.mime.multipart import MIMEMultipart  # 用來構造附件

# 發送郵件的步驟
# 第一步:創建一個SMTP的對象
s = smtplib.SMTP()
# 第二步:連接到SMTP的服務器
host = 'smtp.163.com'    # 設置163郵箱服務器,端口為:25
port = 25
#  host = 'smtp.qq.com'    # 設置qq郵箱服務器,端口為:465
s.connect(host,port)   # 連接服務器
# 第三步:登錄SMTP服務器
mail_user = 'wl18814726725@163.com'     # 163郵箱的用戶名
mail_pass = 'password'               # 注意:此處填寫的是郵箱的SMTP服務器授權碼
s.login(user=mail_user,password=mail_pass)

# 構造文本郵件內容
content = '使用python測試發送郵件'             # 構建郵件內容
textcontent = MIMEText(content,_charset='utf8')        # _charset 指定編碼格式
# 構造附件(二進制字節流形式)
part = MIMEApplication(open("report.html",'rb').read(),_subtype=None) 
# part = MIMEApplication(open("report.html",'rb').read()) 需要查看_subtype=None 是否會引發異常
part.add_header('content-disposition', 'attachment', filename='report18.html')  # 對方收到郵件之后,附件在郵件中顯示的名稱
# 封裝一封郵件
msg = MIMEMultipart()
# 加入文本內容
msg.attach(textcontent)
msg.attach(part)
# 發送郵件
msg['From'] = 'wl18814726725@163.com'       #發件人郵箱
msg['To'] = '1572533878@qq.com'             #收件人

#第五步:發送郵件
s.sendmail(from_addr='wl18814726725@163.com',to_addrs='1572533878@qq.com',msg=msg.as_string())      # 將郵件內容轉換為字符串

使用python發送郵件時常見錯誤:

錯誤1:smtplib.SMTPAuthenticationError: (550, b'User has no permission')   

我們使用python發送郵件時相當於自定義客戶端根據用戶名和密碼登錄,然后使用SMTP服務發送郵件,新注冊的163郵箱是默認不開啟客戶端授權的(對指定的郵箱大師客戶端默認開啟),因此登錄總是被拒絕,解決辦法(以163郵箱為例):進入163郵箱-設置-客戶端授權密碼-開啟(授權碼是用於登錄第三方郵件客戶端的專用密碼)。上述有專門的設置方法。

錯誤2:smtplib.SMTPAuthenticationError: (535, b'Error: authentication failed')   

以163郵箱為例,在開啟POP3/SMTP服務,並開啟客戶端授權密碼時會設置授權碼,將這個授權碼代替smtplib.SMTP().login(user,password)方法中的password即可。

錯誤3:給多人發送郵件是,可能會出現“AttributeError: 'list' object has no attribute 'encode'”或者寫了多個人,實際只給第一個人發了郵件等錯誤。

# 將所有的收件人郵箱寫入到一個字符串中
msg['To'] = '1668010021@qq.com, 1572533878@qq.com, wangle@kyee.com.cn, 2685083419@qq.com'
# 發送郵件時,通過字符串函數split分割,分割后返回的每一個郵箱賬號
s.sendmail(from_addr=msg['From'], to_addrs=msg['To'].split(','), msg=msg.as_string())

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM