关于一个 send E-mail 问题

package com.oa.modules.personnel.user.domain;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Hashtable;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;

public class MailSend {
 
 
 public static String protocol = "smtp";
 
 private String from = "hellojim@sina.com";  //发收人
 private String to;
 private String subject = "图文并茂的E-mail发送测试";
 private String body = "图文并茂的E-mail发送测试<a href='http://hellojim.iteye.com'>Welcome access my blog my name is zhangxiaojun</a><br>" +
      "<img src='cid:zxj'>";
 private String server = "smtp.sina.com.cn";
 
 public String getBody() {
  return body;
 }

 public void setBody(String body) {
  this.body = body;
 }

 public String getFrom() {
  return from;
 }

 public void setFrom(String from) {
  this.from = from;
 }

 public String getServer() {
  return server;
 }

 public void setServer(String server) {
  this.server = server;
 }

 public String getSubject() {
  return subject;
 }

 public void setSubject(String subject) {
  this.subject = subject;
 }

 public String getTo() {
  return to;
 }

 public void setTo(String to) {
  
  this.to = to;
 }

 public static void main(String[] args) throws Exception {
  
  
  
  
  MailSend sender = new MailSend();     //实例化一个 MailSend 对象
  sender.setTo("jim.zhang.js@gmail.com");  //设置一下收件人地址
  
  boolean flg = sender.sendMessage(sender); //调用 sendMessage 就可以发送 E-mail
  
  if(flg == true) {
   System.out.println("哈哈...邮件发送成功");
  } else {
   System.out.println("呵呵...邮件发送失败");
  }
  
  
 }
 
 //此方法根据传入的 session 创建一个E-mail 并返回
 public MimeMessage createMessage(Session session,MailSend sender) throws Exception {
  
  //创建一个邮件对象
  MimeMessage message = new MimeMessage(session);
  //设置 邮件 的发件人
  message.setFrom(new InternetAddress(sender.from));
  //设置 邮件 的收件人,及发送方法
  message.setRecipients(Message.RecipientType.TO,InternetAddress.parse(sender.to));
  //设置 邮件 的主题
  message.setSubject(sender.subject);
  
  MimeMultipart multipart = new MimeMultipart("related");
  //创建一个邮件主体的文字部分
  MimeBodyPart htmlBodyPart = new MimeBodyPart();
  htmlBodyPart.setContent(body,"text/html;charset=gb2312");
  multipart.addBodyPart(htmlBodyPart);
  //创建一个邮件主体的图片部分
  MimeBodyPart gifBodyPart = new MimeBodyPart();
  FileDataSource fds = new FileDataSource("d:\\zxj.gif");
  gifBodyPart.setDataHandler(new DataHandler(fds));
  gifBodyPart.setContentID("zxj");
  multipart.addBodyPart(gifBodyPart);
  
  //设置 邮件 的主体部分(multipart 对象中包含了文字和图片两部分)
  message.setContent(multipart);
  //保存邮件这一步骤不能少
  message.saveChanges();
  
  return message;
 }
 
 //根据 收件人地址,发送 E-mail 如果发送成功返回 true ,否则返回 false
 
 public boolean sendMessage(MailSend sender) {
  
  Properties props = new Properties();
  props.setProperty("mail.transport.protocol",MailSend.protocol);
  props.setProperty("mail.smtp.auth","true");
  props.setProperty("mail.host",sender.server);
  
  MyAuthenticator myAuthenticator = new MyAuthenticator();
  Session session = Session.getInstance(props,myAuthenticator);
  session.setDebug(true);
  try {
   MimeMessage message = sender.createMessage(session,sender);
   Transport transport = session.getTransport();
   transport.connect();
   transport.sendMessage(message,message.getRecipients(Message.RecipientType.TO));
   transport.close();
  }catch(Exception ex) {
   ex.printStackTrace();
   System.out.println("邮件发送失败!");
   return false;
  }
  return true;
 }
 
 
 //根据 发送方 e-mail 地址中的 @ 后面部分,获得 该 e-mail 地址所在的 smtp 服务器
 //目前这个方法没有调用,好象得到的 MX 用在以上程序中有些问题
 public static String getSmtpServer(String domain,String dnsServer) throws NamingException {
  
  Hashtable env = new Hashtable();
  env.put(Context.INITIAL_CONTEXT_FACTORY,
      "com.sun.jndi.dns.DnsContextFactory");
  env.put(Context.PROVIDER_URL,"dns:" + dnsServer);
  
  DirContext ctx = new InitialDirContext(env);
  Attributes attrsAll = ctx.getAttributes(domain);
  //Attributes attrsMx = ctx.getAttributes(domain,new String[]{"MX"});
  
  Attribute attrMx = attrsAll.get("MX");
  String firstValue = (String)attrMx.get();
  
  return (firstValue.substring(firstValue.indexOf(" ") + 1));
 }
 
}

针对上面的这个类文件,我有一个地方想请教大家一下,就是

private String server = "smtp.sina.com.cn";  这句话不就是发送人的E-mail所属于的那个邮件服务器的地址吗?那么为什么我调用 getSmtpServer("sina.com",null); 这个方法(此方法的作用是得到MX记录啊) 得到的值是 freemx4.sinamail.sina.com.cn. 然后用此值给 server  变量 后,发送时就发送不成功,这是为什么???这地方我不一定以后就用 sina  E-mail 去发邮件啊,也可能用 126 的,或 gmail 的,那么 server 的值又应给多少呢?或者从那里得到呢?请大家指教

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 C++ 程序示例,用于发送 E-Mail,利用 SMTP 协议、Base64 编码和 MIME 格式。 ```c++ #include <iostream> #include <string> #include <cstdlib> #include <cstring> #include <sstream> #include <fstream> #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") using namespace std; // 定义 Base64 编码的转换表 const char base64_table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; // Base64 编码函数 string base64_encode(const unsigned char* input, int length) { string output; int i = 0, j = 0; unsigned char char_array_3[3], char_array_4[4]; while (length--) { char_array_3[i++] = *(input++); if (i == 3) { char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); char_array_4[3] = char_array_3[2] & 0x3f; for (i = 0; (i < 4); i++) output += base64_table[char_array_4[i]]; i = 0; } } if (i) { for (j = i; j < 3; j++) char_array_3[j] = '\0'; char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); char_array_4[3] = char_array_3[2] & 0x3f; for (j = 0; (j < i + 1); j++) output += base64_table[char_array_4[j]]; while ((i++ < 3)) output += '='; } return output; } // MIME 格式 string create_mime(string from, string to, string subject, string content) { string mime; mime += "From: " + from + "\r\n"; mime += "To: " + to + "\r\n"; mime += "Subject: " + subject + "\r\n"; mime += "MIME-Version: 1.0\r\n"; mime += "Content-Type: text/plain; charset=utf-8\r\n"; mime += "Content-Transfer-Encoding: base64\r\n"; mime += "\r\n"; mime += base64_encode((const unsigned char*)content.c_str(), content.length()); mime += "\r\n.\r\n"; return mime; } // 发送邮件 bool send_mail(string server, string username, string password, string from, string to, string subject, string content) { // 创建连接 SOCKET sock; struct sockaddr_in serv_addr; sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(25); serv_addr.sin_addr.s_addr = inet_addr(server.c_str()); if (connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == SOCKET_ERROR) { cerr << "Connect error!" << endl; return false; } // 接收信息 char buffer[1024] = { 0 }; recv(sock, buffer, sizeof(buffer), 0); // 发送 HELO 命令 string helo = "HELO " + server + "\r\n"; send(sock, helo.c_str(), helo.length(), 0); recv(sock, buffer, sizeof(buffer), 0); // 发送 AUTH LOGIN 命令 string auth_login = "AUTH LOGIN\r\n"; send(sock, auth_login.c_str(), auth_login.length(), 0); recv(sock, buffer, sizeof(buffer), 0); // 发送用户名 string base64_username = base64_encode((const unsigned char*)username.c_str(), username.length()); send(sock, base64_username.c_str(), base64_username.length(), 0); send(sock, "\r\n", 2, 0); recv(sock, buffer, sizeof(buffer), 0); // 发送密码 string base64_password = base64_encode((const unsigned char*)password.c_str(), password.length()); send(sock, base64_password.c_str(), base64_password.length(), 0); send(sock, "\r\n", 2, 0); recv(sock, buffer, sizeof(buffer), 0); // 发送 MAIL FROM 命令 string mail_from = "MAIL FROM: <" + from + ">\r\n"; send(sock, mail_from.c_str(), mail_from.length(), 0); recv(sock, buffer, sizeof(buffer), 0); // 发送 RCPT TO 命令 string rcpt_to = "RCPT TO: <" + to + ">\r\n"; send(sock, rcpt_to.c_str(), rcpt_to.length(), 0); recv(sock, buffer, sizeof(buffer), 0); // 发送 DATA 命令 string data = "DATA\r\n"; send(sock, data.c_str(), data.length(), 0); recv(sock, buffer, sizeof(buffer), 0); // 发送邮件内容 string mime = create_mime(from, to, subject, content); send(sock, mime.c_str(), mime.length(), 0); recv(sock, buffer, sizeof(buffer), 0); // 发送 QUIT 命令 string quit = "QUIT\r\n"; send(sock, quit.c_str(), quit.length(), 0); recv(sock, buffer, sizeof(buffer), 0); // 关闭连接 closesocket(sock); return true; } int main() { // 设置发送邮件的参数 string server = "smtp.gmail.com"; string username = "your_username@gmail.com"; string password = "your_password"; string from = "your_username@gmail.com"; string to = "recipient@example.com"; string subject = "Test Mail"; string content = "Hello World!"; // 发送邮件 if (send_mail(server, username, password, from, to, subject, content)) { cout << "Mail sent successfully!" << endl; } else { cerr << "Failed to send mail!" << endl; } return 0; } ``` 请注意,在实际使用中,您需要根据您选择的邮件服务器和帐户来调整程序中的参数。此外,该程序仅适用于 Windows 平台。如果您需要在其他平台上运行,您需要对代码进行相应调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值