使用C# SmtpClient发邮件时Gmail波斯文显示为问号的问题求助
波斯文邮件主题显示问号的可能原因
数据库存储字段类型错误:如果SQL Server中存储主题/内容的字段用的是
varchar类型,而非nvarchar/ntext这类Unicode类型,波斯文这类非拉丁字符在存储时就会被截断或转成问号。varchar基于单字节编码,无法正确保存Unicode字符,必须用支持双字节的nvarchar类型存储。数据库读取阶段编码丢失:读取数据时如果没有以Unicode方式处理,比如使用了非Unicode的读取方法,或者ORM框架将字段映射为非Unicode字符串类型,会导致取出的字符串已经是损坏的问号(C#的
string本身是Unicode,但读取过程的错误转码会破坏数据)。邮件编码设置不完整:仅设置
SubjectEncoding = Encoding.UTF8可能不够,还需要确保:MailMessage.BodyEncoding也设为Encoding.UTF8(如果邮件内容包含波斯文)MailMessage.HeadersEncoding设为Encoding.UTF8,邮件头部(包括主题)的编码标识需要统一,避免客户端解析混乱
主题编码未按邮件标准处理:部分邮件客户端(比如Gmail)对主题的Unicode编码要求严格,需要遵循RFC 2047规范编码主题。可以手动将主题编码为符合标准的格式,示例代码:
string subject = "دسترسی محدود به تقویم گوگل"; byte[] subjectBytes = Encoding.UTF8.GetBytes(subject); string encodedSubject = $"=?UTF-8?B?{Convert.ToBase64String(subjectBytes)}?="; mailMessage.Subject = encodedSubject;这种方式明确告诉邮件客户端主题的编码格式,避免自动转码出错。
内容的提问来源于stack exchange,提问作者Yusif
相关产品推荐
相关产品推荐

