声明:先说我遇到的问题。。
1.下图是我,在服务器上发送邮件的乱码内容,中文都是问号!乱码。
2.在本地发邮件正常,在服务器上乱码(服务器:windows英文系统)!
3.先上核心代码
try{ // 发件人的 邮箱 和 密码(替换为自己的邮箱和密码) String myEmailAccount = "xxxxxx@163.com"; String myEmailPassword = "xxxxxxxxZQGTBT";// 授权码 // 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般格式为: smtp.xxx.com // 网易163邮箱的 SMTP 服务器地址为: smtp.163.com String myEmailSMTPHost = "smtp.163.com"; // 收件人邮箱(替换为自己知道的有效邮箱) String receiveMailAccount = "xxxxxxxxx@qq.com"; // 1. 创建参数配置, 用于连接邮件服务器的参数配置 Properties props = new Properties(); // 参数配置 props.put("mail.transport.protocol", "smtp"); // 使用的协议(JavaMail规范要求) props.put("mail.smtp.host", myEmailSMTPHost); // 发件人的邮箱的 SMTP 服务器地址 props.put("mail.smtp.auth", "true"); // 需要验证用户名密码 props.put("mail.smtp.port", 25); javax.mail.Session session; Authentication authentication = new Authentication(myEmailAccount, myEmailPassword); session = Session.getDefaultInstance(props, authentication); session.setDebug(true); MimeMessage msg = new MimeMessage(session); msg.setFrom(new InternetAddress(myEmailAccount));
// 添加收件人邮箱 msg.setRecipients(Message.RecipientType.TO,receiveMailAccount);
//邮件标题 msg.setSubject("工单提示", "UTF-8"); msg.setContent("<h1>你好</h1>", "text/html;charset=UTF-8"); Transport.send(msg); }catch (MessagingException mex){ mex.printStackTrace(); }
4.以上代码,发送邮件是没有问题的,但是在服务器上发送的内容是乱码!
5.以上只能满足文本性质的邮件,如果想要插入图片和附件,需要MimeBodyPart(一个mime消息),MimeMultipart(由一个或多个mime组成而成)两个类,如有不懂JavaMail API文档。
MimeBodyPart body = new MimeBodyPart(); MimeMultipart mp = new MimeMultipart(); msg.setSubject("工单提示", "UTF-8"); body.setContent("<h1>你好</h1>", "text/html;charset=GB2312"); // 指定使用base64编码 body.setHeader("Content-Transfer-Encoding", "base64"); mp.addBodyPart(body); msg.setContent(mp); Transport.send(msg);
6.报错:javax.activation.UnsupportedDataTypeExcep tion: no object DCH for MIME type multipart/related;在开头补充以下代码就ok了!
MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html"); mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml"); mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain"); mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed"); mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822"); CommandMap.setDefaultCommandMap(mc); Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
所以综上所述:合并代码即可。
try{
MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
CommandMap.setDefaultCommandMap(mc);
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
// 发件人的 邮箱 和 密码(替换为自己的邮箱和密码)
String myEmailAccount = "xxxxxx@163.com";
String myEmailPassword = "xxxxxxxxZQGTBT";// 授权码
// 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般格式为: smtp.xxx.com
// 网易163邮箱的 SMTP 服务器地址为: smtp.163.com
String myEmailSMTPHost = "smtp.163.com";
// 收件人邮箱(替换为自己知道的有效邮箱)
String receiveMailAccount = "xxxxxxxxx@qq.com";
// 1. 创建参数配置, 用于连接邮件服务器的参数配置
Properties props = new Properties(); // 参数配置
props.put("mail.transport.protocol", "smtp"); // 使用的协议(JavaMail规范要求)
props.put("mail.smtp.host", myEmailSMTPHost); // 发件人的邮箱的 SMTP 服务器地址
props.put("mail.smtp.auth", "true"); // 需要验证用户名密码
props.put("mail.smtp.port", 25);
javax.mail.Session session;
Authentication authentication = new Authentication(myEmailAccount, myEmailPassword);
session = Session.getDefaultInstance(props, authentication);
session.setDebug(true);
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(myEmailAccount));
// 添加收件人邮箱
msg.setRecipients(Message.RecipientType.TO,receiveMailAccount);
MimeBodyPart body = new MimeBodyPart();
MimeMultipart mp = new MimeMultipart();
msg.setSubject("工单提示", "UTF-8");
body.setContent("<h1>你好</h1>", "text/html;charset=GB2312");
// 指定使用base64编码
body.setHeader("Content-Transfer-Encoding", "base64");
mp.addBodyPart(body);
msg.setContent(mp);
Transport.send(msg);
}catch (MessagingException mex){
mex.printStackTrace();