一、郵件發送流程
郵件的發送是主動行爲:主要通過 MUA/郵件客戶端軟件,將郵件內容發送給對應的服務器 暫存到投遞服務區,然後由當前運營商根據郵件特徵信息將郵件轉發給目標服務器的投遞服 務區,此時目標用戶的郵件已經發送完成,等待對方收取即可。
郵件的收取也是主動行爲,用戶可以打開郵件客戶端軟件,通過點擊類似於收取這樣的行爲 就可以從自己郵箱所屬的服務器投遞區中提取郵件了。
二、郵件發送協議介紹
什麼是POPO3、SMTP和IMAP?服務器地址和端口是什麼?
2.1、POP3
POP3是Post Office Protocol 3的簡稱,即郵局協議的第3個版本,它規定怎樣將個人計算機連接到Internet的郵件服務器和下載電子郵件的電子協議。它是因特網電子郵件的第一個離 線協議標準,POP3允許用戶從服務器上把郵件存儲到本地主機(即自己的計算機)上,同時刪除保存在郵件服務器上的郵件,而POP3服務器則是遵循 POP3協議的接收郵件服務器,用來接收電子郵件的。(與IMAP有什麼區別?)
2.2、SMTP
SMTP 的全稱是“Simple Mail Transfer Protocol”,即簡單郵件傳輸協議。它是一組用於從源地址到目的地址傳輸郵件的規範,通過它來控制郵件的中轉方式。SMTP 協議屬於 TCP/IP 協議簇,它幫助每臺計算機在發送或中轉信件時找到下一個目的地。SMTP 服務器就是遵循 SMTP 協議的發送郵件服務器。 SMTP 認證,簡單地說就是要求必須在提供了賬戶名和密碼之後纔可以登錄 SMTP 服務器,這就使得那些垃圾郵件的散播者無可乘之機。 增加 SMTP 認證的目的是爲了使用戶避免受到垃圾郵件的侵擾。
2.3、IMAP
IMAP全稱是Internet Mail Access Protocol,即交互式郵件存取協議,它是跟POP3類似郵件訪問標準協議之一。不同的是,開啓了IMAP後,您在電子郵件客戶端收取的郵件仍然保留 在服務器上,同時在客戶端上的操作都會反饋到服務器上,如:刪除郵件,標記已讀等,服務器上的郵件也會做相應的動作。所以無論從瀏覽器登錄郵箱或者客戶端 軟件登錄郵箱,看到的郵件以及狀態都是一致的。(與POP3有什麼區別?)
2.4、網易126郵箱的相關服務器信息
郵件服務器 | 服務器地址 | 端口
POP3服務器 | pop.126.com | 110
SMTP服務器 | smtp.126.com | 25
IMAP服務器 | imap.126.com | 143
三、25端口開放的開發服務器報警程序代碼
即對於端口25開放的開發服務器來說,以下代碼就可以發送報表郵件或者報警郵件。
#!/usr/bin/python2.7
# -*- coding:utf-8 -*-
"""
File: Email.py
Author: yyz
Date: 2019/04/03 15:26
"""
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
class Email:
@staticmethod
def sendmail_with_attachment(subject, mail_msg, mailto_list, mailcc_list, in_attachment_name):
msg = MIMEMultipart()
msg1 = MIMEText(mail_msg, 'html', 'utf-8')
msg.attach(msg1)
if in_attachment_name != "":
# 構造附件2,傳送當前目錄下的 runoob.txt 文件
att2 = MIMEText(open(in_attachment_name, 'rb').read(), 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename=' + str(in_attachment_name.split("/")[-1]).encode('utf-8')
msg.attach(att2)
reciver = mailto_list + mailcc_list
mailfrom = "[email protected]"
msg["Subject"] = subject
msg["From"] = mailfrom
msg["To"] = ','.join(mailto_list)
msg["Cc"] = ','.join(mailcc_list)
s = smtplib.SMTP('localhost',port=25)
s.sendmail(mailfrom, reciver, msg.as_string())
print "success"
s.quit()
@staticmethod
def sendmail(subject, mail_msg, mailto_list, mailcc_list):
Email.sendmail_with_attachment(subject, mail_msg, mailto_list, mailcc_list,in_attachment_name="")
if __name__ == "__main__":
msg_content = """
<table border="1">
<tr>
<th>小時</th>
<th>商品名字</th>
<th>商品鏈接</th>
<th>商品價格</th>
<th>競品品牌</th>
<th>競品價格</th>
<th>價格差距</th>
</tr>
<tr>
<td>January</td>
<td>$100</td>
<td>20190301</td>
<td>January</td>
<td>$100</td>
<td>20190301</td>
<td>20190301</td>
</tr>
</table>
"""
msg_content="test msg content"
# 髮帶附件的郵件
# Email.sendmail("test subject", mail_msg=msg_content,mailto_list= ["[email protected]"],mailcc_list= ["[email protected]"],in_attachment_name="jd.py")
# 發不帶附件的郵件
Email.sendmail("test subject", mail_msg=msg_content,mailto_list= ["[email protected]"],mailcc_list= ["[email protected]"])
四、25端口被禁的開發服務器報警程序代碼
但由於smtp的25端口容易收到攻擊,所以對於某些雲服務器,比如說阿里雲上的開發機,25端口是被禁止的;此時應該採用其他可用的端口和協議來發送報表和報警郵件啦,如下代碼:
SMTP發件服務器地址:smtp.163.com 安全:開(SSL/TLS) 端口號:465 / 994
注: 1、126郵箱的SMTP服務器地址:smtp.126.com ,yeah郵箱的SMTP服務器地址:smtp.yeah.net;
2、若安全選擇關閉,請將端口號改爲 25。
IMAP收件服務器地址:imap.163.com 安全:開(SSL/TLS) 端口號:993
注:1、126郵箱的IMAP服務器地址:imap.126.com ,yeah郵箱IMAP服務器地址:imap.yeah.net,其餘部分與163一致;
2、若安全選擇關閉,請將端口號改爲 143。參考:http://wap.mail.163.com/xm/static/html/163_symbian_2.html
#!/usr/bin/python2.7
# -*- coding:utf-8 -*-
"""
File: Email.py
Author: yyz
Date: 2020/06/02 15:26
"""
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
class Email:
@staticmethod
def sendmail_with_attachment(subject, mail_msg, mailto_list, mailcc_list, in_attachment_name):
msg = MIMEMultipart()
msg1 = MIMEText(mail_msg, 'html', 'utf-8')
msg.attach(msg1)
if in_attachment_name != "":
# 構造附件2,傳送當前目錄下的 runoob.txt 文件
att2 = MIMEText(open(in_attachment_name, 'rb').read(), 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename=' + str(in_attachment_name.split("/")[-1]).encode('utf-8')
msg.attach(att2)
reciver = mailto_list + mailcc_list
mailfrom = "[email protected]"
msg["Subject"] = subject
msg["From"] = mailfrom
msg["To"] = ','.join(mailto_list)
msg["Cc"] = ','.join(mailcc_list)
#s = smtplib.SMTP('47.94.16.179',80)
SMTP_SERVER='smtp.126.com'
EMAIL_USER='[email protected]'
EMAIL_PASS='xxxx' # 填寫郵箱授權碼
# 連接郵件服務器
#s = smtplib.SMTP_SSL(SMTP_SERVER,465) # SMTP發件服務器地址:smtp.163.com 安全:開(SSL/TLS) 端口號:465 / 994 都可以
s = smtplib.SMTP_SSL(SMTP_SERVER,994)
# 設置信息展示級別
s.set_debuglevel(1)
# 登錄郵箱服務器
s.login(EMAIL_USER, EMAIL_PASS)
s.sendmail(mailfrom, reciver, msg.as_string())
print "success"
s.quit()
@staticmethod
def sendmail(subject, mail_msg, mailto_list, mailcc_list):
Email.sendmail_with_attachment(subject, mail_msg, mailto_list, mailcc_list,in_attachment_name="")
if __name__ == "__main__":
msg_content = """
<table border="1">
<tr>
<th>小時</th>
<th>商品名字</th>
<th>商品鏈接</th>
<th>商品價格</th>
<th>競品品牌</th>
<th>競品價格</th>
<th>價格差距</th>
</tr>
<tr>
<td>January</td>
<td>$100</td>
<td>20190301</td>
<td>January</td>
<td>$100</td>
<td>20190301</td>
<td>20190301</td>
</tr>
</table>
"""
msg_content="test msg content"
# 髮帶附件的郵件
# Email.sendmail("test subject", mail_msg=msg_content,mailto_list= ["[email protected]"],mailcc_list= ["[email protected]"],in_attachment_name="jd.py")
# 發不帶附件的郵件
Email.sendmail("test subject", mail_msg=msg_content,mailto_list= ["[email protected]"],mailcc_list= ["[email protected]"])
執行以上代碼,能遇到下面問題:
4.1、問題一:報smtplib.SMTPAuthenticationError 505/535 的解決方法
4.2、問題二:獲取網易郵箱pop3/smtp服務授權密碼示意圖
網易126郵箱,成功開啓POP3/SMTP服務,在第三方客戶端登錄時,登錄密碼輸入以下授權密碼。其授權碼開啓如下圖所示:
4.3、QQ郵箱如何設置POP3/SMTP的SSL加密方式?
使用SSL的通用配置如下:
接收郵件服務器:pop.qq.com,使用SSL,端口號995
發送郵件服務器:smtp.qq.com,使用SSL,端口號465或587
賬戶名:您的QQ郵箱賬戶名(如果您是VIP帳號或Foxmail帳號,賬戶名需要填寫完整的郵件地址)
密碼:您的QQ郵箱密碼
電子郵件地址:您的QQ郵箱的完整郵件地址
參考:https://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=369
4.4、騰訊企業郵箱如何設置IMAP、POP3/SMTP及其SSL加密方式?
如果您的電子郵件客戶端支持SSL,可以在設置中選擇使用SSL。通用配置參數:(我們已經默認都支持這些協議,用戶無需自己手動開啓這些服務器與端口)POP3/SMTP協議接收郵件服務器:pop.exmail.qq.com ,使用SSL,端口號995發送郵件服務器:smtp.exmail.qq.com ,使用SSL,端口號465海外用戶可使用以下服務器接收郵件服務器:hwpop.exmail.qq.com ,使用SSL,端口號995發送郵件服務器:hwsmtp.exmail.qq.com ,使用SSL,端口號465IMAP協議接收郵件服務器:imap.exmail.qq.com ,使用SSL,端口號993發送郵件服務器:smtp.exmail.qq.com ,使用SSL,端口號465海外用戶可使用以下服務器接收郵件服務器:hwimap.exmail.qq.com ,使用SSL,端口號993發送郵件服務器:hwsmtp.exmail.qq.com ,使用SSL,端口號465