mail 邮件内容出现随机乱码

问题描述:

将数据(含中文)拼装为html文件格式,发送邮件到指定用户。

利用PHP中的mail函数

//拼装header。指定编码utf-8,解析邮件正文中的中文
$headers = "From: [email protected]\n";
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-type: text/html; charset=utf-8\n";
$headers .= "Content-Transfer-Encoding: 8bit\n";
//拼装标题  解决中文标题乱码问题
$subject = xxx;
$subject = "=?UTF-8?B?".base64_encode($subject)."?=";

mail($toEmail,$subject,$message,$headers);   // 其中$message为邮件内容主题,格式形如"<html><head></head><body><p>".$title."</p>".$message.$table."</body></html>";

收到邮件正文部分随机出现乱码,非特殊字符,位置随机,发送邮件到mac和windows收到邮件乱码不一样。

  • windows:随机位置出现? 或!
  • Mac: 数据位置与传入不一致,比如,应为 xxxxAxxxxBxxxxx,收到的邮件为 xxxxBxxxxAxxxx

传入数据不一样时,有时会出现乱码,有时不会出现,对比与特殊字符也无关。

windows 乱码形如:

排查:

 1. 确认是否拼装错误

直接在mail函数前一行打印message内容,完整html格式,保存为html文件后打开。无乱码,与预期所需吻合。

2. 确认收到邮件内容

outlook查看邮件源文件(Mac可直接右击,windows无此功能,后是保存为html文件后查看),发现乱码处格式与步骤一中不一致。比如,标签出现 <!td>

3. 其他

其实到这一步就一直在怀疑php 的mail函数里究竟做了什么,是不是隐藏的PHP底层bug,传输过程改动了什么。却没有找到对应源码查看,此处徘徊很久。

又因为是中文乱码,一再确认设置了UTF-8,搜索很多结果也是关于这个

另外mac上位置的错乱有考虑到是否是传输截断有问题,是不是长度太长导致

转机:https://www.cnblogs.com/puzbus/archive/2013/06/07/3356342.html

总结出来两点

  • 邮件内容过长会导致解析问题
  • 解决:Content-Transfer-Encoding: base64

复盘补充:

问题一:邮件的长度限制依据是什么,长邮件该如何处理

php mail 方法的文档里有注明上限(印象中超过长度会是截断等处理,所以出现乱码也没想到是长度问题)

而php 基本方法设置上限的依据则是RFC 2822 2.1.1

同时,它也提供了处理的建议,就是将文本内容拆成多行。拼装的html结构则是一行,显然是超过了长度。

问题二:为什么base64就可以解决邮件单行过长的问题

1. 理解base64是什么,参考了base64笔记 http://www.ruanyifeng.com/blog/2008/06/base64.html,简单来说base64中的3个字节代表ASCII中的4个字节

2. 这和换行有什么关系呢?根据RFC822规定,BASE64Encoder编码每76个字符,还需要加上一个回车换行

问题三:Content-Transfer-Encoding 取不同值代表什么?

参考:MIME笔记和 https://www.w3.org/Protocols/rfc1341/5_Content-Transfer-Encoding.html

个人理解,除了base64以外的方式都没有插入换行的效果,也就无法解决问题

补充1:text类需要补充charset 

补充2: "=?【编码】?B?".base64_encode($subject)."?=";  B代表 base64 Q代表quoted-printable

原文地址:https://www.cnblogs.com/matric/p/9241208.html

时间: 2024-10-14 04:11:19

mail 邮件内容出现随机乱码的相关文章

更改邮件发送语言为英语,解决编码为UTF8邮箱注册账号,邮件内容乱码问题

Change email English language, code for UTF8 mailbox registered account, email content garbled. 1. code analysis 乱码分析 通过对中文编码的邮件服务器使用原来的系统(GB2312) The original system used by the mail server encoding for the Chinese code (GB2312) 我使用outlook.com的邮箱(UT

myeclipse+javamail发送邮件邮件内容乱码解决

一.问题背景: 使用myeclipse+javax.mail.jar开发邮件接口 二.问题描述: 收到的邮件内容如下,无发件人无主题内容看似乱码 (无主题) 发件人: <> (由 [email protected] 代发) 时   间:2015年8月19日(星期三) 晚上7:41 ------=_Part_0_161797574.1439984459286Content-Type: text/html; charset=utf-8Content-Transfer-Encoding: base6

解决zabbix邮件内容为附件

安装zabbix之后,设置邮件脚本报警的时候,发送的报警内容变成了tcmime.1278.1278.1724.bin或ATT00001.bin. yum -y install  mailx dos2unix     //安装mailx工具和dos2unix转换工具 以下是脚本内容: [root@localhost alertscripts]# cat sendmail.sh #!/bin/bash #export.UTF-8         //解决发送的中文变成了乱码的问题 FILE=/tmp

Linux mail 邮件发送

Linux mail 邮件介绍 在Linux系统下我们可以通过"mail"命令,发送邮件,在运维中通常我们它来实现邮件告警. 安装 yum install -y sendmail.i686 yum install -ymailx.i686 启动:service sendmail start netstat -lnp | grep :25 tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1102/master tcp 0 0 ::1:25 :::* LISTE

C#发送邮件并将图片插入邮件内容

邮件内容的字符串 StringBuilder Mbody = new StringBuilder();            Mbody.AppendLine("尊敬的领导:");            Mbody.AppendLine("</br>");            Mbody.AppendLine("<p>    您好!</p>");            Mbody.AppendLine(&qu

.net active up mail 邮件发送

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using ActiveUp.Net.Mail; namespace ConsoleApplication1{    class Program    {        static void Main(string[] args)        {            Se

node.js实现收取邮件,以及对特定邮件内容的自动回复,邮件正文保存的功能

废话不多说,直接上代码... var Imap = require('imap');var inspect = require('util').inspect;var MailParser = require("mailparser").MailParser;var nodemailer = require('nodemailer'); var fs = require('fs');var http = require('http'); var imap = new Imap({ us

java mail邮件发送(带附件) 支持SSL

java mail邮件发送(带附件)有三个类 MailSenderInfo.java package mail; import java.util.Properties; import java.util.Vector; public class MailSenderInfo { // 发送邮件的server的IP和端口 private String mailServerHost; private String mailServerPort = "25"; // 邮件发送者的地址 pr

java mail邮件发送(带附件)

java mail邮件发送(带附件)有三个类 MailSenderInfo.java package mail; import java.util.Properties; import java.util.Vector; public class MailSenderInfo { // 发送邮件的服务器的IP和端口 private String mailServerHost; private String mailServerPort = "25"; // 邮件发送者的地址 priva