-
phpmailer 私密抄送_CI的Loader类导致使用phpmailer发送收件人和抄送人不断的增加
2020-12-23 09:01:28在一次使用群发邮件的功能时,引用了第三方的发送邮件的类,phpmailer,在使用时出现收件人和发件人在不断增加,然后就去了解了一下CI的loader源码使用phpmailer的方法/*** 发送邮件* @param $to* @param string $...为啥要介绍CI的loader?
在一次使用群发邮件的功能时,引用了第三方的发送邮件的类,phpmailer,在使用时出现收件人和发件人在不断增加,然后就去了解了一下CI的loader源码
使用phpmailer的方法
/**
* 发送邮件
* @param $to
* @param string $name
* @param $subject
* @param $content
* @param bool $bcc
* @param array $ccto
* @param string $reply_to
* @return bool
*/
function sendEmail($to, $name = '', $subject, $content, $bcc = FALSE, $ccto = array(), $reply_to='')
{
$CI = &get_instance();
$CI->load->add_package_path(APPPATH . 'third_party/phpmailer/');
$CI->load->library('phpmailer');
$CI->load->config('mail');
$CI->phpmailer->CharSet = $CI->config->item('charset'); // sets charset
$CI->phpmailer->AddReplyTo($reply_to, 'Synbio Technologies');
$CI->phpmailer->IsSMTP(); // telling the class to use SMTP
$CI->phpmailer->SMTPDebug = $CI->config->item('smtp_debug'); // enables SMTP debug information (for testing)
$CI->phpmailer->SMTPAuth = $CI->config->item('smtp_auth'); // enable SMTP authentication
$CI->phpmailer->SMTPSecure = $CI->config->item('smtp_secure'); // sets the prefix to the servier
$CI->phpmailer->Host = $CI->config->item('smtp_host'); // sets GMAIL as the SMTP server
$CI->phpmailer->Port = $CI->config->item('smtp_port'); // set the SMTP port for the GMAIL server
$CI->phpmailer->Username = $CI->config->item('smtp_username'); // GMAIL username
$CI->phpmailer->Password = $CI->config->item('smtp_password'); // GMAIL password
$CI->phpmailer->SetFrom($CI->config->item('smtp_username'), 'Synbio Technologies');
$CI->phpmailer->Subject = $subject;
$CI->phpmailer->MsgHTML($content);
if($ccto)
{
if ($bcc)
{
if(is_array($ccto)){
foreach ($ccto as $value){
$CI->phpmailer->AddBCC($value, $value);
}
}else{
$CI->phpmailer->AddBCC($ccto, $ccto);
}
}
else
{
if(is_array($ccto)){
foreach ($ccto as $value){
$CI->phpmailer->AddCC($value, $value);
}
}else{
$CI->phpmailer->AddCC($ccto, $ccto);
}
}
}
if ($bcc && empty($ccto)) {
if(is_array($to)){
foreach ($to as $key => $value){
$CI->phpmailer->AddBCC($value, (@$name[$key] ? @$name[$key] : $value));
}
}else{
$CI->phpmailer->AddBCC($to, ($name ? $name : $to));
}
} else {
if(is_array($to)){
foreach ($to as $key => $value){
$CI->phpmailer->AddAddress($value, (@$name[$key] ? @$name[$key] : $value));
}
}else{
$CI->phpmailer->AddAddress($to, ($name ? $name : $to));
}
}
// attachment
if(count($attachment) > 0)
{
foreach($attachment as $value)
{
$CI->phpmailer->AddAttachment($value);
}
}
if (!$CI->phpmailer->Send()) {
$CI->phpmailer->ClearAddresses();
$CI->phpmailer->ClearCCs();
return FALSE;
} else {
$CI->phpmailer->ClearAddresses();
$CI->phpmailer->ClearCCs();
return TRUE;
}
}
注意方法结尾部分的代码
$CI->phpmailer->ClearAddresses();
$CI->phpmailer->ClearCCs();
原来是没有这两行代码的,后面我在介绍这两行代码
了解对象在函数中的方式,是传值还是按引用?
这里我就不过多解释了,是引用方式
这里就解释了为什么上面代码群发邮件时会导致收件人和抄送人会增加的原因
$CI->phpmailer->AddAddress($to, ($name ? $name : $to));
$CI->phpmailer->AddCC($ccto, $ccto);
如何解决这个问题
首先我想到的是能不能再使用完phpmailer对象是,释放掉这个对象unset(CI->phpmailer),CI是单例模式,在加载完使用的类之后,使用属性的方式将加载的类作为CI的一个属性,在释放$CI->phpmailer这个属性之后,我就发现多次调用上面发送sendEmail的方法时会报错:
ERROR - 2020-01-07 02:08:45 --> Severity: Warning --> Creating default object from empty value
ERROR - 2020-01-07 02:08:45 --> Severity: error --> Exception: Call to undefined method stdClass::AddReplyTo()
这是上面原因呢?
这就讲到CI的loader类了,CI的loader在加载时使用的是include_once所以在加载一次之后不会重复加载,所以就不能讲phpmailer作为CI的属性再次添加到CI的超级对象中,所以就报错,我们来看下源码:
$CI = &get_instance();
$CI->load->add_package_path(APPPATH . 'third_party/phpmailer/');
$CI->load->library('phpmailer');
$CI->load->config('mail');
这是我上述的方法,看下CI的loader源码:
protected function _ci_load_library($class, $params = NULL, $object_name = NULL)
{
// Get the class name, and while we're at it trim any slashes.
// The directory path can be included as part of the class name,
// but we don't want a leading slash
$class = str_replace('.php', '', trim($class, '/'));
// Was the path included with the class name?
// We look for a slash to determine this
if (($last_slash = strrpos($class, '/')) !== FALSE)
{
// Extract the path
$subdir = substr($class, 0, ++$last_slash);
// Get the filename from the path
$class = substr($class, $last_slash);
}
else
{
$subdir = '';
}
$class = ucfirst($class);
// Is this a stock library? There are a few special conditions if so ...
if (file_exists(BASEPATH.'libraries/'.$subdir.$class.'.php'))
{
return $this->_ci_load_stock_library($class, $subdir, $params, $object_name);
}
// Let's search for the requested library file and load it.
foreach ($this->_ci_library_paths as $path)
{
// BASEPATH has already been checked for
if ($path === BASEPATH)
{
continue;
}
$filepath = $path.'libraries/'.$subdir.$class.'.php';
// Safety: Was the class already loaded by a previous call?
if (class_exists($class, FALSE))
{
// Before we deem this to be a duplicate request, let's see
// if a custom object name is being supplied. If so, we'll
// return a new instance of the object
if ($object_name !== NULL)
{
$CI =& get_instance();
if ( ! isset($CI->$object_name))
{
return $this->_ci_init_library($class, '', $params, $object_name);
}
}
log_message('debug', $class.' class already loaded. Second attempt ignored.');
return;
}
// Does the file exist? No? Bummer...
elseif ( ! file_exists($filepath))
{
continue;
}
include_once($filepath);
return $this->_ci_init_library($class, '', $params, $object_name);
}
// One last attempt. Maybe the library is in a subdirectory, but it wasn't specified?
if ($subdir === '')
{
return $this->_ci_load_library($class.'/'.$class, $params, $object_name);
}
// If we got this far we were unable to find the requested class.
log_message('error', 'Unable to load the requested class: '.$class);
show_error('Unable to load the requested class: '.$class);
}
代码中明确指定了include_once一次,在PHP程序中代码都是依次执行的,不管循环多少次,只要前面加载过后面就不会再次加载了。
如何解决发送邮件的收件人和抄送人增加的问题呢
其实在phpmailer中已经给我们方法了
public function ClearAddresses() {
foreach($this->to as $to) {
unset($this->all_recipients[strtolower($to[0])]);
}
$this->to = array();
}
public function ClearCCs() {
foreach($this->cc as $cc) {
unset($this->all_recipients[strtolower($cc[0])]);
}
$this->cc = array();
}
public function ClearBCCs() {
foreach($this->bcc as $bcc) {
unset($this->all_recipients[strtolower($bcc[0])]);
}
$this->bcc = array();
}
public function ClearReplyTos() {
$this->ReplyTo = array();
}
这几个方法在循环发送邮件的时候时候使用就不需要通过unset对象的方法来进行初始化了。所以在程序依次执行时,循环发送邮件调用phpmailer的方法是不需要释法phpmailer这个对象,通过使用他的方法进行收件人和抄送密送等初始化就可以了。
-
JavaMail 发送邮件,收件人为多人,抄送多人。其中包含收件人邮箱错误时的处理
2021-03-04 12:38:56收件人和抄送人可能为单个人,也可能为多个人。但是当收件人或抄送人中某一个邮箱的格式错误时,整个邮件发送就会出错停止发送。但我还需要给那些其余的人发邮件,该怎么办? 2.解决思路,当收件人邮箱错误时,可以...1.给客户做一个发邮件的功能。收件人和抄送人可能为单个人,也可能为多个人。但是当收件人或抄送人中某一个邮箱的格式错误时,整个邮件发送就会出错停止发送。但我还需要给那些其余的人发邮件,该怎么办?
2.解决思路,当收件人邮箱错误时,可以catch到异常,并从异常信息提取错误的邮箱,再把错误的邮箱从,收件人或抄送人中剔除,再次发送即可。
伪代码:
try{ 发送邮件 }catch(Exception e){ if(判断是否为邮件发送错误异常){ 获取错误的邮件,并从收件人或抄送人中剔除 再次发送邮件 } }
3.完整代码
@Override public void sendEmail(String main, String cc, IWorkItem weekly) throws Exception { List<String> sendTo1 = new ArrayList(Arrays.asList(main.split(","))); List<String> copyTo1 = new ArrayList(Arrays.asList(cc.split(","))); String mode = "client";//test / client try { // 创建一个配置文件并保存 Properties properties = new Properties(); if(mode.equals("test")) { properties.setProperty("mail.host", "smtp.qq.com"); }else { properties.setProperty("mail.host", "10.0.3.28"); } properties.setProperty("mail.transport.protocol", "smtp"); properties.setProperty("mail.smtp.auth", "true"); if(mode.equals("test")) { //QQ存在一个特性设置SSL加密 MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); properties.put("mail.smtp.ssl.enable", "true"); properties.put("mail.smtp.ssl.socketFactory", sf); } // 创建一个session对象 Session session = Session.getDefaultInstance(properties, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { if(mode.equals("test")) { return new PasswordAuthentication("569296263@qq.com", "asdasdasd"); }else { return new PasswordAuthentication("Polarion@bocfullertonbank.com", "!QAZ2wsx"); } } }); // 开启debug模式 session.setDebug(true); // 获取连接对象 Transport transport = session.getTransport(); // 连接服务器 if(mode.equals("test")) { transport.connect("smtp.qq.com", "569296263@qq.com", "fx"); }else { transport.connect("10.0.3.28", "Polarion@bocfullertonbank.com", "!QAZ2wsx"); } // 创建邮件对象 MimeMessage mimeMessage = new MimeMessage(session); // 邮件发送人 if(mode.equals("test")) { mimeMessage.setFrom(new InternetAddress("569296263@qq.com")); }else { mimeMessage.setFrom(new InternetAddress("Polarion@bocfullertonbank.com")); } // 邮件接收人 InternetAddress[] sendTo = InternetAddress.parse(main); mimeMessage.setRecipients(Message.RecipientType.TO, sendTo); LOG.error("sendTo====================================" + main); // 抄送 InternetAddress[] copyTo = InternetAddress.parse(cc); LOG.error("copyTo====================================" + cc); mimeMessage.setRecipients(Message.RecipientType.CC, copyTo); //邮件标题 String title = weekly.getTitle(); mimeMessage.setSubject(title + "_项目周报"); // 邮件内容 String content = getMailContent(weekly); if(mode.equals("test")) { mimeMessage.setContent(content,"text/html;charset=UTF-8"); LOG.error("content1====================================" + content); }else { mimeMessage.setContent(content,"text/html;charset=gb2312"); LOG.error("content2====================================" + content); } // 发送邮件 transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients()); // 关闭连接 transport.close(); } catch (Exception e) { if (e instanceof SendFailedException) { for(Address address: ((SendFailedException) e).getInvalidAddresses()){ LOG.error("错误信息邮箱====================================" + address.toString()); if(sendTo1.contains(address.toString())) { sendTo1.remove(address.toString()); } if(copyTo1.contains(address.toString())) { copyTo1.remove(address.toString()); } } try { // 创建一个配置文件并保存 Properties properties = new Properties(); if(mode.equals("test")) { properties.setProperty("mail.host", "smtp.qq.com"); }else { properties.setProperty("mail.host", "10.0.3.28"); } properties.setProperty("mail.transport.protocol", "smtp"); properties.setProperty("mail.smtp.auth", "true"); if(mode.equals("test")) { //QQ存在一个特性设置SSL加密 MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); properties.put("mail.smtp.ssl.enable", "true"); properties.put("mail.smtp.ssl.socketFactory", sf); } // 创建一个session对象 Session session = Session.getDefaultInstance(properties, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { if(mode.equals("test")) { return new PasswordAuthentication("569296263@qq.com", "foajwfjgwcihbbfa"); }else { return new PasswordAuthentication("Polarion@bocfullertonbank.com", "!QAZ2wsx"); } } }); // 开启debug模式 session.setDebug(true); // 获取连接对象 Transport transport = session.getTransport(); // 连接服务器 if(mode.equals("test")) { transport.connect("smtp.qq.com", "569296263@qq.com", "foajwfjgwcihbbfa"); }else { transport.connect("10.0.3.28", "Polarion@bocfullertonbank.com", "!QAZ2wsx"); } // 创建邮件对象 MimeMessage mimeMessage = new MimeMessage(session); // 邮件发送人 if(mode.equals("test")) { mimeMessage.setFrom(new InternetAddress("569296263@qq.com")); }else { mimeMessage.setFrom(new InternetAddress("Polarion@bocfullertonbank.com")); } String sendTo2 = ""; // 邮件接收人 for(String email : sendTo1) { sendTo2 += email + ","; } sendTo2 = sendTo2.substring(0,sendTo2.length()-1); String copyTo2 = ""; for(String email : copyTo1) { copyTo2 += email + ","; } copyTo2 = copyTo2.substring(0,copyTo2.length()-1); InternetAddress[] sendTo = InternetAddress.parse(sendTo2); mimeMessage.setRecipients(Message.RecipientType.TO, sendTo); LOG.error("sendTo2====================================" + sendTo2); // 抄送 InternetAddress[] copyTo = InternetAddress.parse(copyTo2); LOG.error("copyTo2====================================" + copyTo2); mimeMessage.setRecipients(Message.RecipientType.CC, copyTo); //邮件标题 String title = weekly.getTitle(); mimeMessage.setSubject(title + "_项目周报"); // 邮件内容 String content = getMailContent(weekly); if(mode.equals("test")) { mimeMessage.setContent(content,"text/html;charset=UTF-8"); }else { mimeMessage.setContent(content,"text/html;charset=gb2312"); } // 发送邮件 transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients()); // 关闭连接 transport.close(); }catch (Exception e1) { LOG.error("错误信息====================================" + e1.getMessage()); } } } }
-
IBM - “答复所有人”的邮件将包含发件人的名字在“收件人”和/或“抄送”里。...
2009-03-20 14:59:00http://www-01.ibm.com/support/docview.wss?uid=csc12bd63355c80567f3482573e3001081d4 转载于:https://www.cnblogs.com/JustOneJob/archive/2009/03/20/1417721.html转载于:https://www.cnblogs.com/JustOneJob/archive/2009/03/20/1417721.html
-
通过javaMail发送邮件,可选添加多个收件人,密送,抄送,多个附件,超实用
2018-03-23 13:48:46收件人地址,附件,选择是否保存,设置自己发送邮件时的昵称就ok了。代码自动匹配设置smtp服务地址和端口。 发送邮件需要邮箱地址和密码,开启POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务。各大邮箱使用外部登录...自己通过学习多人的代码,并整理了一个简单,调用方便的通过javaMail发送邮件。只需填写发件邮箱地址,密码;收件人地址,附件,选择是否保存,设置自己发送邮件时的昵称就ok了。代码自动匹配设置smtp服务地址和端口。
发送邮件需要邮箱地址和密码,开启POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务。各大邮箱使用外部登录验证的方式不一样,有些需要使用授权码登录链接,有些只需要邮箱登录密码,这个得根据你使用的邮箱服务平台的规定了。这里我收集了下面的邮箱smtp服务地址和端口,【QQ、Foxmail、139、126、163、Google(gmail)、Exchange、Outlook、sina.cn、sina.com】这些足以够用了吧!不多说,看代码。
使用方法
public static void main(String[] args) throws Exception { List<String> map = new ArrayList<>(); map.add("123456@qq.com"); map.add("456789@qq.com"); map.add("hahaha123@gmail.com"); new SendEmail("hahaha123@gmail.com", "密码") .setDebug(true) .setMyNickName("这是我的昵称") .addFile("C:/Users/25171/Pictures/timg.jpg")//添加附件 .addFile("C:/Users/25171/Desktop/QQ图片20180317192741.jpg") // .addFile(List<String> list)//添加附件集合 .setSaveEmail("C:/User/2517/Desktop/name.eml")//保存邮件 .addRecipientT0("251716795@qq.com")//添加收件人地址 // .addRecipientT0(map)//添加收件人地址集合 // .addRecipientCC(map)//添加密送收件人地址 // .addRecipientBCC(map)//添加抄送收件人地址 .createMail("标题", "发送的内容", "text/html;charset=utf-8") .sendEmail(new SendEmail.Callback() { @Override public void success(String s) { System.out.println(s);//发送完成后回调接口 } @Override public void error(String s, Exception e) { System.out.println(s); e.printStackTrace();//异常失败的回调接口 } }); }
主体工具代码
package com.sai.mail; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.*; import javax.mail.internet.*; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.util.*; public class SendEmail { public interface Callback { void success(String s); void error(String s, Exception e); } private Callback callback; //信息回调接口 private Properties properties;//系统属性对象 private String mailAccount; //发送邮箱地址 private String mailPassword; //验证密码 private Session session; //邮件会话对象 private String myNickName; //昵称,发送时自己的昵称 private boolean debug = false;//debug模式 private boolean isSaveEmail = false; private String pathName = "exc.eml";//邮件保存时的 public SendEmail(String mailAccount, String mailPassword) { this.mailAccount = mailAccount; this.mailPassword = mailPassword; } public SendEmail setSaveEmail(String pathName) { isSaveEmail = true; this.pathName = pathName; return this; } private List<String> recipientT0List = new ArrayList<>();//收件地址 private List<String> recipientCCList = new ArrayList<>();//密送地址 private List<String> recipientBCCList = new ArrayList<>();//抄送地址 private List<String> filePath = new ArrayList<>();//附件 public SendEmail setDebug(boolean sessionDebug) { debug = sessionDebug; return this; } /*** 设置多人收件人地址 */ public SendEmail addRecipientT0(String address) { recipientT0List.add(address); return this; } public SendEmail addRecipientCC(String address) { recipientCCList.add(address); return this; } public SendEmail addRecipientBCC(String address) { recipientBCCList.add(address); return this; } public SendEmail addRecipientT0(List<String> address) { recipientT0List.addAll(address); return this; } public SendEmail addRecipientCC(List<String> address) { recipientCCList.addAll(address); return this; } public SendEmail addRecipientBCC(List<String> address) { recipientBCCList.addAll(address); return this; } /***添加文件***/ public SendEmail addFile(String filePath) { this.filePath.add(filePath); return this; } public SendEmail addFile(List<String> list) { this.filePath.addAll(list); return this; } /****昵称设置**/ public SendEmail setMyNickName(String name) { myNickName = name; return this; } private MimeMessage message; /** * @param title 主题 * @param datas 内容 * @param type 内容格式类型 text/html;charset=utf-8 * @return s */ public SendEmail createMail(String title, String datas, String type) { if (mailAccount.length() == 0 || mailAccount.equals(null)) { System.err.println("发件地址不存在!"); return this; } if (myNickName == null) { myNickName = mailAccount; } getProperties(); if (!sync) return this; try { message = new MimeMessage(session); // 设置发送邮件地址,param1 代表发送地址 param2 代表发送的名称(任意的) param3 代表名称编码方式 message.setFrom(new InternetAddress(mailAccount, myNickName, "utf-8")); setRecipientT0(); //添加接收人地址 setRecipientCC(); //添加抄送接收人地址 setRecipientBCC(); //添加密送接收人地址 BodyPart messageBodyPart = new MimeBodyPart(); // 创建消息部分 Multipart multipart = new MimeMultipart(); // 创建多重消息 messageBodyPart.setContent(datas, type); // 消息内容 multipart.addBodyPart(messageBodyPart); // 设置文本消息部分 addFile(multipart); //附件部分 // 发送完整消息 message.setContent(multipart); message.setSubject(title); // 设置邮件主题 message.setSentDate(new Date()); // 设置发送时间 message.saveChanges(); // 保存上面的编辑内容 // 将上面创建的对象写入本地 saveEmail(title); } catch (Exception e) { if (callback != null) callback.error("message error ", e); sync = false; } return this; } public void sendEmail(Callback callback) { this.callback = callback; if (!sync) return; try { Transport trans = session.getTransport(); // 链接邮件服务器 trans.connect(mailAccount, mailPassword); // 发送信息 trans.sendMessage(message, message.getAllRecipients()); // 关闭链接 trans.close(); if (callback != null) callback.success("发送完成"); } catch (Exception e) { if (callback != null) callback.error("发送异常", e); } } private void saveEmail(String title) throws IOException, MessagingException { OutputStream out = null; if (isSaveEmail) { if (pathName.length() == 0 || pathName.equals(null)) { out = new FileOutputStream(title + ".eml"); } else { String path[] = pathName.split("\\."); out = new FileOutputStream(path[0] + title + ".eml"); } } message.writeTo(out); out.flush(); out.close(); } /*** 设置收件人地址信息*/ private void setRecipientT0() throws MessagingException, UnsupportedEncodingException { if (recipientT0List.size() > 0) { InternetAddress[] sendTo = new InternetAddress[recipientT0List.size()]; for (int i = 0; i < recipientT0List.size(); i++) { System.out.println("发送到:" + recipientT0List.get(i)); sendTo[i] = new InternetAddress(recipientT0List.get(i), "", "UTF-8"); } message.addRecipients(MimeMessage.RecipientType.TO, sendTo); } } /***设置密送地址**/ private void setRecipientCC() throws MessagingException, UnsupportedEncodingException { if (recipientCCList.size() > 0) { InternetAddress[] sendTo = new InternetAddress[recipientCCList.size()]; for (int i = 0; i < recipientCCList.size(); i++) { System.out.println("发送到:" + recipientCCList.get(i)); sendTo[i] = new InternetAddress(recipientCCList.get(i), "", "UTF-8"); } message.addRecipients(MimeMessage.RecipientType.CC, sendTo); } } /***设置抄送邮件地址**/ private void setRecipientBCC() throws MessagingException, UnsupportedEncodingException { if (recipientBCCList.size() > 0) { InternetAddress[] sendTo = new InternetAddress[recipientBCCList.size()]; for (int i = 0; i < recipientBCCList.size(); i++) { System.out.println("发送到:" + recipientBCCList.get(i)); sendTo[i] = new InternetAddress(recipientBCCList.get(i), "", "UTF-8"); } message.addRecipients(MimeMessage.RecipientType.BCC, sendTo); } } /***添加附件****/ private void addFile(Multipart multipart) throws MessagingException, UnsupportedEncodingException { if (filePath.size() == 0) return; for (int i = 0; i < filePath.size(); i++) { MimeBodyPart messageBodyPart = new MimeBodyPart(); // 选择出每一个附件名 String pathName = filePath.get(i); System.out.println("添加附件 ====>" + pathName); // 得到数据源 FileDataSource fds = new FileDataSource(pathName); // 得到附件本身并至入BodyPart messageBodyPart.setDataHandler(new DataHandler(fds)); //采用这去除中文乱码 messageBodyPart.setFileName(MimeUtility.encodeText(fds.getName())); multipart.addBodyPart(messageBodyPart); } } private boolean sync = true; /** * 规定设置 传输协议为smtp 根据输入的邮箱地址自动匹配smtp服务器地址与smtp服务器地址端口 */ private void getProperties() { String account[] = mailAccount.split("@"); String mailTpye = ""; try { mailTpye = account[1]; } catch (Exception e) { System.err.println("不正确的邮箱地址!"); sync = false; return; } String SMTPHost = "";//smtp服务器地址 String SMTPPort = "";//smtp服务器地址端口 switch (mailTpye) { case "qq.com": case "foxmail.com": SMTPHost = "smtp.qq.com"; SMTPPort = "465"; break; case "sina.com": SMTPHost = "smtp.sina.com"; SMTPPort = "25"; break; case "sina.cn": SMTPHost = "smtp.sina.cn"; SMTPPort = "25"; break; case "139.com": SMTPHost = "smtp.139.com"; SMTPPort = "465"; break; case "163.com": SMTPHost = "smtp.163.com"; SMTPPort = "25"; break; case "188.com": SMTPHost = "smtp.188.com"; SMTPPort = "25"; break; case "126.com": SMTPHost = "smtp.126.com"; SMTPPort = "25"; break; case "gmail.com": SMTPHost = "smtp.gmail.com"; SMTPPort = "465"; break; case "outlook.com": SMTPHost = "smtp.outlook.com"; SMTPPort = "465"; break; default: System.err.println("暂时不支持此账号作为服务账号发送邮件!"); return; } Properties prop = new Properties(); prop.setProperty("mail.transport.protocol", "smtp"); // 设置邮件传输采用的协议smtp prop.setProperty("mail.smtp.host", SMTPHost);// 设置发送人邮件服务器的smtp地址 prop.setProperty("mail.smtp.auth", "true"); // 设置验证机制 prop.setProperty("mail.smtp.port", SMTPPort);// SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接, prop.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); prop.setProperty("mail.smtp.socketFactory.fallback", "false"); prop.setProperty("mail.smtp.socketFactory.port", SMTPPort); properties = prop; session = Session.getInstance(properties); session.setDebug(debug); } }
完成这些需要导入的重要jar包:mail-1.4.1.jar(或者更高的版本) 和 activation 包,jdk1.8中rt.jar包含的activation 包。所以jdk1.8的就无需考虑activation 怎么下载了。
完成解析分配服务器地址和端口的主要函数(写的不怎么好):
private void getProperties() { String account[] = mailAccount.split("@"); String mailTpye = ""; try { mailTpye = account[1]; } catch (Exception e) { System.err.println("不正确的邮箱地址!"); sync = false; return; } String SMTPHost = "";//smtp服务器地址 String SMTPPort = "";//smtp服务器地址端口 switch (mailTpye) { case "qq.com": case "foxmail.com": SMTPHost = "smtp.qq.com"; SMTPPort = "465"; break; case "sina.com": SMTPHost = "smtp.sina.com"; SMTPPort = "25"; break; case "sina.cn": SMTPHost = "smtp.sina.cn"; SMTPPort = "25"; break; case "139.com": SMTPHost = "smtp.139.com"; SMTPPort = "465"; break; case "163.com": SMTPHost = "smtp.163.com"; SMTPPort = "25"; break; case "188.com": SMTPHost = "smtp.188.com"; SMTPPort = "25"; break; case "126.com": SMTPHost = "smtp.126.com"; SMTPPort = "25"; break; case "gmail.com": SMTPHost = "smtp.gmail.com"; SMTPPort = "465"; break; case "outlook.com": SMTPHost = "smtp.outlook.com"; SMTPPort = "465"; break; default: System.err.println("暂时不支持此账号作为服务账号发送邮件!"); return ; } Properties prop = new Properties(); prop.setProperty("mail.transport.protocol", "smtp"); // 设置邮件传输采用的协议smtp prop.setProperty("mail.smtp.host", SMTPHost);// 设置发送人邮件服务器的smtp地址 prop.setProperty("mail.smtp.auth", "true"); // 设置验证机制 prop.setProperty("mail.smtp.port", SMTPPort);// SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加 prop.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); prop.setProperty("mail.smtp.socketFactory.fallback", "false"); prop.setProperty("mail.smtp.socketFactory.port", SMTPPort); properties = prop; session = Session.getInstance(properties); session.setDebug(debug); }
最后看看效果:
-
python 自动发邮件模块抄送_一个python的邮件发送脚本,自动,定时,可以附件发送,抄送...
2021-01-13 20:23:45#mail.py使用方法:1,本脚本同目录下文件介绍:sender.list:邮件发送者邮箱和密码,第一行账号(如example@example.com),第二行密码(必须项,不能为...邮件抄送者列表,每行一个收件人(如example@example.com)调用方... -
邮箱中的抄送和密送
2010-12-29 20:47:00抄送:比如邮件要发给技术部,同时想发给保卫部、财务部,你就在抄送...抄送就是 你写的这封邮件除了传送给收件人,还会传送给你在抄送一栏里写的邮箱地址,并且收件人知道你把这封邮件发给了他和抄送一栏里输入的邮件 -
web的邮件抄送和密送
2016-12-03 23:12:33张三给李四发了一封邮件,抄送给王五,内容是:我爱你,那么张三爱的是谁呢?...收件人看到邮箱的结果:(能够看到邮件抄送给谁了,但是看不到密送给谁了) 抄送人sohu看到的结果: 密送人(新浪)看到结果: -
关于smtp发信的收件人to cc和bcc
2011-01-19 13:56:00比如我们用foxmail收到一封信,你在foxmail里看到的这封信的所有内容就是信体部分,包含发件人,收件人,抄送,标题等。 当一封信有多个收件人,包含to,cc和bcc,smtp协议首先会把所有的收件人逐个进行rcpt t... -
csdn是实现发送邮箱带附件,抄送
2018-10-14 22:10:32smtplib模块主要负责发送邮件:是一个发送邮件的动作,连接邮箱服务器,登录邮箱,发送邮件(有发件人,收信人,邮件内容)。 email模块主要负责构造邮件:指的是邮箱页面显示的一些构造,如发件人,收件... -
smtplib 抄送邮件_手把手教你如何使用Python实现自动化邮件推送
2020-12-23 16:03:18在利用Python进行发送邮件时主要借助smtplib和email两个模块,其中smtplib主要用来建立服务器链接、服务器断开的工作,而email模块主要用来设置一些与邮件本身相关的内容,比如收件人、发件人、... -
深入分析JavaWeb Item42 -- JavaMail创建邮件和发送邮件
2016-01-04 19:22:35一、RFC882文档简单说明 RFC882文档规定了...from字段 –用于指明发件人 to字段 –用于指明收件人 subject字段 –用于说明邮件主题 cc字段 – 抄送,将邮件发送给收件人的同时抄送给另一个收件人,收件人可以看到邮件 -
java编写一个邮件程序显示收件箱中所有的邮件列表_邮件功能开发--JavaMail
2021-03-09 08:34:43本节摘要:本节主要简单介绍一下javamail插件的使用引入:最近项目中要做一个简单的邮件功能,即从前台输入邮件内容,去配置文件中读取发件人、收件人等信息后,然后发送邮件到指定的邮箱,其中收件人和抄送人可以有... -
phpmail通过qq发邮箱失败_PHP中利用PHPMailer配合QQ邮箱实现发邮件
2020-12-21 17:20:27WordPress好像禁用了mail()函数,也不能直接使用自带的发送邮件,以防止暴露IPPHPMailer的介绍:可运行在任何平台之上支持SMTP验证发送邮时指定多个收件人,抄送地址,暗送地址和回复地址;注:添加抄送、暗送仅win... -
PHP中利用PHPMailer实现发邮件
2017-07-08 20:49:03支持SMTP验证;发送邮时指定多个收件人,抄送地址,暗送地址和回复地址;注:添加抄送、暗送仅win平台下smtp方式支持;支持多种邮件编码包括:8bit,base64,binary和quoted-printable; 自定义邮件头信息; -
C#中自定义邮件发送类(支持多人多附件) .
2012-07-26 17:00:38MailMessage类,用于构造电子邮件 ●MailAttachment类,用于构造电子邮件附件 ... ★From 发件人的地址 ★To 以分号分隔的收件人的地址列表 ★Cc 以分号隔开的抄送的收件人的邮件地址列表 ★Subjec -
实例分析PHP中PHPMailer发邮件
2021-01-20 01:27:03发送邮时指定多个收件人,抄送地址,暗送地址和回复地址;注:添加抄送、暗送仅win平台下smtp方式支持;支持多种邮件编码包括:8bit,base64,binary和quoted-printable;自定义邮件头信息,这跟php中通过header函数... -
发邮件的的习惯(转自公司wiki)
2009-09-14 12:14:001、收件人和抄送:主题分明,需要谁去办的,那么谁就应该出现在收件人列表中;谁需要知道一下而已的,应该出现在抄送列表当中。虽然道理很简单,还是要注意,切忌将不相干的人员加入其中,造成泄密和不必要的麻烦。 ... -
C#中自定义邮件发送类(支持多人多附件)
2009-07-07 23:50:00●MailMessage类,用于构造电子邮件●MailAttachment类,用于构造电子邮件附件●SmtpMail类,用于发送电子邮件及其附件1、MailMessage类构造电子邮件此类主要有以下属性和方法★From 发件人的地址★To 以分号分隔的收件... -
JavaMail创建邮件和发送邮件
2016-01-05 15:18:54一、RFC882文档简单说明 ...from字段 –用于指明发件人to字段 –用于指明收件人subject字段 –用于说明邮件主题cc字段 – 抄送,将邮件发送给收件人的同时抄送给另一个收件人,收件人可以看到邮件抄 -
phpmailer PHP发邮件
2013-08-02 16:11:15在发送邮时指定多个收件人,抄送地址,暗送地址和回复地址 *.支持多种邮件编码包括:8bit,base64,binary和quoted-printable *.支持SMTP验证 *.支持冗余SMTP服务器 *.支持带附件的邮件和Html格式的邮件 *.自定义... -
java 邮件提醒功能_利用ical4j和javamail发送会议邀请实现邮件发送提醒功能
2021-02-12 23:38:27/****@paramsenderAccount 发件人账号*@paramsenderPassword 发件人密码*@paramtoAddress 收件人邮箱地址*@paramccAddress 抄送人地址*@paramnoticeTitle subject的标题*@paramnoticeContent subject的内容*@... -
MailCore 快速入门指南
2012-11-19 16:37:08发送邮件MailCore封装了所有MIME编码和SMTP协议细节,使用它发送...首先,创建CTCoreMessage对象,设置主题、正文、发件人、至少一个收件人/抄送/密送。注意,收件人/密送人/抄送属性是一个NSSet,包含多个CTCoreAdd -
C#中自定义邮件发送类(支持多人多附件)
2009-07-07 23:50:00●MailMessage类,用于构造电子邮件●MailAttachment类,用于构造电子邮件附件●SmtpMail类,用于发送电子邮件及其附件1、MailMessage类构造电子邮件 此类主要有以下属性和方法 ★From 发件人的地址 ★To 以分号... -
PHP中利用PHPMailer配合QQ邮箱实现发邮件
2019-10-06 09:05:32发送邮时指定多个收件人,抄送地址,暗送地址和回复地址;注:添加抄送、暗送仅win平台下smtp方式支持 支持多种邮件编码包括:8bit,base64,binary和quoted-printable 支持冗余SMTP服务器,即可以指定主smtp... -
python发送邮件 退回_【破案了】python发邮件问题,求助!为什么总被退回?
2021-01-29 15:10:29[Python] 纯文本查看 复制代码message['To'] = Header(to_receiver)message['Cc'] = Header(cc_receiver)把收件人和抄送人用Header方法封装一下就不会被挡了!真是开心。再补充一下:如果你想抄送很多人... -
java邮箱设置密送_JavaWeb中JavaMail创建邮件和发送邮件
2021-03-03 13:10:36邮件头包含的内容有:from字段 --用于指明发件人to字段 --用于指明收件人subject字段 --用于说明邮件主题cc字段 -- 抄送,将邮件发送给收件人的同时抄送给另一个收件人,收件人可以看到邮件抄送给了谁bc... -
利用ical4j和javamail发送会议邀请实现邮件发送提醒功能
2019-09-29 18:44:02基于JavaMail的日历(会议)邮件发送实现 /** * * @param senderAccount 发件人账号 * @param senderPassword 发件人密码 ... * @param toAddress 收件人邮箱地址 ... * @param ccAddress 抄送人地址 * @pa...