iT邦幫忙

1

定時自動寄 E-Mail

請教各位大大

請問有什麼方法可以自動寄送郵件,
重點是要將固定的資料夾內所有檔案設為附件一併寄出。

以上請不吝賜教,謝謝 !

可以先把寄信的程式寫好
https://www.youtube.com/watch?v=YQboCnlOb6Y
搭配linux crontab指令來定期執行
8
japhenchen
iT邦大師 1 級 ‧ 2021-07-06 10:03:55
最佳解答

用 python,在windows下可設工作排程,python當主程式,py檔當參數
在linux下可設crontab,不用sudo

import os
import smtplib
import sys
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication


def sendMail(mailfrom="", mailto="", mailcc="", attachmentDIR="", ext=""):
    msg = MIMEMultipart()
    msg["From"] = mailfrom
    msg["To"] = mailto
    if(mailcc != ""):
        msg["cc"] = f'{mailcc}'
    msg["Subject"] = "測試信"
    msg["Body"] = ""
    html = """
    <html>
    <head></head>
    <body>
        <h3>測試信件,加附件</h3>
    </body>
    </html>
    """
    part2 = MIMEText(html, 'html')
    msg.attach(part2)
    if os.path.exists(attachmentDIR):
        for d, r, fs in os.walk(attachmentDIR):  
            # 把指定目錄下的檔案列舉
            for afile in fs:
                filename = os.path.join(d, afile)
                fileext = filename.split(".")[-1].lower()
                # 如果副檔名是我們要的,寄出 
                #你也可以不做此步,全寄
                if ext == "" or fileext == ext.lower():
                    with open(filename, "rb") as fil:
                        part = MIMEApplication(
                            fil.read(),
                            Name=os.path.basename(filename)
                        )
                    part[
                        'Content-Disposition'] = f'attachment; filename="{os.path.basename(filename)}"'
                    msg.attach(part) 
                    # 把檔案加入附件清單(請留意外寄限制)
    try:
        smtpObj = smtplib.SMTP('mail.yourcompany.com', 25)  # 非SSL smtp
        smtpObj.login("yourname", "yourpassword")  
        # 只能這樣寫死的,帳號密碼
        smtpObj.send_message(msg)
        smtpObj.quit()
    except smtplib.SMTPException:
        print(f"發生錯誤")
    return


# 主程式進入點
if __name__ == '__main__':
    sendMail(mailfrom="yourname@yourcompany.com",
             mailto="hername@hercompany.com",
             attachmentDIR="d:\\csvdata", ext="csv")

已測試可正常執行 免安裝outlook/live/thunderbird/foxmail客戶端,免瀏覽器
https://ithelp.ithome.com.tw/upload/images/20210706/20117954u7amssoVNH.jpg

C# 也可以,但不知你要的是啥語言
至於用BAT批次檔寫,恕在下不懂(真的不想懂)

python可以在任何一種終端上執行,不只是Windows,凡舉Linux(Raspbian OS)/MAC/Android/Arduino....千元大鈔就能執行,不用到為了放VB或C寫的程式而花好幾千甚至上萬元...

0
blanksoul12
iT邦新手 4 級 ‧ 2021-07-06 14:19:46

如是單一部 windows 機又有 outlook 而且是長開 outlook 的話便可用VB搭 windows 內的排程.但你沒提及你是要在那執行???
把下面程式部份用 notepad save 再改 file format 變成 vbs, 雙按已可執行.但如要定時發放,請自行在 windows 排程中加入定時運作功能

Dim fso
Set olApp = CreateObject("outlook.application")
Set olApt = olApp.CreateItem(olAppointmentItem)
Set myItem = olApp.CreateItem(0)

With myItem    
        .To = E-mail address
        .Subject = "Testing"
        Set fso= CreateObject("Scripting.FileSystemObject")
        Set Folder = fso.getfolder("Z:\abc\1234\") '資料夾路徑
        For Each file In Folder.Files
                .Attachments.Add "Z:\abc\1234\" & file.name
        next
        .Body = "As per subject."
        .Display '測試時可以看
        .Send '測試完便不用 display, 直接send
End With

joy036 iT邦研究生 3 級 ‧ 2021-07-07 10:31:28 檢舉

這個單機用法很簡便且直觀,感謝大大提供幫助,謝謝 !

0
froce
iT邦大師 1 級 ‧ 2021-07-06 14:40:25

我要發表回答

立即登入回答