精华内容
下载资源
问答
  • 邮件箱源码

    2012-08-06 18:38:03
    邮件箱,简单的邮件箱,界面设计都合理,只需倒进即可执行。
  • python自动下载邮件附件

    千次阅读 2021-03-23 16:04:55
    其中有一项工作的数据源来源于邮件,还需要我自己手动下载,放入指定位置才可以处理!虽然比之前方便了很多,但是还是想更方便些。(自己淘汰自己的路上越走越远o(╥﹏╥)o),于是想着能不能用代码下载,研究了半天...

    作者介绍:目前就职于电商数据分析师,日常工作以爬虫和DBA数据库管理为主,业务场景模型搭建为辅!自16年至今一直从事数据相关工作,从最初的表哥到现在的大数据、数据挖掘、机器学习,一直不断成长!日常活跃于CSDN

    Slogan: 科技成就商业未来,数据看透问题本质
    CSDN:https://blog.csdn.net/qq_35866846
    微信公众号:诡途

    在这里插入图片描述

    一、项目背景

    继上一次的 群聊机器人开发 之后的工作流程再优化,上次研究完群聊机器人之后,开发了三个机器人替我处理表格并自动发出去。其中有一项工作的数据源来源于邮件,还需要我自己手动下载,放入指定位置才可以处理!虽然比之前方便了很多,但是还是想更方便些。(自己淘汰自己的路上越走越远o(╥﹏╥)o),于是想着能不能用代码下载,研究了半天还终于整出来了,而且还是两种方法!

    二、有授权码的场景

    准备工作,QQ邮箱开通授权码流程在这里插入图片描述

    # 导入库——qq邮箱测试,其他邮箱略有差异
    import poplib,email,datetime,time,traceback,sys,telnetlib,zipfile,os,shutil
    from email.parser import Parser
    from email.header import decode_header
    from email.utils import parseaddr
    ​
    # 输入邮件地址, 口令和POP3服务器地址:
    email_user='xxxxxx@qq.com'
    # 此处密码是授权码,用于登录第三方邮件客户端
    password='你自己的授权码'
    pop3_server='pop.qq.com'# 授权码登录邮箱
    def email_login(email_user,password,pop3_server):
        # 连接到POP3服务器,有些邮箱服务器需要ssl加密,可以使用poplib.POP3_SSL
        telnetlib.Telnet('pop.qq.com',995)
        server=poplib.POP3_SSL(pop3_server,995,timeout=10)
    #     server=poplib.POP3(pop3_server,110,timeout=10)
        # 可以打开或关闭调试信息
    #     server.set_debuglevel(1)# 身份认证:
        server.user(email_user)
        server.pass_(password)
        
        # 返回邮件数量和占用空间:
        print('Messages: %s. Size: %s'%server.stat())
        
        # list()返回所有邮件的编号:
        resp,mails,octets = server.list()
        
        return mails,server
        
     def decode_str(str_in):
        """字符编码转换"""
        value, charset = decode_header(str_in)[0]
        if charset:
            value = value.decode(charset)
        return value
       
     def save_att_file(save_path):
        """附件下载函数"""
        for part in msg.walk():
            file_name = part.get_filename()
        #     contentType = part.get_content_type()
            attachment_files =[]
            if file_name:
                file_name = decode_str(file_name)
                data =  part.get_payload(decode=True)
                att_file = open(os.path.join(save_path,file_name), 'wb')
                attachment_files.append(file_name)
                att_file.write(data)
                att_file.close()
                print(f"附件 {file_name} 下载完成")def main(yesterday):
        # 遍历所有邮件
        for i in range(1,len(mails)+1):
            resp,lines,octets = server.retr(i)
            msg_content=b'\r\n'.join(lines).decode()# 解析邮件:
            msg = Parser().parsestr(msg_content)
            From = parseaddr(msg.get('from'))[1]#发件人
            To = parseaddr(msg.get('To'))[1]#收件人
            Cc = parseaddr(msg.get_all('Cc'))[1]#抄送人
            Subject = decode_str(parseaddr(msg.get('Subject'))[1])#主题# 获取邮件时间,格式化收件时间
            date1 = time.strptime(msg.get("Date")[0:24],'%a, %d %b %Y %H:%M:%S')
            # 邮件时间格式转换
            date2 = time.strftime("%Y-%m-%d",date1)print(f'发件人:{From};收件人:{To};抄送人:{Cc};主题:{Subject};收件日期:{date2}')# 主题和日期验证所需邮件
            if ("TM在售" in Subject)&(date2 == yesterday):
                save_att_file(save_path)
          
    # 今天日期
    today = datetime.date.today()
    # 昨天日期
    yesterday = (today - datetime.timedelta(days=1)).strftime('%Y-%m-%d')
    save_path = os.getcwd()# 登录获取邮件列表
    mails,server = email_login(email_user,password,pop3_server)
    
    # 下载主程序
    main(yesterday)
    

    三、无授权码的场景

    鉴于企业邮箱没有给开授权码权限,以及业务流程限制不允许使用私人邮箱,又研究了下直接使用win32com直接驱动outlook客户端

    注:使用前提,本机配置好了outlook,即至少登录过一次,因为我只配置了一个邮箱账户,没有测试多账户情况

    # 导入库
    import win32com.client
    import os
    ​
    def download_email_att(yesterday):
        # 创建outlook客户端链接
        outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")# "6" 是指文件夹的索引,在本例中,表示收件箱。可以把那个号码改成参考号
        inbox = outlook.GetDefaultFolder(6)# 获取收件箱列表
        messages = inbox.Items
        # # 获取当前最新邮件
        # message = messages.GetFirst()
        # # 获取邮件主题
        # subject = message.Subject
        # # 获取邮件正文
        # body = message.Body# 倒序读取最新30封邮件 ——因为邮件过多,完全遍历耗时过久
        for i in range(len(messages),len(messages)-30,-1):
            message = messages(i)
            subject = message.Subject
            date = message.senton.date()
        #     print(subject,date)
            if ("TM在售" in subject)&(str(date) == yesterday):
        #         print(subject,date)
                # 获取附件信息
                attachments = message.Attachments
                num_attach = len([x for x in attachments])
                for x in range(1, num_attach + 1):
                    attachment = attachments.Item(x)
                    # 保存附件到save_path下
                    attachment.SaveASFile(os.path.join(save_path, attachment.FileName))
                    print(f"附件 {attachment}下载完成")
                break  # 找到指定邮件打断循环# 今天日期
    today = datetime.date.today()
    # 昨天日期
    yesterday = (today - datetime.timedelta(days=1)).strftime('%Y-%m-%d')            
    # 附件保存路径
    save_path = os.getcwd()
    download_email_att(yesterday)
    

    科技成就商业未来,数据看透问题本质!
    我是诡途,感谢阅读,欢迎转发分享点赞!
    文章仅供学习交流,转载请注明来源!

    展开全文
  • 有时候我们的Outlook邮箱会如下提示,当我们邮件箱里邮件收满之后就会接受不到新的邮件了,这时我们应该怎么做呢?首先说明一下电子邮件的工作原理:邮箱存在于邮件服务器上,而服务器由 Internet 服务提供商 (ISP) ...

    有时候我们的Outlook邮箱会如下提示,当我们邮件箱里邮件收满之后就会接受不到新的邮件了,这时我们应该怎么做呢?

    首先说明一下电子邮件的工作原理:邮箱存在于邮件服务器上,而服务器由 Internet 服务提供商 (ISP) 维护。发送到你的电子邮件地址的邮件先会发送到邮件服务器上的邮箱。然后,你计算机上的电子邮件软件从邮箱中提取邮件。如果将此过程比作邮寄邮件,邮件服务器则相当于邮局。邮局设有信箱,也就是邮箱。你的电子邮件软件从邮箱中接收邮件,即等同于你从信箱中拿取信件。  但是与传统的邮政服务不同的是,即使邮件已由电子邮件软件提取,电子邮件仍会在邮箱中存储一定的时间。这样,你便可以从几台计算机访问同一封邮件。因为,如今同时拥有几台计算机的人并不少见。

    存储的电子邮件数量有一个限额,最大邮箱大小是由你的 ISP 设置的。当邮件超出此限额时,便不能再接收新的邮件。即便将电子邮件下载到自己的计算机后,电子邮件副本也会保留一段时间。所以我们可以缩短邮件副本在邮箱中保留的时间长度。

    811e52ee10256e66011108a03f0c44ef.png

    1、首先启动 Outlook 2010。单击文件选项卡,然后单击信息、帐户设置、帐户设置。

    b48c690ef2c22704f5b90c02106eac7f.png

    2、显示帐户设置窗口后,在电子邮件选项卡上的名称下选择您的电子邮件帐户,然后单击更改。

    43d21a6bcda03c5f4e62eec577f44cf7.png

    3、在下一个窗口中单击更多设置。

    d370bcba495a3912c06c251be09ceff8.png

    4、在高级选项卡上的传递下,应该已选中了在服务器上保留邮件副本复选框。此选项意味着邮件软件提取邮件后,邮件副本将保留在邮箱中。您是否还看到 x 天后删除服务器上的邮件副本选项?在这里您可以选择是否在指定的天数后自动从邮件服务器上删除邮件。

    f61b3cde26ede98f664eaef0abdcc118.png

    相关推荐:

    展开全文
  • imap4命令的详细说明可参考:...imap4有个list命令可以查看邮箱中的所有文件夹,如收件,发件,草稿等,python代码如下: imapclient = imaplib.IMAP4_SSL(imap_server,"993") imapclient.login(email_u...

    imap4命令的详细说明可参考:http://james.apache.org/server/rfclist/imap4/rfc2060.txt
    imap4有个list命令可以查看邮箱中的所有文件夹,如收件箱,发件箱,草稿箱等,python代码如下:

    imapclient = imaplib.IMAP4_SSL(imap_server,"993")
    imapclient.login(email_user,password)
    print(imapclient.list())
    

    对于163邮箱,输出如下: “INBOX"表示收件箱,”&g0l6P3ux-“表示收件箱,”&XfJT0ZAB-"表示发件箱

    ('OK', [b'() "/" "INBOX"', b'(\\Drafts) "/" "&g0l6P3ux-"', b'(\\Sent) "/" "&XfJT0ZAB-"', b'(\\Trash) "/" "&XfJSIJZk-"', b'(\\Junk) "/" "&V4NXPpCuTvY-"', b'() "/" "&dcVr0mWHTvZZOQ-"'])
    

    对于yahoo邮箱,输出如下:

    ('OK', [b'(\\Archive \\HasNoChildren) "/" "Archive"', b'(\\Junk \\HasNoChildren) "/" "Bulk Mail"', b'(\\Drafts \\HasNoChildren) "/" "Draft"', b'(\\HasNoChildren) "/" "Inbox"', b'(\\Sent \\HasNoChildren) "/" "Sent"', b'(\\Trash \\HasNoChildren) "/" "Trash"'])
    

    然后选择发件箱

    response,data=imapclient.select('Sent',False)#针对yahoo邮箱
    response,data=imapclient.select('&XfJT0ZAB-',False)#针对163邮箱
    typ, data = imapclient.search(None, 'ALL')
    mail_number = data[0].split()
    for num in mail_number:
    	typ, data = imapclient.fetch(num, '(UID BODY.PEEK[])')
    	if 'OK'!=typ:
    		print('fetch mail failed!',num)
    		continue
    	#开始处理邮件,可以写到文件中
    	filename = './file/imap/'+mail_box+'/'+email_user+'_imap_'+num.decode()+".eml"
    	emlfile = open(filename,'wb')
    	emlfile.write(data[0][1])
    	emlfile.close()
    

    同理,可以用上述方法下载草稿箱、垃圾箱的邮件

    展开全文
  • 通过JavaMail下载邮件附件

    千次阅读 2019-01-11 17:11:04
    通过JavaMail下载邮件附件需求JavaMail工具类附件类使用遇到的一些意外 需求 因为某些特定的业务需要,要从邮件中获取附件。花了一些时间,最终业务需求实现了,但是也遇到一些坑,所以记录一下。 JavaMail 使用...

    需求

    因为某些特定的业务需要,要从邮件中获取附件。花了一些时间,最终业务需求实现了,但是也遇到一些坑,所以记录一下。

    JavaMail

    使用JavaMail来实现邮件的一系列操作(发送、接收),我使用的版本是1.6.2(maven仓库里有),不多说,上代码

    工具类

    package com.xxx.xxx;
    
    import com.sun.mail.imap.IMAPFolder;
    import com.sun.mail.imap.IMAPStore;
    import com.sun.mail.pop3.POP3Folder;
    import com.sun.mail.pop3.POP3Store;
    import org.castor.util.Base64Decoder;
    
    import javax.activation.DataHandler;
    import javax.activation.FileDataSource;
    import javax.mail.*;
    import javax.mail.internet.*;
    import javax.mail.search.*;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.UnsupportedEncodingException;
    import java.security.Security;
    import java.util.Date;
    import java.util.List;
    import java.util.Properties;
    
    /**
     * @author jiangyw
     * @date 2019/1/7 19:29
     * <p>
     * 处理邮件工具类
     * 接收/发送服务器根据不同邮箱有不同的地址
     * 在邮箱设置里都可找到
     */
    public class MailUtil {
        // 发送服务器
        private static final String SEND_SMTP_HOST = "smtp.exmail.qq.com";
        private static final int SEND_SMTP_PORT = 465;
    
        // 接收服务器
        private static final String RECEIVE_IMAP_HOST = "imap.exmail.qq.com";
        private static final int RECEIVE_IMAP_PORT = 993;
    
        private static final String RECEIVE_POP_HOST = "pop.exmail.qq.com";
        private static final int RECEIVE_POP_PORT = 110;
    
        // 账号
        private String user;
        // 密码
        private String password;
    
        private IMAPFolder imapFolder = null;
        private IMAPStore imapStore = null;
    
        private POP3Store pop3Store = null;
        private POP3Folder pop3Folder = null;
    
        public MailUtil() {
            this("your email address", "your email password");
        }
    
        private MailUtil(String user, String password) {
            this.user = user;
            this.password = password;
        }
    
    
        /**
         * 发送邮件
         *
         * @param toEmail 收件人邮箱地址
         * @param subject 邮件标题
         * @param content 邮件内容 可以是html内容
         */
        public void send(String toEmail, String subject, String content) {
            Session session = loadSendSession();
            // session.setDebug(true);
            // 创建邮件消息
            MimeMessage message = new MimeMessage(session);
            try {
                // 设置发件人
                message.setFrom(new InternetAddress(user));
                Address[] a = new Address[1];
                a[0] = new InternetAddress(user);
                message.setReplyTo(a);
                // 设置收件人
                InternetAddress to = new InternetAddress(toEmail);
                message.setRecipient(MimeMessage.RecipientType.TO, to);
                // 设置邮件标题
                message.setSubject(subject);
                // 设置邮件的内容体
                message.setContent(content, "text/html;charset=UTF-8");
                // 发送邮件
                Transport.send(message);
            } catch (MessagingException e) {
                e.printStackTrace();
                String err = e.getMessage();
                // 在这里处理message内容, 格式是固定的
                System.out.println(err);
            }
        }
    
    
        /**
         * 发送邮件 带附件
         *
         * @param toEmail    收件人邮箱地址
         * @param subject    邮件标题
         * @param content    邮件内容 可以是html内容
         * @param attachPath 附件路径
         */
        public void send(String toEmail, String subject, String content, String attachPath) {
            Session session = loadSendSession();
    
            MimeMessage mm = new MimeMessage(session);
            try {
                //发件人
                mm.setFrom(new InternetAddress(user));
                //收件人
                mm.setRecipient(Message.RecipientType.TO, new InternetAddress(toEmail)); // 设置收件人
                // mm.setRecipient(Message.RecipientType.CC, new
                // InternetAddress("XXXX@qq.com")); //设置抄送人
                //标题
                mm.setSubject(subject);
                //内容
                Multipart multipart = new MimeMultipart();
                //body部分
                BodyPart contentPart = new MimeBodyPart();
                contentPart.setContent(content, "text/html;charset=utf-8");
                multipart.addBodyPart(contentPart);
    
                //附件部分
                BodyPart attachPart = new MimeBodyPart();
                FileDataSource fileDataSource = new FileDataSource(attachPath);
                attachPart.setDataHandler(new DataHandler(fileDataSource));
                attachPart.setFileName(MimeUtility.encodeText(fileDataSource.getName()));
                multipart.addBodyPart(attachPart);
    
                mm.setContent(multipart);
                Transport.send(mm);
            } catch (Exception e) {
                e.printStackTrace();
                String err = e.getMessage();
                // 在这里处理message内容, 格式是固定的
                System.out.println(err);
            }
    
        }
    
    
        private Session loadSendSession() {
            try {
                // 配置发送邮件的环境属性
                final Properties props = new Properties();
                // 表示SMTP发送邮件,需要进行身份验证
                props.put("mail.smtp.auth", "true");
                props.put("mail.smtp.host", SEND_SMTP_HOST);
                // props.put("mail.smtp.port", SEND_SMTP_PORT);
                // 如果使用ssl,则去掉使用25端口的配置,进行如下配置,
                props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
                props.put("mail.smtp.socketFactory.port", SEND_SMTP_PORT);
                props.put("mail.smtp.port", SEND_SMTP_PORT);
                // 发件人的账号
                props.put("mail.user", user);
                // 访问SMTP服务时需要提供的密码
                props.put("mail.password", password);
                // 构建授权信息,用于进行SMTP进行身份验证
                Authenticator authenticator = new Authenticator() {
                    @Override
                    protected PasswordAuthentication getPasswordAuthentication() {
                        // 用户名、密码
                        String userName = props.getProperty("mail.user");
                        String password = props.getProperty("mail.password");
                        return new PasswordAuthentication(userName, password);
                    }
                };
                // 使用环境属性和授权信息,创建邮件会话
                return Session.getInstance(props, authenticator);
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("mail session is null");
            }
            return null;
        }
    
        public void saveFile(List<MailAttachment> list) throws IOException {
            for (MailAttachment mailAttachment : list) {
                InputStream inputStream = mailAttachment.getInputStream();
            	FileOutputStream outputStream = new FileOutputStream(new File("C:\\Users\\jiangyw\\Desktop\\test.pdf"));
            	int len;
         	 	byte[] bytes = new byte[1024];
           		while ((len = inputStream.read(bytes)) != -1) {
    	            outputStream.write(bytes, 0, len);
    	            outputStream.flush();
           		}
                inputStream.close();
            	outputStream.close();
            }
    
        }
    
        /**
         * 获取附件
         * 只获取附件里的
         * 邮件内容里的附件(图片等)忽略
         * @param part 邮件中多个组合体中的其中一个组合体
         * @param list 附件容器
         * @throws UnsupportedEncodingException
         * @throws MessagingException
         * @throws FileNotFoundException
         * @throws IOException
         */
        public void getAttachment(Part part, List<MailAttachment> list) throws UnsupportedEncodingException, MessagingException,
                FileNotFoundException, IOException {
            if (part.isMimeType("multipart/*")) {
                Multipart multipart = (Multipart) part.getContent();    //复杂体邮件
                //复杂体邮件包含多个邮件体
                int partCount = multipart.getCount();
                for (int i = 0; i < partCount; i++) {
                    //获得复杂体邮件中其中一个邮件体
                    BodyPart bodyPart = multipart.getBodyPart(i);
                    //某一个邮件体也有可能是由多个邮件体组成的复杂体
                    String disposition = bodyPart.getDisposition();
                    if (disposition != null && (disposition.equalsIgnoreCase(Part.ATTACHMENT) || disposition.equalsIgnoreCase(Part.INLINE))) {
    
                        InputStream is = bodyPart.getInputStream();
                        // 附件名通过MimeUtility解码,否则是乱码
                        String name = MimeUtility.decodeText(bodyPart.getFileName());
                        list.add(new MailAttachment(name, is));
    
    
                    } else if (bodyPart.isMimeType("multipart/*")) {
                        getAttachment(bodyPart, list);
                    } else {
                        String contentType = bodyPart.getContentType();
                        if (contentType.contains("name") || contentType.contains("application")) {
    
                        }
                    }
                }
            } else if (part.isMimeType("message/rfc822")) {
                getAttachment((Part) part.getContent(), list);
            }
        }
    
        /**
         * 判断邮件中是否包含附件
         *
         * @return 邮件中是否存在附件
         * @throws MessagingException
         * @throws IOException
         */
        public boolean hasAttachment(Part part) throws MessagingException, IOException {
            boolean flag = false;
            if (part.isMimeType("multipart/*")) {
                MimeMultipart multipart = (MimeMultipart) part.getContent();
                int partCount = multipart.getCount();
                for (int i = 0; i < partCount; i++) {
                    BodyPart bodyPart = multipart.getBodyPart(i);
                    String disp = bodyPart.getDisposition();
                    if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE))) {
                        flag = true;
                    } else if (bodyPart.isMimeType("multipart/*")) {
                        flag = hasAttachment(bodyPart);
                    } else {
                        String contentType = bodyPart.getContentType();
                        if (contentType.contains("application")) {
                            flag = true;
                        }
    
                        if (contentType.contains("name")) {
                            flag = true;
                        }
                    }
                    if (flag) break;
                }
            } else if (part.isMimeType("message/rfc822")) {
                flag = hasAttachment((Part) part.getContent());
            }
            return flag;
        }
    
        /**
         * 获得邮件文本内容
         *
         * @param part        邮件体
         * @param textContent 存储邮件文本内容的字符串
         * @param htmlContent 存储邮件html内容的字符串
         * @throws MessagingException
         * @throws IOException
         */
        public void getMailTextContent(Part part, StringBuffer textContent, StringBuffer htmlContent) throws MessagingException, IOException {
            //如果是文本类型的附件,通过getContent方法可以取到文本内容,但这不是我们需要的结果,所以在这里要做判断
            boolean isContainTextAttach = part.getContentType().indexOf("name") > 0;
            if (part.isMimeType("text/*") && !isContainTextAttach) {
                String contentType = part.getContentType();
                if (contentType.startsWith("TEXT/PLAIN") || contentType.startsWith("text/plain")) {
                    textContent.append(part.getContent().toString());
                }
                if (contentType.startsWith("TEXT/HTML") || contentType.startsWith("text/html")) {
                    htmlContent.append(part.getContent().toString());
                }
            } else if (part.isMimeType("message/rfc822")) {
                getMailTextContent((Part) part.getContent(), textContent, htmlContent);
            } else if (part.isMimeType("multipart/*")) {
                Multipart multipart = (Multipart) part.getContent();
                int partCount = multipart.getCount();
                for (int i = 0; i < partCount; i++) {
                    BodyPart bodyPart = multipart.getBodyPart(i);
                    getMailTextContent(bodyPart, textContent, htmlContent);
                }
            }
        }
    
        public String getSubject(Message message) throws MessagingException {
            return message.getSubject();
        }
    
        /**
         * 获取邮件信息
         * IMAP协议
         * 下载附件的时候巨慢
         * 如果需要获取附件的时候不推荐使用
         * 该协议下只能查询receivedDate
         * sentDate都为null
         *
         * @throws MessagingException
         */
        public Message[] getImapMessages() throws MessagingException {
            String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
            Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
            System.setProperty("mail.mime.splitlongparameters", "false");
            Properties props = System.getProperties();
            props.setProperty("mail.imap.socketFactory.class", SSL_FACTORY);
            props.setProperty("mail.imap.socketFactory.port", "993");
            props.setProperty("mail.imapStore.protocol", "imap");
            props.setProperty("mail.imap.host", RECEIVE_IMAP_HOST);
            props.setProperty("mail.imap.port", "993");
            props.setProperty("mail.imap.auth.login.disable", "true");
            Session session = Session.getDefaultInstance(props, null);
            session.setDebug(false);
    
            imapStore = (IMAPStore) session.getStore("imap");  // 使用imap会话机制,连接服务器
            imapStore.connect(RECEIVE_IMAP_HOST, RECEIVE_IMAP_PORT, user, password);
            imapFolder = (IMAPFolder) imapStore.getFolder("INBOX"); //收件箱
    
            imapFolder.open(Folder.READ_WRITE);
    
            // 获取前一天的邮件信息
            SearchTerm endTerm = new ReceivedDateTerm(ComparisonTerm.LE, new Date(System.currentTimeMillis() + 24 * 60 * 60 * 1000L));
            SearchTerm startTerm = new ReceivedDateTerm(ComparisonTerm.GE, new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000L));
            SearchTerm searchTerm = new AndTerm(startTerm, endTerm);
    
            return imapFolder.search(searchTerm);
        }
    
        /**
         * 通过pop3协议获取邮件信息
         * pop3协议下只能通过sentDate来查询
         * receivedDate都为null
         *
         * @return Message[]
         * @throws MessagingException
         */
        public Message[] getPopMessages() throws MessagingException {
            Properties props = new Properties();
            props.setProperty("mail.imapStore.protocol", "pop3");       // 使用pop3协议
            props.setProperty("mail.pop3.port", "110");           // 端口
            props.setProperty("mail.pop3.host", RECEIVE_POP_HOST);       // pop3服务器
            Session session = Session.getInstance(props);
            pop3Store = (POP3Store) session.getStore("pop3");
            pop3Store.connect(RECEIVE_POP_HOST, RECEIVE_POP_PORT, user, password);
    
            // 获得收件箱
            pop3Folder = (POP3Folder) pop3Store.getFolder("INBOX");
            /* Folder.READ_ONLY:只读权限
             * Folder.READ_WRITE:可读可写(可以修改邮件的状态)
             */
            pop3Folder.open(Folder.READ_ONLY); //打开收件箱
    
            // 获取前一天的邮件信息
            SearchTerm endTerm = new SentDateTerm(ComparisonTerm.LE, new Date(System.currentTimeMillis() + 24 * 60 * 60 * 1000L));
            SearchTerm startTerm = new SentDateTerm(ComparisonTerm.GE, new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000L));
            SearchTerm searchTerm = new AndTerm(startTerm, endTerm);
    //         得到收件箱中的所有邮件,并解析
            return pop3Folder.search(searchTerm);
        }
    
        /**
         * 关闭folder和store资源
         *
         * @throws MessagingException
         */
        public void close() throws MessagingException {
            if (imapFolder != null) {
                imapFolder.close(false);
            }
            if (imapStore != null) {
                imapStore.close();
            }
            if (pop3Folder != null) {
                pop3Folder.close(false);
            }
            if (pop3Store != null) {
                pop3Store.close();
            }
        }
    
    
    }
    
    

    附件类

    很简单的容器类:

    package com.xxx.xxx;
    
    import java.io.InputStream;
    
    /**
     * @author jiangyw
     * @date 2019/1/10 21:14
     *
     * 邮件附件类
     */
    public class MailAttachment {
        private String name;
        private InputStream inputStream;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public InputStream getInputStream() {
            return inputStream;
        }
    
        public void setInputStream(InputStream inputStream) {
            this.inputStream = inputStream;
        }
    
        public MailAttachment(String name, InputStream inputStream) {
            this.name = name;
            this.inputStream = inputStream;
        }
    }
    

    使用

    public void readMail() throws MessagingException {
            long startTime = System.currentTimeMillis();
            MailUtil mailUtil = new MailUtil();
            Message[] messages = mailUtil.getPopMessages();
    
            for (Message message : messages) {
                String subject = mailUtil.getSubject(message);
                try {
                   
                        List<MailAttachment> mailAttachments = new ArrayList<>();
                        mailUtil.getAttachment(message, mailAttachments);
                        saveAttachment(mailAttachments);
                    
                    }
                } catch (Exception ignore) {
                   
                }
            }
            mailUtil.close();
            System.out.println("解析邮件共耗时:" + (System.currentTimeMillis() - startTime) + "毫秒");
        }
    
        private void saveAttachment(List<MailAttachment> list) throws IOException {
            for (MailAttachment mailAttachment : list) {
                InputStream inputStream = mailAttachment.getInputStream();
                FileOutputStream outputStream = new FileOutputStream(new File( "your path");
                int len;
                byte[] bytes = new byte[1024 * 1024];
                while ((len = inputStream.read(bytes)) != -1) {
                    outputStream.write(bytes, 0, len);
                    outputStream.flush();
                }
                inputStream.close();
                outputStream.close();
            }
        }
    

    遇到的一些意外

    1. 下载附件速度慢到令人发指!!!(看图)

      两个一共不到4M的附件,下载总共用了1000多秒!!!
      解决方法:不要用IMAP协议接收邮件信息,用POP3协议,换了协议之后的速度(看图)
      在这里插入图片描述
      速度差了两个数量级!!!
    2. 在代码里也注释了,用IMAP协议时没有SentDate,用POP3协议时没有ReceivedDate;这两个协议具体的区别百度一下你就知道,我是因为要获取前一天的邮件,所以是根据日期来搜索。
    3. 附件名乱码,这个其实很简单,用JavaMail自带的MimeUtility解码一下就好。
    展开全文
  • Outlook是一款很多用户都会用来收发邮件的邮箱工具,但是有时候邮件多了,可能会遇到不能接收邮件并提示邮箱已满的情况,该如何解决呢,为此这就给大家带来Outlook邮箱不能接收邮件提示邮件箱已满的解决方法吧。...
  • 资源介绍:邮件群发协议软件 日发百万邮件不进垃圾 全网独家技术 无需发件人即可群发2句话组合为一句,暂无字数限制内容不能有数字和符号 可以用别的文字代替 可以发字母本软件接收邮件的帐号只支持一次性发送,若...
  • 从收件中获取邮件下载其附件的简单 Gmail 客户端 #Requirements 这个脚本的使用需要: Python 3.4 2 步验证 Disbaled 启用 IMAP 访问 启用来自应用程序的安全性较低的访问 #Configuration 将配置文件保存在与...
  • python批量下载邮件附件

    万次阅读 多人点赞 2018-08-20 18:16:29
    老板让你调查个情况,你把excel表发出去了,结果反馈回来的邮件有数百之多,如果一个一个的点开保存,肯定要加班了,让 python 来帮忙吧。 02.批量下载 python 提供的 email 包十分好用,功能完备,搞定我们这个...
  • 源码参考,欢迎下载
  • 这是一款效果非常现代时尚的邮件收件UI设计。该邮件收件UI设计以简洁的列表方式列出所有的邮件,用户点击相应的邮件时会以动画的方式弹出该邮件的详细信息。使用方法HTML结构在这个邮件收件UI设计的HTML结构中...
  • 自动使用此脚本通过电子邮件从自己的收藏集中通过电子邮件自动发送给您自己的Amazon Kindle精选集。 我免费在Heroku上运行它,并每天通过电子邮件向您发送精彩集锦。 Heroku安装说明 克隆此存储库。 (并运行heroku...
  • 下载邮件带的附件,通过网上搜集资料,整理出例如以下代码,仅仅是实现功能。代码并未优化。使用的时候仅仅须要填写自己邮箱账号password就可以(须要源代码的能够留下邮箱)以下贴出代码,package ltg.defualt;...
  • 邮件客户端工具.zip

    2020-08-04 17:42:54
    这是一个邮件客户端管理工具(Foxmail),界面简洁,能够高效检测垃圾邮件并自动分捡到垃圾邮件箱中,是一个非常好用的软件。
  • 之前看到php和java都有完整的自动下载邮件的程序,现在也分享一个golang的,其中主要麻烦的是判断邮件的状态,是否未读,然后就是获取附件并且下载,具体代码如下: package main import ( "io" "io/ioutil" ...
  • 简介: 小龙多功能工具,功能非常多,包含:邮件群发、微信多开、QQ查询 、微信QQ垃圾清理、二维码生成等等。 网盘下载地址: http://kekewl.org/Zw7w8AFFwta0 图片:
  • all['EM'] = From_mail_name From_mail_name_all['文件发送方式'] = '附件' From_mail_name_all_list[num] = From_mail_name_all print(From_mail_name_all_list) #下载一个文件之后把这个文件移动到新的邮件文件夹...
  • 从命令行检查yopmail邮件和收件。 安装 在此处下载二进制文件: 。 适用于archlinux的aur中有一个软件包。 用法 Check yopmail mails and inboxes from command line. Usage: yogo [command] Available ...
  • 本文介绍一款Linux桌面电子邮件客户端:Mailspring及它的下载安装,与Nylas Mail相比,Mailspring更精简,速度更快,它使用基于Mailcore2的新C++同步引擎替换了Nylas Mail中的JavaScript同步代码。Mailspring简介...
  • 今天遇到个需求,当然这次需求跟代码无关。公司用的是腾讯企业邮箱,我用的是本地的...后来网上参考了一些资料发现,邮件服务器有两种类型,我选择的是IMAP image.png IMAP与pop3的区别:imap是可以在本地新建文...
  • Domino 生成邮件到草稿

    千次阅读 2013-06-06 15:11:14
    相关架包下载地址: http://download.csdn.net/detail/qm4050/5531483 代码如下: import java.io.File; import lotus.domino.Database; import lotus.domino.Document; import lotus.domino.Item; ...
  • //收件 Folder defaultFolder = store.getDefaultFolder(); Folder[] allFolder = defaultFolder.list(); for (int i = 0; i ; i++) { System.out.println("这个是服务器中的文件夹="+allFolder[i].getFullName()...
  • 获取-gmail-附件 可以为 GMail 配置的电子邮件收件附件下载器(用于 imap)。 还可以解压缩任何 .zip 附件
  • 如果收件中的空间已用尽,但是您的电子邮件中的内容很重要,但是附件已经下载到磁盘上,可以删除以释放一些空间,该功能可能特别有用。 Gmail附件提取器是一个简单的工具,可让您从Gmail帐户中的电子邮件中提取...
  • 使用PHPMailer发送邮件

    2021-04-15 20:25:01
    首先得下载一个phpMailer插件目录大概是这样 然后写一个函数,引入class.phpmailer.php类文件/*** 邮件发送函数* @param string $to 邮件接收者* @param string $from 邮件发送者* @param string $content 邮件内容*...
  • 在spring boot中写定时任务很简单,两个注解就可以实现。在启动类中加@EnableScheduling,...如下图:接收邮件及其判断是否有附件,并且存储附件。public class TimerTaskServiceImpl implements TimerTaskService...
  • C# 邮件读取(包括附件)

    热门讨论 2013-08-07 19:58:45
    C# pop3邮件读取包括可以读取附件.很好的一个类。
  • 9.10版机器人工具

    2017-04-09 20:24:35
    很实用的一个工具,研究机器人仿真方面的同学,也可以邮件交流2283670598@qq.com
  • Outlook Exchange邮件下载到本地的设置

    万次阅读 2013-04-15 16:41:20
    邮件接收没有问题,可是发现只能在outlook2007中查看服务器上的邮件,并不能将邮件下载到本地(Pop方式时,有个复选框可以让用户方便选择,exchange方式没有)。这样至少有下两个弊端: 服务器上的邮件会越堆积越多...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,034
精华内容 8,813
关键字:

下载邮件箱