急求一个java发邮件程序!
首先我去javasuncom下载了一个javamailapi12,现在最新版本13了。其实这个api 是一些类库集合。解压后,找到mailjar加入你的classpath中即可,还有其他一些jar,一般用户都用不着。接着,要去下载一个 JavaBeans(tm)Activation Framework Standard Extension
简称JAF的冬冬,将 activationjar加入classpath。主要是用到里面的类javaxactivation。JAF是sun的一个standard extension。100% Pure Java (大家都爱这末说,~_~)可以看看他的Specification(我也没看完)。
尽管java中有邮件发送接受类,但用Javamailapi更方便。我差点误入歧途。我主要讲讲带附件的邮件发送。假如专心看,在 Javamailapi中的demo中有一个sendfilejava的Example。假如您看过那个了,以下的就不用看了,因为这个比它的简单,没有输入任何参数。
import javaio;
import javautil;
import javaxmail;
import javaxmailinternet;
import javaxactivation;
//Warning: 以下内容是必须往里面套的,都是封装好的东西,过多的理由我也说出上,高手补充。
public class SendAttachment
{
public static void main(String[] args)
{
try
{
// 创建 properties ,里面包含了发送邮件服务器的地址。
Properties mailProps = new Properties();
mailPropsput("mailsmtphost", "192001"); //"mailsmtphost"随便叫啥都行,"192001"必须是真实可用的。
// 创建 session
Session mailSession = SessiongetDefaultInstance(mailProps);
// 创建 邮件的message,message对象包含了邮件众多有的部件,都是封装成了set方法去设置的
MimeMessage message = new MimeMessage(mailSession);
// 设置发信人
messagesetFrom(new InternetAddress(
"chqn@cmmailcom"));
//收信人
messagesetRecipient(MessageRecipientTypeTO,
new InternetAddress("chqn@cmmailcom"));
// 邮件标题
messagesetSubject("I love you"); //haha,恐吓人
// 创建 Mimemultipart,这是包含多个附件是必须创建的。假如只有一个内容,没有附件,可以直接用messagesetText(String str)
//去写信的内容,比较方便。附件等于是要创建多个内容,往下看更清楚。
MimeMultipart multi = new MimeMultipart();
// 创建 BodyPart,主要作用是将以后创建的n个内容加入MimeMultipart也就是可以发n个附件。我这里有2个BodyPart
BodyPart textBodyPart = new MimeBodyPart(); //第一个BodyPart主要写一些一般的信件内容。
textBodyPartsetText("详情见附件");
// 压入第一个BodyPart到MimeMultipart对象中。
multiaddBodyPart(textBodyPart);
// 创建第二个BodyPart,是一个FileDAtaSource
FileDataSource fds = new FileDataSource("c:\myattachmenttxt"); //必须存在的文档,否则throw异常。
BodyPart fileBodyPart = new MimeBodyPart(); //第二个BodyPart
fileBodyPartsetDataHandler(new DataHandler(fds)); //字符流形式装入文件
fileBodyPartsetFileName("reportxls"); //设置文件名,可以不是原来的文件名。
/
以下是我用另一种方式写入附件,但不成功,附件总是0K字节。请高手点解,以上的方式我是参照demo的。
FileInputStream in = new FileInputSteam("c:\myattachmenttxt");
BodyPart fileBodyPart = new MimeBodyPart(in);
fileBodyPartsetFileName("reportxls"); //奶奶的折腾我2天,搞不定。
/
//不讲了,同第一个BodyPart
multiaddBodyPart(fileBodyPart);
// MimeMultPart作为Content加入message
messagesetContent(multi);
// 所有以上的工作必须保存。
messagesaveChanges();
// 发送,利用Transport类,它是SMTP的邮件发送协议,
Transportsend(message);
}
catch (Exception exc)
{
excprintStackTrace();
}
}
}
java mail调用outlook的方法例子
1 将邮件写入到文件的代码
msgsaveChanges();
File f = new File("d:/testeml");
msgwriteTo(new FileOutputStream(f));
2 调用outlook的代码
Process p = RuntimegetRuntime()exec("cmd /C start msimnexe /eml:d:/testeml");
3 完整的代码如下
package codejdkmail;
import javaioFile;
import javaioFileNotFoundException;
import javaioFileOutputStream;
import javaioIOException;
import javautilDate;
import javautilEnumeration;
import javautilHashMap;
import javautilProperties;
import javautilVector;
import javaxactivationDataHandler;
import javaxactivationFileDataSource;
import javaxmailAddress;
import javaxmailAuthenticationFailedException;
import javaxmailMessage;
import javaxmailMessagingException;
import javaxmailMultipart;
import javaxmailSession;
import javaxmailTransport;
import javaxmailinternetInternetAddress;
import javaxmailinternetMimeBodyPart;
import javaxmailinternetMimeMessage;
import javaxmailinternetMimeMultipart;
import javaxmailinternetMimeUtility;
public class EmailWriteToFile {
// 定义发件人、收件人、SMTP服务器、用户名、密码、主题、内容等
private String displayName;
private String to;
private String from;
private String smtpServer;
private String username;
private String password;
private String subject;
private String content;
private boolean ifAuth; // 服务器是否要身份认证
private String filename = "";
private Vector file = new Vector(); // 用于保存发送附件的文件名的集合
private String contentType = "text/html";
private String charset = "utf-8";
public void addFile(String filename) {
fileadd(filename);
}
public String getContentType() {
return contentType;
}
public void setContentType(String contentType) {
thiscontentType = contentType;
}
public String getCharset() {
return charset;
}
public void setCharset(String charset) {
thischarset = charset;
}
/
设置SMTP服务器地址
/
public void setSmtpServer(String smtpServer) {
thissmtpServer = smtpServer;
}
/
设置发件人的地址
/
public void setFrom(String from) {
thisfrom = from;
}
/
设置显示的名称
/
public void setDisplayName(String displayName) {
thisdisplayName = displayName;
}
/
设置服务器是否需要身份认证
/
public void setIfAuth(boolean ifAuth) {
thisifAuth = ifAuth;
}
/
设置E-mail用户名
/
public void setUserName(String username) {
thisusername = username;
}
/
设置E-mail密码
/
public void setPassword(String password) {
thispassword = password;
}
/
设置接收者
/
public void setTo(String to) {
thisto = to;
}
/
设置主题
/
public void setSubject(String subject) {
thissubject = subject;
}
/
设置主体内容
/
public void setContent(String content) {
thiscontent = content;
}
public EmailWriteToFile() {
}
private int port = 25;
public int getPort() {
return port;
}
public void setPort(int port) {
thisport = port;
}
/
发送邮件
@throws IOException
@throws FileNotFoundException
/
public boolean send() throws FileNotFoundException, IOException {
HashMap<String, String> map = new HashMap<String, String>();
mapput("state", "success");
String message = "邮件发送成功!";
Session session = null;
Properties props = SystemgetProperties();
propsput("mailsmtphost", smtpServer);
propsput("mailsmtpport", port);
try {
propsput("mailsmtpauth", "false");
session = SessiongetDefaultInstance(props, null);
sessionsetDebug(false);
Transport trans = null;
Message msg = new MimeMessage(session);
try {
Address from_address = new InternetAddress(from, displayName);
msgsetFrom(from_address);
} catch (javaioUnsupportedEncodingException e) {
eprintStackTrace();
}
InternetAddress[] address = { new InternetAddress(to) };
msgsetRecipients(MessageRecipientTypeTO, address);
msgsetSubject(subject);
Multipart mp = new MimeMultipart();
MimeBodyPart mbp = new MimeBodyPart();
mbpsetContent(contenttoString(), getContentType() + ";charset=" + getCharset());
mpaddBodyPart(mbp);
if (!fileisEmpty()) {// 有附件
Enumeration efile = fileelements();
while (efilehasMoreElements()) {
mbp = new MimeBodyPart();
filename = efilenextElement()toString(); // 选择出每一个附件名
FileDataSource fds = new FileDataSource(filename); // 得到数据源
mbpsetDataHandler(new DataHandler(fds)); // 得到附件本身并至入BodyPart
mbpsetFileName(MimeUtilityencodeText(fdsgetName(), getCharset(),"B")); // 得到文件名同样至入BodyPart
mpaddBodyPart(mbp);
}
fileremoveAllElements();
}
msgsetContent(mp); // Multipart加入到信件
msgsetSentDate(new Date()); // 设置信件头的发送日期
// 发送信件
msgsaveChanges();
File f = new File("d:/testeml");
msgwriteTo(new FileOutputStream(f));
} catch (AuthenticationFailedException e) {
mapput("state", "failed");
message = "邮件发送失败!错误原因: " + "身份验证错误!";
eprintStackTrace();
return false;
} catch (MessagingException e) {
message = "邮件发送失败!错误原因: " + egetMessage();
mapput("state", "failed");
eprintStackTrace();
Exception ex = null;
if ((ex = egetNextException()) != null) {
Systemoutprintln(extoString());
exprintStackTrace();
}
return false;
}
// Systemoutprintln(" 提示信息:"+message);
mapput("message", message);
return true;
}
public static void main(String[] args) throws FileNotFoundException, IOException, InterruptedException {
EmailWriteToFile o = new EmailWriteToFile();
osetSmtpServer("localhost");
osetFrom("from@fromcom");
osetDisplayName("TOM");
osetTo("to@tocom");
osetSubject("Test Subject");
osetContent("Test Content");
osetCharset("GBK");
oaddFile("e:/读我txt");
osend();
Process p = RuntimegetRuntime()exec("cmd /C start msimnexe /eml:d:/testeml");
}
}
小公司用javamail就行了 大公司看你的操作系统 要是Linux的话推荐用postfix Windows的话推荐用exchange。
附上exchange源码要使用的话需要加包
import javaioUnsupportedEncodingException;
import javautilDate;
import javautilProperties;
import javaxmailBodyPart;
import javaxmailMessage;
import javaxmailMessagingException;
import javaxmailMultipart;
import javaxmailSession;
import javaxmailTransport;
import javaxmailinternetInternetAddress;
import javaxmailinternetMimeBodyPart;
import javaxmailinternetMimeMessage;
import javaxmailinternetMimeMultipart;
public class Mailer {
private String host;
private String auth;
private String username;
private String domainUser;
private String password;
public boolean send(String[] to, String[] cc, String[] bcc, String subject, String content) throws MessagingException {
Properties props = new Properties();
propsput("mailsmtphost", host);
propsput("mailsmtpauth", auth);
Session s = SessiongetInstance(props);
//ssetDebug(true);
MimeMessage message = new MimeMessage(s);
InternetAddress from = new InternetAddress(username);
messagesetFrom(from);
//eprintStackTrace();
//messagesetFrom(from);
InternetAddress[] Toaddress = new InternetAddress[tolength];
for (int i = 0; i < tolength; i++)
Toaddress[i] = new InternetAddress(to[i]);
messagesetRecipients(MessageRecipientTypeTO, Toaddress);
if (cc != null) {
InternetAddress[] Ccaddress = new InternetAddress[cclength];
for (int i = 0; i < cclength; i++)
Ccaddress[i] = new InternetAddress(cc[i]);
messagesetRecipients(MessageRecipientTypeCC, Ccaddress);
}
if (bcc != null) {
InternetAddress[] Bccaddress = new InternetAddress[bcclength];
for (int i = 0; i < bcclength; i++)
Bccaddress[i] = new InternetAddress(bcc[i]);
messagesetRecipients(MessageRecipientTypeBCC, Bccaddress);
}
messagesetSubject(subject);
messagesetSentDate(new Date());
BodyPart mdp = new MimeBodyPart();
mdpsetContent(content, "text/html;charset=utf-8");
Multipart mm = new MimeMultipart();
mmaddBodyPart(mdp);
messagesetContent(mm);
messagesaveChanges();
Transport transport = sgetTransport("smtp");
transportconnect(host, (null == domainUser) username : domainUser, password);
transportsendMessage(message, messagegetAllRecipients());
transportclose();
return true;
}
public Mailer(String host, String auth, String domainUser, String username, String password) {
super();
thishost = host;
thisauth = auth;
thisdomainUser = domainUser;
thisusername = username;
thispassword = password;
}
public static void main(String[]args){
try {
new Mailer("你的ip", "true", "域名\\域用户", "邮件", "密码")send(new String[] { "281683400@qqcom" }, null, null, "demo_title", "<h3>test</h3>");
} catch (MessagingException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
}
String to="test1@qqcom,test2@gmailcom,test3@163com";
InternetAddress[] toList = new InternetAddress()parse(to);
msgsetRecipients(MessageRecipientTypeTO, toList);
Transportsend(msg);
或者直连邮件网关,并由邮件网关直接转发至收件箱所在的服务器,因此发送速度是基本不受限的。如果没有邮件网关,同时又不想自己完成相关功能,那么建议不要只让一台邮件服务器转发你的邮件,而是多连几台,将自己的邮件平均分配到每台邮件服务器上,这样就不会由于发送过多,而被拒了。
至于处理能力,可以提几点关于提高发送能力的建议
1.SMTP协议是支持长连接的协议,同时mailjar实现了SMTP协议的连接、邮件发送及连接断开,至于对连接的维护没有涉及;同时Spring中的邮件支持是通过封装mailjar实现的,但只提供了单笔发送和批量发送(均为短连接)。
2.如果使用长连接,建议再引入连接池,那样既便于维护连接,又可以提高连接的使用率。
0条评论