精华内容
下载资源
问答
  • .net FrameWork4.0环境下发送邮件,有些附件上传成功,发送也成功。但实际上附件是错的。...而UTF-8编码下超过41个字节的附件文件名,发送后发送方QQ邮箱[已发送]中的附件文件名就会显示乱码,接收方163邮...

    .net FrameWork4.0环境下发送邮件,有些附件上传成功,发送也成功。但实际上附件是错的。具体表现为:

    ,UTF-8编码下未超过41个字节的附件文件名,发送后发送方QQ邮箱[已发送]中就会正常显示附件文件名,接收方163邮箱[收件箱]中也会正常显示附件文件名;而UTF-8编码下超过41个字节的附件文件名,发送后发送方QQ邮箱[已发送]中的附件文件名就会显示乱码,接收方163邮箱[收件箱]中会将收到的附件文件名显示为“ATT0004.BIN、ATT0005.BIN”等字样,即解码不正确。将其下载下来把文件后缀名改成之前正确的后缀名,仍无法正常阅读其中的内容。

     

     

    问题解决如下:

    http://social.msdn.microsoft.com/Forums/windowsserver/zh-CN/965518a2-dee2-4f31-92a6-b1645b8ba240/net-framework40

     

    解决方法: 打补丁

    按照微软的解决方案,你需要到以下链接中下载安装一个补丁包:

    https://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=31723

    转载于:https://www.cnblogs.com/liuyit/p/10189612.html

    展开全文
  • qq邮箱附件文件名乱码处理方法

    万次阅读 2014-08-06 16:21:46
     IE的兼容性视图设置 ,把邮箱所在网址输入(QQ邮箱就输入 qq.com).一切OK了!
    
    IE的兼容性视图设置 ,把邮箱所在网址输入(QQ邮箱就输入 qq.com).一切OK了!
    展开全文
  • 文章目录微信QQ邮箱插件,附件Excel 无法打开,或者打开乱码问题1、表现形式2、具体形式3、原因 微信QQ邮箱插件,附件Excel 无法打开,或者打开乱码问题 1、表现形式 通过 Java 代码生成 Excel ,并通过邮件附件的...

    微信QQ邮箱插件,附件Excel 无法打开,或者打开乱码问题


    1、表现形式

    通过 Java 代码生成 Excel ,并通过邮件附件的形式发送给用户,用户通过 QQ 邮箱提醒,打开邮件,点击附件的 Excel 文件,会发现打不开,通过其他第三方程序,也打不开

    在这里插入图片描述

    2、具体形式

    把文件下载到手机,然后转发出来,到电脑端

    发现

    1、文件名被篡改
    2、文件内容,只剩下了一个 Sheet ,打开是乱码,且提示文件已经损坏
    3、文件大小,邮件附件的大小是20KB左右,拿出来的文件只有3-5KB
    4、文件后缀,有时候文件后缀有,有时候没有,是个白板,如果自己补全后缀,通过Excel 软件打开,仍旧是乱码,只有一个 Sheet

    csv 文件同样如此

    3、原因

    微信的安全机制,会篡改文件;

    因为微信为了防止 Excel 里面携带恶意宏,不让宏运行。进行了这些操作。

    为什么呢,因为 Excel 文件中含有中文

    如果Excel 文件中不包含中文,则不会出现这种情况

    中文的位置包括,文件名,Sheet 名称,表格内容,都不能有

    展开全文
  • 解决javaMail发送QQ邮件,附件乱码的问题问题背景具体问题解决思路源码Debug解决方式 问题背景 项目里面使用javaMail发QQ邮件,日志显示我们这边传过去的附件名是正常的,个别名字会出现乱码。 客户不断反馈,悟空...

    解决javaMail发送QQ邮件,附件名乱码的问题

    问题背景

    项目里面使用javaMail发QQ邮件,日志显示我们这边传过去的附件名是正常的,个别名字会出现乱码。
    客户不断反馈,悟空面对这个问题在搞了两天无果后,只能求救于部门老大。老大看了看我可怜巴巴的眼神,拍着胸脯保证交给他了,结果在他debug过无数层源码,打开无数个百度页后,告诉不好解决,先延期吧。
    悟空没有办法,只能拿过来自己再一点一滴debug看下,期望能解出来这个问题。

    具体问题

    首先给大家看下我们的问题,这个是乱码的邮件压缩包
    龙珠悟空
    正常的应该是这样的:
    龙珠悟空

    解决思路

    1. 观察正常得字母和汉字的压缩包不会有问题,有问题的是这种带有特殊符号的压缩包。有同学说直接禁止这样命名不就好了嘛,客户是上帝呀,客户要这样命名那也没有办法。所以解决问题才是正解。
    2. degbug查看发送压缩包前,传入的压缩包名字是正确的,考虑是QQ邮箱有问题,或者是名字的编码有问题,将发送方法改为发送到163邮箱,发现也有该问题。排除QQ邮箱的问题,肯定是压缩包处理时对名字的处理有问题。二话不说,悟空马上考试看源码

    源码Debug

    debug源码查看javaMail附件的处理方法MimeMessageHelper.addAttachment ,一路点到附件名的处理方法MimeUtility.encodeWord方法

    private static String encodeWord(String string, String charset,
    				     String encoding, boolean encodingWord)
    			throws UnsupportedEncodingException {
    
    	// If 'string' contains only US-ASCII characters, just
    	// return it.
    	int ascii = checkAscii(string);
    	if (ascii == ALL_ASCII)
    	    return string;
    
    	// Else, apply the specified charset conversion.
    	String jcharset;
    	if (charset == null) { // use default charset
    	    jcharset = getDefaultJavaCharset(); // the java charset
    	    charset = getDefaultMIMECharset(); // the MIME equivalent
    	} else // MIME charset -> java charset
    	    jcharset = javaCharset(charset);
    
    	// If no transfer-encoding is specified, figure one out.
    	if (encoding == null) {
    	    if (ascii != MOSTLY_NONASCII)
    		encoding = "Q";
    	    else
    		encoding = "B";
    	}
    
    	boolean b64;
    	if (encoding.equalsIgnoreCase("B")) 
    	    b64 = true;
    	else if (encoding.equalsIgnoreCase("Q"))
    	    b64 = false;
    	else
    	    throw new UnsupportedEncodingException(
    			"Unknown transfer encoding: " + encoding);
    
    	StringBuilder outb = new StringBuilder(); // the output buffer
    	doEncode(string, b64, jcharset, 
    		 // As per RFC 2047, size of an encoded string should not
    		 // exceed 75 bytes.
    		 // 7 = size of "=?", '?', 'B'/'Q', '?', "?="
    		 75 - 7 - charset.length(), // the available space
    		 "=?" + charset + "?" + encoding + "?", // prefix
    		 true, encodingWord, outb);
    
    	return outb.toString();
        }
    

    上面的代码我们可以看出,javaMail在对名字处理之前,首先对传入的名字进行了编码的判断,int ascii = checkAscii(string);encoding == null的情况下,对将要对名字进行的编码指定了encoding方法,如果encoding.equalsIgnoreCase("B")则进行Base64编码,发送给QQ邮箱。
    此刻我们没有指定encoding,debug进checkAscii(string);看下,会默认什么编码

     static int checkAscii(String s) {
    	int ascii = 0, non_ascii = 0;
    	int l = s.length();
    
    	for (int i = 0; i < l; i++) {
    	    if (nonascii((int)s.charAt(i))) // non-ascii
    		non_ascii++;
    	    else
    		ascii++;
    	}
    
    	if (non_ascii == 0)
    	    return ALL_ASCII;
    	if (ascii > non_ascii)
    	    return MOSTLY_ASCII;
    
    	return MOSTLY_NONASCII;
        }
    

    在上述方法中nonascii((int)s.charAt(i))对US-ASCII进行校验,如果全是US-ASCII码,则返回ALL_ASCII==1,如果超过一半是 US-ASCII码,则返回MOSTLY_ASCII==2,否则就返回MOSTLY_NONASCII==3
    代码块一中我们可以看出只要不是MOSTLY_NONASCII==3,就会使用Q编码即非Base64编码,MOSTLY_NONASCII==3时则使用Base64编码。
    此时我们再看名字"行业媒体稿件${random}.zip ",这个名字有一半以上都是可以ASCII码,所以使用了Q即非Base64编码。

    doEncode(string, b64, jcharset, 
    		 // As per RFC 2047, size of an encoded string should not
    		 // exceed 75 bytes.
    		 // 7 = size of "=?", '?', 'B'/'Q', '?', "?="
    		 75 - 7 - charset.length(), // the available space
    		 "=?" + charset + "?" + encoding + "?", // prefix
    		 true, encodingWord, outb);
    
    

    通过doEncode方法我们可以看出名字如果超过75个字符,我们会截断成两端拼接,我们的名字长度不超过75字符,不是字符长度引起的问题,继续排查。进入doEncode 代码,我们可以看到

     ByteArrayOutputStream os = new ByteArrayOutputStream();
    	    OutputStream eos; // the encoder
    	    if (b64) // "B" encoding
    		eos = new BEncoderStream(os);
    	    else // "Q" encoding
    		eos = new QEncoderStream(os, encodingWord);
    

    QEncoderStream方法对名字数据流进行了编码处理,问题点一定再编码这块,继续看源码

     public QEncoderStream(OutputStream out, boolean encodingWord) {
    	super(out, Integer.MAX_VALUE); // MAX_VALUE is 2^31, should
    				       // suffice (!) to indicate that
    				       // CRLFs should not be inserted
    				       // when encoding rfc822 headers
    
    	// a RFC822 "word" token has more restrictions than a
    	// RFC822 "text" token.
    	specials = encodingWord ? WORD_SPECIALS : TEXT_SPECIALS;
        }
    

    可以看到定义了全局变量specials 对流的字符集进行判断,继续追踪,看该变量什么时候调用

     @Override
        public void write(int c) throws IOException {
    	c = c & 0xff; // Turn off the MSB.
    	if (c == ' ')
    	    output('_', false);
    	else if (c < 040 || c >= 0177 || specials.indexOf(c) >= 0)
    	    // Encoding required. 
    	    output(c, true);
    	else // No encoding required
    	    output(c, false);
        }
    

    这个方法将编码后的名字流进行输出,此时我们可以看到write(int c)对每个字节进行处理,output()方法里进行流拼接,很明显问题出在拼接的流之间字符集冲突乱码啦。
    至此问题点发现,是由于名字时含有非ASCII造成的,所以干脆,在封装压缩包的之后,直接指定名字的编码方式即可,统一使用Base64编码。

    解决方式

    从上面问题发现,只需要指定压缩包名的编码方式即可,Debug源码

        public static String encodeText(String text, String charset,
    				    String encoding)
    			throws UnsupportedEncodingException {
    	return encodeWord(text, charset, encoding, false);
        }
    

    发现encodeWord(text, charset, encoding, false);方法可以指定名字编码方式,所以完整的发送方法为

    public void sendAttachmentsMail(MailSendBo mailSendBo)
            throws MailSendException, MessagingException, UnsupportedEncodingException {
            JavaMailSenderImpl javaMailSender = initJavaMailSender(mailSendBo.getFromEmail(), mailSendBo.getAuthCode());
            MimeMessage message = javaMailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(mailSendBo.getFromEmail());
            helper.setTo(mailSendBo.getToEmail());
            helper.setSubject(mailSendBo.getSubject());
            helper.setText(mailSendBo.getContent());
            List<String> filePathList = mailSendBo.getFilePathList();
            if (CollectionUtils.isNotEmpty(filePathList)) {
                for (String url : filePathList) {
                    File tempFile = new File(url);
                    //指定压缩包名的编码方式和字符集
                    String fileName = MimeUtility.encodeText(tempFile.getName(), "UTF-8", "B");
                    helper.addAttachment(fileName, tempFile);
                }
            }
            javaMailSender.send(message);
        }
    

    下面展示一下效果:
    龙珠悟空
    解决问题,老大都没解决被悟空解决啦,可是怎么才能不高调的炫耀一下呢,那么就写篇文章吧

    每日一语

    最可怕的是想太多,做太少,而我们恰恰处于这个年纪,停下来,先走两步,也许不一定是想的那样

    点关注,不迷路,更多精彩关注微信公众号

    龙珠悟空

    展开全文
  •  |更新:2014-09-07 02:17 ...前段时间用ie登录winmail邮箱下载附件时文件名总是显示为乱码,还得手动改回来,很麻烦。于是研究了一番,终于找到了解决办法。 百度经验:jingyan.baidu.co
  • ``` int CSmtp::SendAttachment_Ex() /*发送附件...上边是发送附件源码,但是结果在163邮箱附件却以正文的形式显示,并且乱码了 ![图片说明](https://img-ask.csdn.net/upload/201606/04/1465054103_634929.png)
  • 怕你们找不到,点击即可跳转
  • JavaMail附件中文名称乱码 - Different Design Studio - 博客频道 - CSDN.NET http://blog.csdn.net/fireson/article/details/7095948 问题: 用Javamail发邮件到邮件服务器,从邮箱中查看发现附件的中文名称变成了...
  • 问题描述:发送压缩文件到qq邮箱,发现标题为中文名称,能正常显示,但是附件的中文名称为乱码。 任务:解决附件中文名称的乱码问题。 前期资料总结: 1、SMTP乱码解决方案(源自...
  • 本文简要介绍如何通过Spring框架的支持,通过QQ邮箱来发送邮件,包括简单文本,附件、以及内联图片、HTML以及HTTP图片。 spring-context-support很早就内置支持邮件发送。 当然, 官方文档明确指出, 需要依赖 ...
  • 可以实现类似于163邮箱附件上传,还有下载。下载解决了跨域下载和中文乱码的问题
  • 1.附件的名称只能为英文,中文乱码 2.友好名称的显示。 我们使用163等邮箱发送邮件时,我们经常可以看到收件人一栏中会是:张益达 <zyh5540@163.com>这种方式。在上一版本的代码中并没有使用这样的方式。 ...
  • 使用java实现的简易小邮箱,实现发送,下载附件等功能,无乱码问题
  • 我先跟大家细说一下这是个什么情况吧,比如说通过开发的手机端邮箱功能,发送附件附件名称类似下边图片这种: 接着我们发送邮件,包含图上所示的附件,OK,我们发送成功了(这个过程就不给大家展示了,哈哈......
  • 1.附件的名称只能为英文,中文乱码 2.友好名称的显示。 我们使用163等邮箱发送邮件时,我们经常可以看到收件人一栏中会是:张益达 这种方式。在上一版本的代码中并没有使用这样的方式。 下面解决这两个问题 1. ...
  • python收新邮件(解决了中文编码,可收附件和查看邮件信息) (2013-01-25 11:59:17) 转载▼     最近老是登陆不了Gmail邮箱(原因就不做猜想:-)),没办法情况下尝试用python写了个检查...
  • 网易邮箱附件打包下载后,解压,文件以及文件夹名称显示乱码解决方法: 1,安装convmv [root@localhost 网易附件]# yum install convmv 2,批量 递归 修改当前目录下的文件名 [root@localhost 网易附件]# convmv -f ...
  • 配置文件: ...mail.smtp.auth=true mail.sender.username=xxxxxx@163.com #邮箱...mail.sender.password=xxxxxx #邮箱授权码(开启stmp和pop服务后获取授权码) mail.smtp.port=465 #使用ssl加密端口(25端口不加密...
  • 当我们使用commons-email包或者javaMail发送邮件带有附件后,可能会出现较长的中文名乱码的情况,之后我们采用网上大多数人说的MimeUtility.encodeText()对文件名进行处理,然鹅,并不能解决问题。 文件名处理 ...
  • outlook 从2013升级到2016后,发出的会议邀请正文中,收到的人有的是乱码,有的是正常的,归纳起来是同一个域的用户收到的都是正常的,与附件人域名不同的其他邮箱收到的显示则是乱码。 不停寻找方法和尝试修改,...
  • 解决方法 在中文的左边加 =?UTF-8?B?`echo ,右边加 | base64`?= sendEmail -t 接收邮箱 -...=" -o message-content-type=html -o message-charset=utf8 -a 附件路径 -xu 邮箱用户名 -xp 邮箱密码 -m "邮件内容" ...
  • JavaMail是大名鼎鼎的Oracle公司开发的电子邮件...3、附件名称乱码 4、附件下载速度慢 5、邮件正文包含图片时,对图片的处理(重点难点) 6、对正文图片和附件的拆分(难点)(可根据Content-ID参数判断) 7、对邮
  • 今天写了个脚本,定时给指定邮箱发送邮件,手动执行的时候没有问题,但添加到计划任务后发送的邮件就中文乱码,变成一个不知名的附件形式:上网查了下原因产生原因: 这是因为Unix/Linux下使用crontab时的运行环境已经...
  • 最近在捣鼓从邮箱拉取数据并下载邮件附件的内容到本地的活儿,记录一下遇到的问题。 获取到附件数据后,最开始将数据写入本地文件夹的代码如下: 运行完成后查看写好的excel文件,显示文件已损坏 通过...
  • 目前发现当附件名称为中文时,发送不同的邮箱如QQ邮箱,新浪邮箱出现不同程度乱码,内容也可能出现乱码问题。用了网上的mdp.setFileName(MimeUtility.encodeText(filename);也未解决问题,并且直接获取中文名称有时...
  • 今天遇到一个奇怪的问题,发qq邮箱的时候,附件名字奇怪的乱码了。 本来的名字应该是:单级浮动分析表1231 结果接受到的附件名字是单级浮动分 =9__E 表1231 这里的分析的析字给变乱码了,这就很奇怪啊,然后我...
  • 我们发现使用smtplib库发送的附件中文是正常显示的,而yagmail会显示乱码,但是smtplib相对来说代码量比较大 代码: # 进行邮箱连接的库 import smtplib # 处理邮件内容的库 from email.mime.text import MIMEText ...

空空如也

空空如也

1 2 3 4 5
收藏数 93
精华内容 37
关键字:

邮箱附件乱码