`
yingyingol
  • 浏览: 748747 次
文章分类
社区版块
存档分类
最新评论

JavaMail 发送验证邮件(JSP/Servlet实例源码)

 
阅读更多

JavaMail 发送验证邮件(JSP/Servlet实例源码)

关键词JavaMail 邮件 认证

● 发送email:包括文本邮件、HTML邮件、带附件的邮件、SMTP验证
● 接收email:pop3远程连接、收取不同MIME的邮件、处理附件

首先需要配置环境。需要mail.jaractivation.jar两个包。地址在java.sun.com上,很容易找到。放到classpath中,比如我的是这样.;E:/Tomcat5/common/lib/activation.jar;E:/Tomcat5/common/lib/mail.jar;E: /Tomcat5/common/lib/mailapi.jar;E:/Tomcat5/common/lib/;E:/jdk1.5/lib/dt.jar; E:/jdk1.5/lib/tool.jar;E:/jdk1.5/lib/;E:/jdk1.5/bin/;E:/jdk1.5。


例子一、javamail.jsp 发送验证邮件源代码

<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK" %>
<%
//set Chinese Char
//homepage:jiarry.126.com
request.setCharacterEncoding("GBK");
response.setCharacterEncoding("GBK");
response.setContentType("text/html; charset=GBK");
%>
<%@ page import="javax.mail.*, javax.mail.internet.*,javax.activation.*,java.util.*,java.io.*;"%>

<html>
<head>
<title>JavaMail 电子邮件发送系统</title>
</head>
<body>
JavaMail 电子邮件发送系统
<br>本例子是用java mail来发送邮件的最简单的例子,认证才能正常发送邮件。
<form action="" method="post" OnSubmit="">
收件人Email:<br /> <input type="text" name="recipients"><br />
发件人Mail:<br /> <input name="frommail" type="text" size="30" /><br />
邮件标题 <br /> <input name="subject" type="text" size="50" /><br />
内容:<br /> <textarea name="contents" cols="50" rows="10"></textarea>
<br /> <input type="submit" name="Submit" value="发送邮件" />
<form>
<%!
String host = "smtp.126.com";
String user = "username";
String password = "xxxxx";
String contentType="text/html; charset=gbk";

private class Authenticator extends javax.mail.Authenticator
{
public PasswordAuthentication getPasswordAuthentication()
{
String un = user;
String pw = password;
return new PasswordAuthentication(un, pw);
}
}
%>
<%
String touser = request.getParameter("recipients")!=null ? request.getParameter("recipients") : "";
out.print("<br>recipients:" + touser);
String fromuser = request.getParameter("frommail")!=null ? request.getParameter("frommail") : "";
out.print("<br>frommail:" + fromuser);
String subject = request.getParameter("subject")!=null ? request.getParameter("subject") : "";
out.print("<br>subject:" + subject);
String contents = request.getParameter("contents")!=null ? request.getParameter("contents") : "";
out.print("<br>contents:" + contents);
out.print("<br>");

try{
Properties props = new Properties();
props.put("mail.smtp.auth","true"); //是否验证
props.put("mail.smtp.host", host);
props.put("mail.smtp.user", user);
props.put("mail.smtp.password",password);


boolean sessionDebug = false;
Authenticator auth = new Authenticator();
//Session mailSession = Session.getDefaultInstance(props, auth); //有时可能被拒绝
Session mailSession = Session.getInstance(props,auth); //用户验证;
//Session mailSession = Session.getInstance(props);
mailSession.setDebug(sessionDebug);


Message msg = new MimeMessage(mailSession);
msg.setFrom(new InternetAddress( fromuser ));
msg.setRecipient(Message.RecipientType.TO, new InternetAddress( touser ));
msg.setSubject( "邮件标题:" +subject);
//((MimeMessage)msg).setSubject(subject, "GBK"); //设置中文标题
msg.setSentDate(new Date());

String text = "javamail.jsp 发送认证邮件<b>测试</b>。<hr>" + contents;

msg.setContent(text, contentType);

Transport transport = mailSession.getTransport("smtp");
transport.connect(host,user,password);

transport.send( msg );

%><p>你的邮件已发送,<a href="javascript:window.go(-1)">请返回。</></p><%
}
catch(Exception m){out.println(m.toString());}%>
</BODY>
</HTML>


例子二、用Servlet来发送邮件 ,PostMail.java 源代码

package mail;
import javax.mail.*;
import javax.mail.internet.*;

import java.util.*;
/*
* 创建日期 2005-12-1
*
* TODO 要更改此生成的文件的模板,请转至
* 窗口 - 首选项 - Java - 代码样式 - 代码模板
*/
/**
* @author Administrator
*
* TODO 要更改此生成的类型注释的模板,请转至
* 窗口 - 首选项 - Java - 代码样式 - 代码模板
*/
public class PostMail {
/*String mailform="";String mailto="";String mailsubject="";String mailcontent="";*/
String host="smtp.126.com";
String user="username";
String password="xxxxx";
public void setHost(String host)
{
this.host=host;
}

public void setAccount(String user,String password)
{
this.user=user;
this.password=password;
}

public void send(String from,String to,String subject,String content)
{
Properties props = new Properties();
props.put("mail.smtp.host", host);//指定SMTP服务器
props.put("mail.smtp.auth", "true");//指定是否需要SMTP验证
try
{
//Session mailSession = Session.getDefaultInstance(props);//用这个有时被拒绝;
Session mailSession = Session.getInstance(props);

mailSession.setDebug(true);//是否在控制台显示debug信息

Message message=new MimeMessage(mailSession);
message.setFrom(new InternetAddress(from));//发件人
message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));//收件人 //message.setSubject(subject);

((MimeMessage)message).setSubject(subject, "GBK");
//得到中文标题for linux,windows下不用;
// message.setSubject(subject);//邮件主题

//内容类型Content-type
//普通文本为text/plain,html格式为text/html
message.setContent(content,"text/html;charset=GBK");
//message.setText("<html><body><h1>Java Mail,你好!</body></html>");

message.setText(content);//邮件内容
message.saveChanges();

Transport transport = mailSession.getTransport("smtp");
transport.connect(host, user, password);
transport.sendMessage(message, message.getAllRecipients());


transport.close();
}catch(Exception e)
{
System.out.println(e);
}

}

public static void main(String args[])
{
/* PostMail sm=new PostMail();

sm.setHost("smtp.126.com");//指定要使用的邮件服务器
sm.setAccount("xxxxx","xxxxx");//指定帐号和密码

/*
* @param String 发件人的地址
* @param String 收件人地址
* @param String 邮件标题
* @param String 邮件正文
*/

}

}

调用PostMail.java的jsp文件:postmail.jsp源代码

<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK" %>
<%
//set Chinese Char
//homepage:jiarry.126.com
request.setCharacterEncoding("GBK");
response.setCharacterEncoding("GBK");
response.setContentType("text/html; charset=GBK");
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>电子邮件</title>
<script language="JavaScript">
<!--
function checkdata() {
var txt = document.forms[0].email.value;
if(txt.search("^//w+([-+.]//w+)*@//w+([-.]//w+)*//.//w+([-.]//w+)*$")!=0) {
alert("请输入正确电子邮件");
document.forms[0].email.select();
return false;
}

return true;
}
-->
</script>
</head>
<body>
<p>
<%
java.util.Date date = new java.util.Date();
out.print(new java.util.Date());
out.print("<hr>");
%>
本例子是调用PostMail.java来发送认证的邮件,需要下载mail.jar和activation.jar,并设置classpath
<jsp:useBean id="mail" scope="page" class="mail.PostMail" />
<form action="" method="post" OnSubmit="return checkdata()">
<p>请输入发件人电子邮件:<input type="text" name="email">
<p>请输入收件人电子邮件:<input type="text" name="toemail">
<p><input type="submit" value="发送">
<form>
<%

String email ="",toemail="";
if(request.getParameter("email")!=null){
email =request.getParameter("email");
}
if(request.getParameter("toemail")!=null){
toemail =request.getParameter("toemail");
}
//if(email!=null)
if( email.trim().length()>0 && !email.matches("^//w+([-+.]//w+)*@//w+([-.]//w+)*//.//w+([-.]//w+)*$")) {
out.print("发件人邮件地址不正确");
return;
}
if(toemail.trim().length()>0 && !toemail.matches("^//w+([-+.]//w+)*@//w+([-.]//w+)*//.//w+([-.]//w+)*$")) {
out.print("收件人邮件地址不正确");
return;
}

if(email.trim().length()>0 && toemail.trim().length()>0){
try{
mail.send(email,toemail, "Test PostMail.java 中文", "<h1>Java Mail,你好 PostMail!</h1><br><br><b>Jiarry.126.com</b>");
out.print("<font color='green'>邮件已发送</font>");
}catch(Exception e){
out.print( "<font color='red'>出错了</font>");
out.print(e.getMessage());
System.out.print(e.getMessage());
}
}

%>
</body>
</html>


其他java源代码:MailManager.java 源代码

package mail;

import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;
import javax.activation.*;
import java.io.*;

public class MailManager {

//sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
//msg.setSubject("=?GB2312?B?"+enc.encode(subject.getBytes())+"?=");

//比如说有一个邮件帐号: smtpuser@xxx.com
//POP3_HOST_NAME和SMTP_HOST_NAME分别是这邮件地址的pop3和smtp服务器DNS
//则SMTP_AUTH_USER ="smtpuser", SMTP_AUTH_PWD就是该帐号的密码

private final String POP3_HOST_NAME = "pop3.126.com";
private final String SMTP_HOST_NAME = "smtp.126.com";
private final String SMTP_AUTH_USER = "username";
private final String SMTP_AUTH_PWD = "xxxxxx";

private Authenticator auth = new Authenticator(){
public PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication(SMTP_AUTH_USER, SMTP_AUTH_PWD);
}
};

public void sendMail(String toAddr, String subject,
String body, String fromAddr, String contentType) {
try {
Properties props = new Properties();

//指定SMTP服务器,邮件通过它来投递
props.put("mail.smtp.host", (String)SMTP_HOST_NAME);
props.put("mail.smtp.auth", (String)"true");
//Session session =Session.getDefaultInstance(props, auth);
Session session =Session.getInstance(props, auth); //
Message msg = new MimeMessage(session);

//指定发信人
msg.setFrom(new InternetAddress(fromAddr));

//指定收件人
//InternetAddress[] tos = {new InternetAddress(toAddr)};
//msg.setRecipients(Message.RecipientType.TO,tos);

//指定收件人,多人时用逗号分隔
InternetAddress[] tos =InternetAddress.parse(toAddr);
msg.setRecipients(Message.RecipientType.TO,tos);

//标题//转码BASE64Encoder
//sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
//msg.setSubject("=?GBK?B?"+enc.encode(subject.getBytes())+"?=");
//msg.setSubject(new String(subject.getBytes("GBK"),"ISO8859-1"));
//msg.setSubject("=?GB2312?B?"+enc.encode(subject.getBytes())+"?=");
//msg.setSubject(subject);
((MimeMessage)msg).setSubject(subject,"GBK");
//得到中文标题for linux,windows下不用;

//内容
msg.setText(body);

//发送时间
msg.setSentDate(new Date());

//内容类型Content-type
//普通文本为text/plain,html格式为text/html;charset=GBK
msg.setContent(body, contentType);

//发送
Transport.send(msg);

} catch(Exception e){
System.out.println(e);
}
}

public void sendMailWithAttatchment(String toAddr, String subject, String body,
String fromAddr, String contentType, String []fileList) {
try {
Properties props = new Properties();

//指定SMTP服务器,邮件通过它来投递
props.put("mail.smtp.host", SMTP_HOST_NAME);
props.put("mail.smtp.auth", "true");

Session session = Session.getDefaultInstance(props, auth);
//Session session = Session.getInstance(props, auth);//
SecurityManager security = System.getSecurityManager();
System.out.println("Security Manager" + security);
//Looking at your code it looks like you will see a null value for security.
//If the security is null use session.getInstance(props,auth)
//instead of session.getDefaultInstance(props,auth).

Message msg = new MimeMessage(session);

//指定发信人
msg.setFrom(new InternetAddress(fromAddr));

//指定收件人
//InternetAddress[] tos = {new InternetAddress(toAddr)};
//msg.setRecipients(Message.RecipientType.TO,tos);

//指定收件人,多人时用逗号分隔
InternetAddress[] tos =InternetAddress.parse(toAddr);
msg.setRecipients(Message.RecipientType.TO,tos);

//标题//转码BASE64Encoder
//sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
//msg.setSubject("=?GBK?B?"+enc.encode(subject.getBytes())+"?=");
//msg.setSubject(new String(subject.getBytes("GBK"),"ISO8859-1"));
//msg.setSubject("=?GB2312?B?"+enc.encode(subject.getBytes())+"?=");
//msg.setSubject(subject);
((MimeMessage)msg).setSubject(subject, "GBK");
//得到中文标题for linux,windows下不用;

//发送时间
//msg.setSentDate(new Date());
msg.setSentDate(new java.util.Date());
Multipart multipart = new MimeMultipart();
MimeBodyPart bodyPart = new MimeBodyPart();
//内容
bodyPart.setText(body);
//Content-type
bodyPart.setContent(body, contentType);
multipart.addBodyPart(bodyPart);

for(int i=0; i<fileList.length; ++i) {
bodyPart = new MimeBodyPart();
File f = new File(fileList[i]);
DataSource source = new FileDataSource(f);
bodyPart.setDataHandler(new DataHandler(source));
bodyPart.setFileName(f.getName());

multipart.addBodyPart(bodyPart);
}

msg.setContent(multipart);

//发送
Transport.send(msg);

} catch(Exception e){
System.out.println(e);
}
}
/*
public Mails getMails() {
Mails mails=null;
try {
//Properties props = System.getProperties();
Properties props = new Properties();
props.put("mail.pop3.host", SMTP_HOST_NAME);
props.put("mail.pop3.auth", "true");

Session session = Session.getDefaultInstance(props, auth);

Store store = session.getStore("pop3");
store.connect();

Folder inbox = store.getFolder("INBOX");
mails = new Mails(inbox);
store.close();

} catch(Exception e){
System.out.println(e);
}
return mails;
}*/
}



SendMailUsingAuthentication.java 源代码,引用这个java bean发送认证email例子

package mail;

import javax.mail.*;
import javax.mail.internet.*;

import java.util.*;

/*
To use this program, change values for the following three constants,

SMTP_HOST_NAME -- Has your SMTP Host Name
SMTP_AUTH_USER -- Has your SMTP Authentication UserName
SMTP_AUTH_PWD -- Has your SMTP Authentication Password

Next change values for fields

emailMsgTxt -- Message Text for the Email
emailSubjectTxt -- Subject for email
emailFromAddress -- Email Address whose name will appears as "from" address

Next change value for "emailList".
This String array has List of all Email Addresses to Email Email needs to be sent to.


Next to run the program, execute it as follows,

SendMailUsingAuthentication authProg = new SendMailUsingAuthentication();

*/

public class SendMailUsingAuthentication
{

private static final String SMTP_HOST_NAME = "smtp.126.com";
private static final String SMTP_AUTH_USER = "username";
private static final String SMTP_AUTH_PWD = "******";

private static final String emailMsgTxt = "Online Order Confirmation Message. Also include the Tracking Number.中国人";
private static final String emailSubjectTxt = "这里是标题,Java Mail test";
private static final String emailFromAddress = "user@126.com";

// Add List of Email address to who email needs to be sent to
private static final String[] emailList = {"username@126.com", "xxxx@126.com"};


public static void main(String args[]) throws Exception
{
//SendMailUsingAuthentication smtpMailSender = new SendMailUsingAuthentication();
//smtpMailSender.postMail( emailList, emailSubjectTxt, emailMsgTxt, emailFromAddress);
//smtpMailSender.postMail( emailList, emailSubjectTxt, emailMsgTxt, emailFromAddress);
//System.out.println("Sucessfully Sent mail to All Users");
}

public void postMail( String recipients[], String subject,
//public void postMail( String recipients, String subject,
String message , String from) throws MessagingException
{
boolean debug = false;

//Set the host smtp address
Properties props = new Properties();
props.put("mail.smtp.host", SMTP_HOST_NAME);
props.put("mail.smtp.auth", "true");

Authenticator auth = new SMTPAuthenticator();
//Session session = Session.getDefaultInstance(props, auth); //有时可能被拒绝
Session session = Session.getInstance(props,auth);

session.setDebug(debug);

// create a message
Message msg = new MimeMessage(session);

// set the from and to address
InternetAddress addressFrom = new InternetAddress(from);
msg.setFrom(addressFrom);

InternetAddress[] addressTo = new InternetAddress[recipients.length];
for (int i = 0; i < recipients.length; i++)
{
addressTo[i] = new InternetAddress(recipients[i]);
}
msg.setRecipients(Message.RecipientType.TO, addressTo);

// msg.setRecipient(Message.RecipientType.TO,toemail);
// Setting the Subject and Content Type

//标题//转码BASE64Encoder
//sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
//msg.setSubject("=?GBK?B?"+enc.encode(subject.getBytes())+"?=");
//msg.setSubject(new String(subject.getBytes("GBK"),"ISO8859-1"));
//msg.setSubject("=?GB2312?B?"+enc.encode(subject.getBytes())+"?=");
//msg.setSubject(subject);
((MimeMessage)msg).setSubject(subject, "GBK");
//得到中文标题for linux,windows下不用;

// msg.setSubject(subject);
msg.setContent(message, "text/html;charset=GBK");
//msg.setContent(message, "text/plain");
Transport.send(msg);
}


/**
* SimpleAuthenticator is used to do simple authentication
* when the SMTP server requires it.
*/
private class SMTPAuthenticator extends javax.mail.Authenticator
{

public PasswordAuthentication getPasswordAuthentication()
{
String username = SMTP_AUTH_USER;
String password = SMTP_AUTH_PWD;
return new PasswordAuthentication(username, password);
}
}

}


参考:
Bromon原创请尊重版权

  怎样才算比较完整的Javamail操作指南?我想应该包括绝大多数基本的email操作,能够应付一般的应用。在本指南中打算囊括以下内容:

●发送email:包括文本邮件、HTML邮件、带附件的邮件、SMTP验证
●接收email:pop3远程连接、收取不同MIME的邮件、处理附件

  我想有了上述功能的介绍,应该可以应付很多email的相关应用了。所以请允许我给本文拟了一个比较狂妄的名字,这样才能保证收视率,:)。还是那句话,写这个post的原因就是没有在网上看到更全面的,你看过的话记得要告诉我。

  下面的所有例子都经过实际测试,你可以说它写得不够OO,不够plugable,但是它的确是可以参考的。自从有了javamail,发垃圾邮件就方便多了。本文代码多说明少,这倒不是我偷懒,而是很多东西都涉及pop3等协议的规范,如果不了解这些规范的话,有的东西我实在不知道怎么跟你解释;如果了解的话,那我基本上就不用再解释。所以本着实用的原则就省略了,由兴趣的话自己去翻翻协议规范。

  废话少说,首先需要配置环境。需要的包是mail.jar和activation.jar。高版本的J2SDKEE自带。地址嘛,再java.sun.com上搜索一下,很容易找到。放到classpath中就KO。

一、邮件的发送

下面了弄个发邮件的HelloWorld,热热身:

  1. /*************
  2. Name:TextMailSender.java
  3. Author:Bromon
  4. Version:1.0
  5. Date:2004-4-26
  6. Note:发送email到bromon@163.com,需要安装SMTP服务器
  7. *************/
  8. packageorg.bromon.mail;
  9. importjavax.mail.*;
  10. importjavax.mail.internet.*;
  11. importjava.util.*;
  12. publicclassTextMailSender
  13. {
  14. publicstaticvoidmain(Stringargs[])
  15. {
  16. try
  17. {
  18. Propertiesprop=newProperties();
  19. //指定要使用的SMTP服务器为bromon2k
  20. prop.put("mail.smtp.host","bromon2k");
  21. SessionmailSession=Session.getDefaultInstance(prop);
  22. //发件人地址
  23. InternetAddressfrom=newInternetAddress("bromon@bromon2k");
  24. //收件人地址
  25. InternetAddressto=newInternetAddress("bromon@163.com");
  26. MimeMessagemsg=newMimeMessage(mailSession);
  27. msg.setFrom(from);
  28. msg.addRecipient(javax.mail.Message.RecipientType.TO,to);
  29. //发信日期
  30. msg.setSentDate(newjava.util.Date());
  31. //title
  32. msg.setSubject("你好");
  33. //邮件正文
  34. msg.setText("hello,bromon");
  35. Transport.send(msg);
  36. }catch(Exceptione)
  37. {
  38. System.out.println(e);
  39. }
  40. }
  41. }


  程序很简单,但是它是不能运行的(倒)。除非你的机器上安装了一个SMTP服务器,而且你的机器还叫做bromon2k。写这么一段不能执行的程序不是为了找打,而是让各位对javamail有个基本印象,我就懒得改了。下面演示的是如何通过163、sohu等email服务商提供的免费邮箱来发邮件,基本操作和上面的一样,只是多一个SMTP验证而已:

  1. /*
  2. *Createdon2004-4-26
  3. */
  4. packageorg.bromon.mail;
  5. importjavax.mail.*;
  6. importjava.util.*;
  7. importjavax.mail.internet.*;
  8. /**
  9. *@authorBromon
  10. */
  11. publicclassSenderWithSMTPVer
  12. {
  13. Stringhost="";
  14. Stringuser="";
  15. Stringpassword="";
  16. publicvoidsetHost(Stringhost)
  17. {
  18. this.host=host;
  19. }
  20. publicvoidsetAccount(Stringuser,Stringpassword)
  21. {
  22. this.user=user;
  23. this.password=password;
  24. }
  25. publicvoidsend(Stringfrom,Stringto,Stringsubject,Stringcontent)
  26. {
  27. Propertiesprops=newProperties();
  28. props.put("mail.smtp.host",host);//指定SMTP服务器
  29. props.put("mail.smtp.auth","true");//指定是否需要SMTP验证
  30. try
  31. {
  32. SessionmailSession=Session.getDefaultInstance(props);
  33. mailSession.setDebug(true);//是否在控制台显示debug信息
  34. Messagemessage=newMimeMessage(mailSession);
  35. message.setFrom(newInternetAddress(from));//发件人
  36. message.addRecipient(Message.RecipientType.TO,newInternetAddress(to));//收件人
  37. message.setSubject(subject);//邮件主题
  38. message.setText(content);//邮件内容
  39. message.saveChanges();
  40. Transporttransport=mailSession.getTransport("smtp");
  41. transport.connect(host,user,password);
  42. transport.sendMessage(message,message.getAllRecipients());
  43. transport.close();
  44. }catch(Exceptione)
  45. {
  46. System.out.println(e);
  47. }
  48. }
  49. publicstaticvoidmain(Stringargs[])
  50. {
  51. SenderWithSMTPVersm=newSenderWithSMTPVer();
  52. sm.setHost("smtp.163.com");//指定要使用的邮件服务器
  53. sm.setAccount("abc","123");//指定帐号和密码
  54. /*
  55. *@paramString发件人的地址
  56. *@paramString收件人地址
  57. *@paramString邮件标题
  58. *@paramString邮件正文
  59. */
  60. sm.send("abc@163.com","bromon@163.com","标题","内容");
  61. }
  62. }


这段程序好像也不需要解释了吧,把SMTP地址、帐号、密码等配置信息写到Properties里面,Java里面很多API都需要这么干,比如再程序中加入对代理服务器的支持等。

上面的程序修改一下服务器地址、帐号、密码就可以使用,非常简单。

如何发送一个HTML格式的Email呢?也很简单,再邮件正文中写入HTML代码,然后指定邮件的ContentType就OK,下面只给出关键代码:

  1. ………
  2. MimeMessagemsg=newMimeMessage(mailSession);
  3. msg.setContent(content,"text/html");
  4. msg.setText(“<html><body><h1>下面的,你们好吗?</body></html>”);
  5. ………


下面是发送带有附件的email,稍微复杂一点,而且和前面的程序有一些不同,请仔细一点,同时需要一点IO的知识。相同的代码就不在列出,只写关键部分,谁都想偷懒不是?

  1. importjavax.mail.*;
  2. importjavax.mail.internet.*;
  3. importjavax.activation.*;
  4. importjava.util.*;
  5. ……….
  6. MimeMessagemsg=newMimeMessage(mailSession);
  7. msg.setSentDate(newDate());
  8. msg.setSubject("hello");
  9. MimeBodyParttextBodyPart=newMimeBodyPart();
  10. textBodyPart.setText(“邮件正文”);
  11. MimeBodyPartfileBodyPart=newMimeBodyPart();
  12. FileDataSourcefds=newFileDataSource("GIS.rar");//要发送的附件
  13. fileBodyPart.setDataHandler(newDataHandler(fds));
  14. fileBodyPart.setFileName(fds.getName());
  15. Multipartcontainer=newMimeMultipart();
  16. container.addBodyPart(textBodyPart);
  17. container.addBodyPart(fileBodyPart);
  18. msg.setContent(container);
  19. Transport.send(msg);
  20. …………
http://www.huihoo.com/java/javamail/javamail_faq.html#free






很多朋友都使用过JavaMail进行邮件发送,在邮件正文中的乱码容易解决。但邮件主题的乱码无论怎样转码总是显示一堆乱码。到底应该怎么处理呢?

JavaMail中的邮件主题需要进行BASE64编码,格式形如:
=?GB2312?B?xPq1xMPcwuvS0b6t1tjWw6Osx+u+ob/stcfCvKOssqLQ3rjEw9zC66Oh?=
所以,直接使用msg.setSubject("中文主题"),或者msg.setSubject("中文主题".getBytes("8859_1"), "GB2312"))都一样会出现乱码。在设置邮件主题前需要将主题字串的字节编码为BASE64格式,并添加编码头,示例代码如下:

sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder(); msg.setSubject("=?GB2312?B?"+enc.encode(subject.getBytes())+"?=");

怎么样,现在中文可以正常显示了吧。

原文转自Java中文站
分享到:
评论

相关推荐

    scrapy练习 获取喜欢的书籍

    主要是根据网上大神做的 项目一 https://zhuanlan.zhihu.com/p/687522335

    基于PyTorch的Embedding和LSTM的自动写诗实验.zip

    基于PyTorch的Embedding和LSTM的自动写诗实验LSTM (Long Short-Term Memory) 是一种特殊的循环神经网络(RNN)架构,用于处理具有长期依赖关系的序列数据。传统的RNN在处理长序列时往往会遇到梯度消失或梯度爆炸的问题,导致无法有效地捕捉长期依赖。LSTM通过引入门控机制(Gating Mechanism)和记忆单元(Memory Cell)来克服这些问题。 以下是LSTM的基本结构和主要组件: 记忆单元(Memory Cell):记忆单元是LSTM的核心,用于存储长期信息。它像一个传送带一样,在整个链上运行,只有一些小的线性交互。信息很容易地在其上保持不变。 输入门(Input Gate):输入门决定了哪些新的信息会被加入到记忆单元中。它由当前时刻的输入和上一时刻的隐藏状态共同决定。 遗忘门(Forget Gate):遗忘门决定了哪些信息会从记忆单元中被丢弃或遗忘。它也由当前时刻的输入和上一时刻的隐藏状态共同决定。 输出门(Output Gate):输出门决定了哪些信息会从记忆单元中输出到当前时刻的隐藏状态中。同样地,它也由当前时刻的输入和上一时刻的隐藏状态共同决定。 LSTM的计算过程可以大致描述为: 通过遗忘门决定从记忆单元中丢弃哪些信息。 通过输入门决定哪些新的信息会被加入到记忆单元中。 更新记忆单元的状态。 通过输出门决定哪些信息会从记忆单元中输出到当前时刻的隐藏状态中。 由于LSTM能够有效地处理长期依赖关系,它在许多序列建模任务中都取得了很好的效果,如语音识别、文本生成、机器翻译、时序预测等。

    基于Java的云计算平台设计源码

    云计算平台设计源码:该项目基于Java开发,包含126个文件,主要使用Java、JavaScript、HTML和CSS语言。该项目是一个云计算平台,旨在为用户提供一个高效、灵活的云计算服务,包括资源管理、虚拟化技术、分布式存储等功能,以满足不同用户的计算和存储需求。

    grpcio-1.41.0-cp38-cp38-linux_armv7l.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    grpcio-1.44.0-cp310-cp310-linux_armv7l.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    基于MATLAB实现的手写数字的识别效率,用卷积神经网络算法来实现,能够显现百分之九十以上的识别率+使用说明文档

    CSDN IT狂飙上传的代码均可运行,功能ok的情况下才上传的,直接替换数据即可使用,小白也能轻松上手 【资源说明】 基于MATLAB实现的这个代码主要是研究手写数字的识别效率,用卷积神经网络算法来实现,用的是官方手写字体数据,能够显现百分之九十以上的识别率+使用说明文档 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2020b;若运行有误,根据提示GPT修改;若不会,私信博主(问题描述要详细); 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可后台私信博主; 4.1 期刊或参考文献复现 4.2 Matlab程序定制 4.3 科研合作 功率谱估计: 故障诊断分析: 雷达通信:雷达LFM、MIMO、成像、定位、干扰、检测、信号分析、脉冲压缩 滤波估计:SOC估计 目标定位:WSN定位、滤波跟踪、目标定位 生物电信号:肌电信号EMG、脑电信号EEG、心电信号ECG 通信系统:DOA估计、编码译码、变分模态分解、管道泄漏、滤波器、数字信号处理+传输+分析+去噪、数字信号调制、误码率、信号估计、DTMF、信号检测识别融合、LEACH协议、信号检测、水声通信 5、欢迎下载,沟通交流,互相学习,共同进步!

    大学生毕业答辨ppt免费模板【不要积分】下载可编辑可用(110).zip

    大学生毕业答辨ppt免费模板【不要积分】下载可编辑可用(110).zip

    基于LSTM+CNN的自然语言处理,基于单维LSTM、多维LSTM时序预测算法和多元线性回归算法的预测模型.zip

    基于LSTM+CNN的自然语言处理,基于单维LSTM、多维LSTM时序预测算法和多元线性回归算法的预测模型LSTM (Long Short-Term Memory) 是一种特殊的循环神经网络(RNN)架构,用于处理具有长期依赖关系的序列数据。传统的RNN在处理长序列时往往会遇到梯度消失或梯度爆炸的问题,导致无法有效地捕捉长期依赖。LSTM通过引入门控机制(Gating Mechanism)和记忆单元(Memory Cell)来克服这些问题。 以下是LSTM的基本结构和主要组件: 记忆单元(Memory Cell):记忆单元是LSTM的核心,用于存储长期信息。它像一个传送带一样,在整个链上运行,只有一些小的线性交互。信息很容易地在其上保持不变。 输入门(Input Gate):输入门决定了哪些新的信息会被加入到记忆单元中。它由当前时刻的输入和上一时刻的隐藏状态共同决定。 遗忘门(Forget Gate):遗忘门决定了哪些信息会从记忆单元中被丢弃或遗忘。它也由当前时刻的输入和上一时刻的隐藏状态共同决定。 输出门(Output Gate):输出门决定了哪些信息会从记忆单元中输出到当前时刻的隐藏状态中。同样地,它也由当前时刻的输入和上一时刻的隐藏状态共同决定。 LSTM的计算过程可以大致描述为: 通过遗忘门决定从记忆单元中丢弃哪些信息。 通过输入门决定哪些新的信息会被加入到记忆单元中。 更新记忆单元的状态。 通过输出门决定哪些信息会从记忆单元中输出到当前时刻的隐藏状态中。 由于LSTM能够有效地处理长期依赖关系,它在许多序列建模任务中都取得了很好的效果,如语音识别、文本生成、机器翻译、时序预测等。

    基于MATLAB实现的自适应稳健波束形成对角加载算法,其与输入信噪比的关系+使用说明文档.zip

    CSDN IT狂飙上传的代码均可运行,功能ok的情况下才上传的,直接替换数据即可使用,小白也能轻松上手 【资源说明】 基于MATLAB实现的自适应稳健波束形成对角加载算法,其与输入信噪比的关系+使用说明文档.zip 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2020b;若运行有误,根据提示GPT修改;若不会,私信博主(问题描述要详细); 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可后台私信博主; 4.1 期刊或参考文献复现 4.2 Matlab程序定制 4.3 科研合作 功率谱估计: 故障诊断分析: 雷达通信:雷达LFM、MIMO、成像、定位、干扰、检测、信号分析、脉冲压缩 滤波估计:SOC估计 目标定位:WSN定位、滤波跟踪、目标定位 生物电信号:肌电信号EMG、脑电信号EEG、心电信号ECG 通信系统:DOA估计、编码译码、变分模态分解、管道泄漏、滤波器、数字信号处理+传输+分析+去噪、数字信号调制、误码率、信号估计、DTMF、信号检测识别融合、LEACH协议、信号检测、水声通信 5、欢迎下载,沟通交流,互相学习,共同进步!

    Java_Springstartupanalyzer生成一个交互式的spring应用程序启动报告,让您了解是什么因素导.zip

    Java_Springstartupanalyzer生成一个交互式的spring应用程序启动报告,让您了解是什么因素导

    基于MATLAB实现的LTE链路层仿真程序,根据LTE标准协议实现的,很容易看懂+使用说明文档.rar

    CSDN IT狂飙上传的代码均可运行,功能ok的情况下才上传的,直接替换数据即可使用,小白也能轻松上手 【资源说明】 基于MATLAB实现的LTE链路层仿真程序,根据LTE标准协议实现的,很容易看懂+使用说明文档.rar 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2020b;若运行有误,根据提示GPT修改;若不会,私信博主(问题描述要详细); 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可后台私信博主; 4.1 期刊或参考文献复现 4.2 Matlab程序定制 4.3 科研合作 功率谱估计: 故障诊断分析: 雷达通信:雷达LFM、MIMO、成像、定位、干扰、检测、信号分析、脉冲压缩 滤波估计:SOC估计 目标定位:WSN定位、滤波跟踪、目标定位 生物电信号:肌电信号EMG、脑电信号EEG、心电信号ECG 通信系统:DOA估计、编码译码、变分模态分解、管道泄漏、滤波器、数字信号处理+传输+分析+去噪、数字信号调制、误码率、信号估计、DTMF、信号检测识别融合、LEACH协议、信号检测、水声通信 5、欢迎下载,沟通交流,互相学习,共同进步!

    中国轨道交通连接器行业市场规模测算逻辑模型 头豹词条报告系列-14页.pdf.zip

    中国轨道交通连接器行业市场规模测算逻辑模型 头豹词条报告系列-14页.pdf.zip

    重点白酒品牌价格跟踪飞天整箱散瓶微跌梦之蓝企稳回升-12页.pdf.zip

    重点白酒品牌价格跟踪飞天整箱散瓶微跌梦之蓝企稳回升-12页.pdf.zip

    grpcio-1.47.0-cp36-cp36m-linux_armv7l.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    有色能源金属行业周报本周锂盐价格继续下跌锂价企稳关键在于下游需求-25页.pdf.zip

    有色能源金属行业周报本周锂盐价格继续下跌锂价企稳关键在于下游需求-25页.pdf.zip

    有色基本金属行业周报美失业率增长而薪资增速放缓令加息有望暂停消费端发力或将带动铜铝价格-19页.pdf.zip

    有色基本金属行业周报美失业率增长而薪资增速放缓令加息有望暂停消费端发力或将带动铜铝价格-19页.pdf

    grpcio-1.48.2-cp310-cp310-manylinux_2_17_aarch64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    203365707854574CDR22和23和2024通用教程.zip

    203365707854574CDR22和23和2024通用教程.zip

    堆排序 Java代码示例

    附件是堆排序Java代码示例,文件绿色安全,请大家放心下载,仅供交流学习使用,无任何商业目的! 堆排序是一种高效的比较类排序算法,它利用了二叉堆的数据结构来实现排序。堆排序可以分为两个主要步骤:建堆(将无序的元素构建成一个堆)和排序(利用堆的性质进行排序)。 代码首先定义了一个HeapSort类,其中包含了sort方法用于执行堆排序,heapify方法用于维护堆的性质。main方法用于测试堆排序算法,它创建了一个整数数组并调用sort方法对其进行排序,最后打印出排序后的数组。

    USB转TTL CH340驱动程序win7 蓝德控制器线刷驱动

    USB转TTL CH340驱动程序win7 蓝德控制器线刷驱动

Global site tag (gtag.js) - Google Analytics