中文乱码:
修改后:
しかし、プレビューをクリックしても、まだ文字化けしています(解決方法がわかりません) 下記の最新コードで文字化けの問題が解決されました:
本来これは MailKit の添付ファイルパラメータを修正するためのものでしたが、ABP がすべてをラップしているため、この記事は ABP にも関連しています。記事の分類に関してはすべて ABP に属します。
using MiaoXin.BackgroundJobs;
using MiaoXin.Utils;
using Microsoft.Extensions.Options;
using MimeKit;
using MimeKit.Utils;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Mail;
using System.Net.WebSockets;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.BackgroundJobs;
using Volo.Abp.Emailing;
using Volo.Abp.Emailing.Smtp;
using Volo.Abp.MailKit;
using Volo.Abp.MultiTenancy;
namespace ?
{
/// <summary>
/// MailKitSmtpEmailSender をオーバーライドして中国語の添付ファイル名の文字化け問題を解決する
/// </summary>
public class ?MailKitSmtpEmailSender : MailKitSmtpEmailSender
{
public ?MailKitSmtpEmailSender(
ISmtpEmailSenderConfiguration smtpConfiguration,
IBackgroundJobManager backgroundJobManager,
IOptions<AbpMailKitOptions> abpMailKitConfiguration)
: base(smtpConfiguration, backgroundJobManager, abpMailKitConfiguration)
{
}
protected override async Task SendEmailAsync(MailMessage mail)
{
// デフォルトの動作では、中国語の添付ファイル名が QQ メールで文字化けして表示されます
/*return base.SendEmailAsync(mail)*/;
using (var client = await BuildClientAsync())
{
//var message = MimeMessage.CreateFromMailMessage(mail);
var message = BuildMimeMessageFromMailMessage(mail);
message.MessageId = MimeUtils.GenerateMessageId();
await client.SendAsync(message);
await client.DisconnectAsync(true);
}
}
private MimeMessage BuildMimeMessageFromMailMessage(MailMessage mailMessage)
{
var from = mailMessage.From;
var to = mailMessage.To.First();
var message = new MimeMessage();
message.From.Add(new MailboxAddress(from.DisplayName, from.Address));
message.To.Add(new MailboxAddress(to.DisplayName, to.Address));
message.Subject = mailMessage.Subject;
var body = new TextPart(mailMessage.IsBodyHtml ? "html" : "plain")
{
Text = mailMessage.Body
};
if(mailMessage.Attachments is not null && mailMessage.Attachments.Count > 0)
{
// メッセージテキストと画像添付ファイルを保持する multipart/mixed コンテナを作成します
var multipart = new Multipart("mixed")
{
body,
//attachment
};
foreach (var attachment in mailMessage.Attachments)
{
// パスにあるファイルの画像添付ファイルを作成します
var attachmentMimePart = new MimePart(attachment.ContentType.MediaType)//"image", "jpg"
{
Content = new MimeContent(attachment.ContentStream, ContentEncoding.Default),
ContentDisposition = new ContentDisposition(ContentDisposition.Attachment),
ContentTransferEncoding = ContentEncoding.Base64,
FileName = attachment.Name //Path.GetFileName(filePath)
};
multipart.Add(attachmentMimePart);
}
// multipart/mixed をメッセージボディとして設定します
message.Body = multipart;
}
else
{
message.Body = body;
}
return message;
}
//protected override MailMessage BuildMailMessage(string? from, string to, string? subject, string? body, bool isBodyHtml = true, AdditionalEmailSendingArgs? additionalEmailSendingArgs = null)
//{
// //return base.BuildMailMessage(from, to, subject, body, isBodyHtml, additionalEmailSendingArgs);
// var message = from == null
// ? new MailMessage { To = { to }, Subject = subject, Body = body, IsBodyHtml = isBodyHtml }
// : new MailMessage(from, to, subject, body) { IsBodyHtml = isBodyHtml };
// if (additionalEmailSendingArgs != null)
// {
// if (additionalEmailSendingArgs.Attachments != null)
// {
// foreach (var attachment in additionalEmailSendingArgs.Attachments.Where(x => x.File != null))
// {
// var fileStream = new MemoryStream(attachment.File!);
// fileStream.Seek(0, SeekOrigin.Begin);
// // 添付ファイル名の中国語の文字化け問題を解決します:
// // https://www.cnblogs.com/rocketRobin/p/8337055.html
// // https://github.com/jstedfast/MailKit/issues/264
// // https://github.com/jstedfast/MailKit/issues/277
// #region 使えない、名前が英語と数字に変わった
// // DomainModule の ConfigureServices で不足している文字セットを登録する必要があります Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
// //var attachmentItem = Attachment.CreateAttachmentFromString(
// // Encoding.UTF8.GetString(fileStream.ToArray()),
// // attachment.Name!,
// // Encoding.GetEncoding("GB18030"), //Encoding.UTF8,
// // System.Net.Mime.MediaTypeNames.Image.Jpeg);
// #endregion
// var attachmentItem = new Attachment(fileStream, attachment.Name);// , System.Net.Mime.MediaTypeNames.Application.Rtf
// var charset = "GB18030";
// attachmentItem.ContentType.CharSet = charset;
// //// 添付ファイル表示名
// //attachmentItem.ContentType.Name = attachment.Name;
// // 添付ファイルダウンロード名
// // !!中国語はまだ文字化けします。この問題を解決するために、固定の英語ファイル名を使用します。そうしないと、ダウンロード後のファイル名の拡張子が間違っていて開けません。例えば "璺ㄥ鐢靛晢2024骞�堟椿鍔ㄩ鍛�jpg"
// // まさか、QQ メールの表示名、詳細左上のファイル名、ダウンロードファイル名はすべて ContentDisposition!.FileName を使用しているとは思いませんでした
// // 著者に相談しました、https://github.com/jstedfast/MailKit/issues/264#issuecomment-2178099225
// attachmentItem.ContentDisposition!.FileName = attachment.Name!; // "attachment" + Path.GetExtension(attachment.Name);
// message.Attachments.Add(attachmentItem);
// }
// }
// if (additionalEmailSendingArgs.CC != null)
// {
// foreach (var cc in additionalEmailSendingArgs.CC)
// {
// message.CC.Add(cc);
// }
// }
// }
// return message;
//}
}
}