qser-mailer: swiftmailer 的快捷助手

如果本文图片显示不出来,请看我的博客 http://vb2005xu.iteye.com/blog/2114518

近日在对charsen的修改版上进行了再次的修改与调整,对原版的qee v3 做了更多的bug修改,目前经过测试基本可以使用,虽然还有一些坑,但是代码量始终只有那么一点,填补起来应该很方便,加上qee-v3确实有些技术知识点可供学习..

因 为 qee-v3 只给出了一些极简单的库支持,而邮件功能在项目开发过程中又是不可或缺的部分,所以就集成了swiftmailer, 这个库在国外的知名度蛮高的,在性能上比phpmailer要好不少,尤其是对大附件的支持上.唯独的缺陷就是中文文档太少,为了方便使用,故对其做了如 下封装....

如果非要对这个封装代码起个名字,那就叫做 qser-mailer 吧

先给出一个如何使用的demo,个人感觉还是比较方便和简单的

Php代码  

  1. <?php
  2. namespace qser\app\actions;
  3. use qeephp\mvc\BaseAction;
  4. use qeephp\Config;
  5. use qeephp\tools\Logger;
  6. use qeephp\storage\mysql\DataSource;
  7. use qeephp\storage\Meta;
  8. use qser\app\models\Post;
  9. use qser\libraries\Validator;
  10. use qser\libraries\PinyinLib;
  11. class IndexAction extends BaseAction
  12. {
  13. /**
  14. * @var mysql\DataSource
  15. */
  16. private $_ds;
  17. private $_handle;
  18. function execute()
  19. {
  20. try{
  21. $post5 = Post::find_one(5);
  22. }
  23. catch( \Exception $ex )
  24. {
  25. Logger::instance(‘test‘)->fatal($ex);
  26. }
  27. Logger::instance(‘test‘)->debug($post5);
  28. dump(‘indexAction‘,PinyinLib::topinyin("我爱北京天门"));
  29. ///dump($this->app);
  30. // $value = 7;
  31. // $result = Validator::validateBatch($value, array(array(‘is_int‘),array(‘between‘, 2, 6)));
  32. // var_dump($result);
  33. $this->view(array(‘action‘ => ‘a‘, __DIR__));
  34. <span style="color: #ff6600;"><strong>$email = array(‘[email protected]‘);
  35. $content = $this->result;
  36. $this->app->tool(‘mail‘)->mailer->send(function($message) use($email,$content)
  37. {
  38. $text = $content->execute();
  39. $message->to($email)->subject(‘qeev3 测试邮件‘);
  40. $message->setBody($text, 0 ? ‘text/plain‘ : ‘text/html‘);
  41. $message->attachData($text,‘runtest‘,array(‘as‘ => $message->encodeAttachmentName(‘啥都好说‘)));
  42. $message->attach(MYAPP_SRC_PATH . ‘/tmp/tests.log‘,array(‘as‘ => $message->encodeAttachmentName(‘尼玛‘)));
  43. });
  44. </strong></span>
  45. //      dump($this->app->tool(‘mail‘)->mailer , $email);
  46. //
  47. //dump( $post5 );
  48. /*
  49. $sql = ‘show tables‘;
  50. $result = $this->_ds->execute($sql);
  51. dump($result,$sql); // out resource
  52. $result = $this->_ds->find_one(‘post‘,null);
  53. dump($result,‘post_one‘);
  54. $result = $this->_ds->find(‘post‘,null)->fetch();
  55. dump($result,‘fetch‘);
  56. $result = $this->_ds->find(‘post‘,null)->sort(‘post_id DESC‘)->fetch();
  57. dump($result,‘fetch by sort‘);
  58. */
  59. //$result = $this->_ds->find(‘post‘,null)->fetch_all();
  60. // dump($result,‘fetch_all‘);
  61. //
  62. //$meta = new Meta(‘qser\\app\\models\\Revision‘);
  63. //$meta = array();
  64. // dump( $meta ,‘meta‘);
  65. }
  66. protected function __before_execute()
  67. {
  68. // init resource
  69. // $this->_ds = new DataSource( Config::get(‘storage.domains.default‘) );
  70. // $this->_ds->connect();
  71. // $this->_ds->set_logger(Logger::instance(‘test‘));
  72. // $this->_handle = $this->_ds->handle();
  73. // $this->_ds->execute(‘SET AUTOCOMMIT=0‘);
  74. // $this->_ds->execute(‘START TRANSACTION‘);
  75. // foreach (self::post_recordset() as $post)
  76. // {
  77. //     $this->_ds->insert(‘qser_posts‘, $post);
  78. // }
  79. // $this->_ds->execute(‘COMMIT‘);
  80. // $this->_ds->execute(‘SET AUTOCOMMIT=1‘);
  81. return true;
  82. }
  83. // test func
  84. static function post_recordset($begin_post_id = 31)
  85. {
  86. static $authors = array(‘dualface‘, ‘liaoyulei‘, ‘lownr‘, ‘dox‘, ‘quietlife‘);
  87. $recordset = array();
  88. for ($post_id = $begin_post_id; $post_id < $begin_post_id + 10; $post_id++)
  89. {
  90. $author = $authors[mt_rand(0, count($authors) - 1)];
  91. $recordset[$post_id] = array(
  92. ‘post_id‘ => $post_id,
  93. ‘title‘ => ‘post ‘ . $post_id,
  94. ‘author‘ => $author,
  95. ‘click_count‘ => mt_rand(1, 999),
  96. );
  97. }
  98. return $recordset;
  99. }
  100. static function revisions_recordset($begin_post_id = 1)
  101. {
  102. $recordset = array();
  103. $created = time();
  104. for ($post_id = $begin_post_id; $post_id < $begin_post_id + 5; $post_id++)
  105. {
  106. $num_rev = mt_rand(1, 5);
  107. for ($i = 0; $i < $num_rev; $i++)
  108. {
  109. $recordset[] = array(
  110. ‘post_id‘ => $post_id,
  111. ‘body‘    => sprintf(‘post %u rev %u‘, $post_id, $i),
  112. ‘created‘ => $created,
  113. );
  114. }
  115. }
  116. return $recordset;
  117. }
  118. }

测试的结果蛮好,如图所示,中文附件名字也能正常显示,灰常给力是不是

------------------------------------------------------------
所有代码如下所示:

Php代码  

  1. <?php namespace qser\app\tools;
  2. use qeephp\mvc\App;
  3. use qser\libraries\Mail\Mailer;
  4. class MailTool
  5. {
  6. /**
  7. * 当前请求
  8. *
  9. * @var Mailer
  10. */
  11. public $mailer;
  12. /**
  13. * Create a new Mailer instance.
  14. *
  15. * @param App $app
  16. * @param array $config
  17. */
  18. public function __construct(App $app, array $config) {
  19. $this->mailer = new Mailer($config);
  20. }
  21. }

Php代码  

  1. <?php
  2. namespace qser\libraries\Mail;
  3. if (!defined(‘SWIFT_INIT_LOADED‘)) {
  4. require ROOT_PATH . ‘/packages/swiftmailer/lib/swift_init.php‘;
  5. }
  6. use Swift_Mailer;
  7. use Swift_Message;
  8. use qeephp\tools\Logger;
  9. use qser\libraries\Mail\Provider;
  10. class Mailer
  11. {
  12. /**
  13. * The Swift Mailer instance.
  14. *
  15. * @var \Swift_Mailer
  16. */
  17. protected $swift;
  18. /**
  19. * The global from address and name.
  20. *
  21. * @var array
  22. */
  23. protected $from;
  24. /**
  25. * The log writer instance.
  26. *
  27. * @var ILogger
  28. */
  29. protected $logger;
  30. /**
  31. * Indicates if the actual sending is disabled.
  32. *
  33. * @var bool
  34. */
  35. protected $pretending = false;
  36. /**
  37. * Array of failed recipients.
  38. *
  39. * @var array
  40. */
  41. protected $failedRecipients = array();
  42. /**
  43. * Create a new Mailer instance.
  44. *
  45. * @param  array  $config
  46. * @return void
  47. */
  48. public function __construct(array  $config)
  49. {
  50. $this->swift = Provider::registerSwiftMailer($config);
  51. $logger = val($config, ‘logger‘ , false);
  52. if ($logger)
  53. {
  54. $this->setLogger(Logger::instance($logger));
  55. }
  56. $from = val($config, ‘from‘ , false);
  57. if (is_array($from) && isset($from[‘address‘]))
  58. {
  59. $this->alwaysFrom($from[‘address‘], $from[‘name‘]);
  60. }
  61. // Here we will determine if the mailer should be in "pretend" mode for this
  62. // environment, which will simply write out e-mail to the logs instead of
  63. // sending it over the web, which is useful for local dev environments.
  64. $pretend = val($config, ‘pretend‘ , false);
  65. $this->pretend($pretend);
  66. }
  67. /**
  68. * Set the global from address and name.
  69. *
  70. * @param  string  $address
  71. * @param  string  $name
  72. * @return void
  73. */
  74. public function alwaysFrom($address, $name = null)
  75. {
  76. $this->from = compact(‘address‘, ‘name‘);
  77. }
  78. /**
  79. * Send a new message.
  80. *
  81. * @param  callback  $callback
  82. * @return int
  83. */
  84. public function send($callback)
  85. {
  86. $message = $this->createMessage();
  87. $data[‘message‘] = $message;
  88. if ($callback && is_callable($callback))
  89. {
  90. call_user_func($callback,$message);
  91. }
  92. else
  93. {
  94. throw new \InvalidArgumentException(‘Invalid mail send callback.‘);
  95. }
  96. $message = $message->getSwiftMessage();
  97. return $this->sendSwiftMessage($message);
  98. }
  99. /**
  100. * Send a Swift Message instance.
  101. *
  102. * @param  \Swift_Message  $message
  103. * @return int
  104. */
  105. protected function sendSwiftMessage($message)
  106. {
  107. if ( !$this->pretending)
  108. {
  109. return $this->swift->send($message, $this->failedRecipients);
  110. }
  111. elseif (isset($this->logger))
  112. {
  113. $this->logMessage($message);
  114. return 1;
  115. }
  116. }
  117. /**
  118. * Log that a message was sent.
  119. *
  120. * @param  \Swift_Message  $message
  121. * @return void
  122. */
  123. protected function logMessage($message)
  124. {
  125. $emails = implode(‘, ‘, array_keys((array) $message->getTo()));
  126. $this->logger->info("Pretending to mail message to: {$emails}");
  127. }
  128. /**
  129. * Create a new message instance.
  130. *
  131. * @return Message
  132. */
  133. protected function createMessage()
  134. {
  135. $message = new Message(new Swift_Message);
  136. // If a global from address has been specified we will set it on every message
  137. // instances so the developer does not have to repeat themselves every time
  138. // they create a new message. We will just go ahead and push the address.
  139. if (isset($this->from[‘address‘]))
  140. {
  141. $message->from($this->from[‘address‘], $this->from[‘name‘]);
  142. }
  143. return $message;
  144. }
  145. /**
  146. * Tell the mailer to not really send messages.
  147. *
  148. * @param  bool  $value
  149. * @return void
  150. */
  151. public function pretend($value = true)
  152. {
  153. $this->pretending = $value;
  154. }
  155. /**
  156. * Get the Swift Mailer instance.
  157. *
  158. * @return \Swift_Mailer
  159. */
  160. public function getSwiftMailer()
  161. {
  162. return $this->swift;
  163. }
  164. /**
  165. * Get the array of failed recipients.
  166. *
  167. * @return array
  168. */
  169. public function failures()
  170. {
  171. return $this->failedRecipients;
  172. }
  173. /**
  174. * Set the log writer instance.
  175. *
  176. * @param  Logger  $logger
  177. */
  178. public function setLogger(Logger $logger)
  179. {
  180. $this->logger = $logger;
  181. }
  182. }

Php代码  

  1. <?php namespace qser\libraries\Mail;
  2. use Swift_Mailer;
  3. use Swift_SmtpTransport as SmtpTransport;
  4. use Swift_MailTransport as MailTransport;
  5. use Swift_SendmailTransport as SendmailTransport;
  6. class Provider
  7. {
  8. /**
  9. * Register the Swift Mailer instance.
  10. *
  11. * @return \Swift_Mailer
  12. */
  13. public static function registerSwiftMailer($config)
  14. {
  15. $self = new static();
  16. return new Swift_Mailer( $self->registerSwiftTransport($config) );
  17. }
  18. /**
  19. * Register the Swift Transport instance.
  20. *
  21. * @param  array  $config
  22. * @return void
  23. *
  24. * @throws \InvalidArgumentException
  25. */
  26. protected function registerSwiftTransport($config)
  27. {
  28. switch ($config[‘driver‘])
  29. {
  30. case ‘smtp‘:
  31. return $this->registerSmtpTransport($config);
  32. case ‘sendmail‘:
  33. return $this->registerSendmailTransport($config);
  34. case ‘mail‘:
  35. return $this->registerMailTransport($config);
  36. default:
  37. throw new \InvalidArgumentException(‘Invalid mail driver.‘);
  38. }
  39. }
  40. /**
  41. * Register the SMTP Swift Transport instance.
  42. *
  43. * @param  array  $config
  44. * @return void
  45. */
  46. protected function registerSmtpTransport($config)
  47. {
  48. // The Swift SMTP transport instance will allow us to use any SMTP backend
  49. // for delivering mail such as Sendgrid, Amazon SMS, or a custom server
  50. // a developer has available. We will just pass this configured host.
  51. $transport = SmtpTransport::newInstance($config[‘host‘], $config[‘port‘]);
  52. if (!emptyempty($config[‘encryption‘]))
  53. {
  54. $transport->setEncryption($config[‘encryption‘]);
  55. }
  56. // Once we have the transport we will check for the presence of a username
  57. // and password. If we have it we will set the credentials on the Swift
  58. // transporter instance so that we‘ll properly authenticate delivery.
  59. if (!emptyempty($config[‘username‘]))
  60. {
  61. $transport->setUsername($config[‘username‘]);
  62. $transport->setPassword($config[‘password‘]);
  63. }
  64. return $transport;
  65. }
  66. /**
  67. * Register the Sendmail Swift Transport instance.
  68. *
  69. * @param  array  $config
  70. * @return void
  71. */
  72. protected function registerSendmailTransport($config)
  73. {
  74. return SendmailTransport::newInstance($config[‘sendmail‘]);
  75. }
  76. /**
  77. * Register the Mail Swift Transport instance.
  78. *
  79. * @param  array  $config
  80. * @return void
  81. */
  82. protected function registerMailTransport($config)
  83. {
  84. return MailTransport::newInstance();
  85. }
  86. /**
  87. * Get the services provided by the provider.
  88. *
  89. * @return array
  90. */
  91. public function provides()
  92. {
  93. return array(‘mailer‘, ‘swift.mailer‘, ‘swift.transport‘);
  94. }
  95. }

Php代码  

  1. <?php namespace qser\libraries\Mail;
  2. use Swift_Image;
  3. use Swift_Attachment;
  4. class Message {
  5. /**
  6. * The Swift Message instance.
  7. *
  8. * @var \Swift_Message
  9. */
  10. protected $swift;
  11. /**
  12. * Create a new message instance.
  13. *
  14. * @param  \Swift_Message  $swift
  15. * @return void
  16. */
  17. public function __construct($swift)
  18. {
  19. $this->swift = $swift;
  20. }
  21. /**
  22. * Add a "from" address to the message.
  23. *
  24. * @param  string  $address
  25. * @param  string  $name
  26. * @return \qser\libraries\Mail\Message
  27. */
  28. public function from($address, $name = null)
  29. {
  30. $this->swift->setFrom($address, $name);
  31. return $this;
  32. }
  33. /**
  34. * Set the "sender" of the message.
  35. *
  36. * @param  string  $address
  37. * @param  string  $name
  38. * @return \qser\libraries\Mail\Message
  39. */
  40. public function sender($address, $name = null)
  41. {
  42. $this->swift->setSender($address, $name);
  43. return $this;
  44. }
  45. /**
  46. * Set the "return path" of the message.
  47. *
  48. * @param  string  $address
  49. * @return \qser\libraries\Mail\Message
  50. */
  51. public function returnPath($address)
  52. {
  53. $this->swift->setReturnPath($address);
  54. return $this;
  55. }
  56. /**
  57. * Add a recipient to the message.
  58. *
  59. * @param  string|array  $address
  60. * @param  string  $name
  61. * @return \qser\libraries\Mail\Message
  62. */
  63. public function to($address, $name = null)
  64. {
  65. return $this->addAddresses($address, $name, ‘To‘);
  66. }
  67. /**
  68. * Add a carbon copy to the message.
  69. *
  70. * @param  string  $address
  71. * @param  string  $name
  72. * @return \qser\libraries\Mail\Message
  73. */
  74. public function cc($address, $name = null)
  75. {
  76. return $this->addAddresses($address, $name, ‘Cc‘);
  77. }
  78. /**
  79. * Add a blind carbon copy to the message.
  80. *
  81. * @param  string  $address
  82. * @param  string  $name
  83. * @return \qser\libraries\Mail\Message
  84. */
  85. public function bcc($address, $name = null)
  86. {
  87. return $this->addAddresses($address, $name, ‘Bcc‘);
  88. }
  89. /**
  90. * Add a reply to address to the message.
  91. *
  92. * @param  string  $address
  93. * @param  string  $name
  94. * @return \qser\libraries\Mail\Message
  95. */
  96. public function replyTo($address, $name = null)
  97. {
  98. return $this->addAddresses($address, $name, ‘ReplyTo‘);
  99. }
  100. /**
  101. * Add a recipient to the message.
  102. *
  103. * @param  string|array  $address
  104. * @param  string  $name
  105. * @param  string  $type
  106. * @return \qser\libraries\Mail\Message
  107. */
  108. protected function addAddresses($address, $name, $type)
  109. {
  110. if (is_array($address))
  111. {
  112. $this->swift->{"set{$type}"}($address, $name);
  113. }
  114. else
  115. {
  116. $this->swift->{"add{$type}"}($address, $name);
  117. }
  118. return $this;
  119. }
  120. /**
  121. * Set the subject of the message.
  122. *
  123. * @param  string  $subject
  124. * @return \qser\libraries\Mail\Message
  125. */
  126. public function subject($subject)
  127. {
  128. $this->swift->setSubject($subject);
  129. return $this;
  130. }
  131. /**
  132. * Set the message priority level.
  133. *
  134. * @param  int  $level
  135. * @return \qser\libraries\Mail\Message
  136. */
  137. public function priority($level)
  138. {
  139. $this->swift->setPriority($level);
  140. return $this;
  141. }
  142. /**
  143. * 编码附件名称(可用于显示中文附件名)
  144. *
  145. * @param  string  $file
  146. *
  147. * @return string
  148. */
  149. public function encodeAttachmentName($name)
  150. {
  151. return "=?UTF-8?B?" . base64_encode($name) . "?=";
  152. }
  153. /**
  154. * Attach a file to the message.
  155. *
  156. * @param  string  $file
  157. * @param  array   $options
  158. * @return \qser\libraries\Mail\Message
  159. */
  160. public function attach($file, array $options = array())
  161. {
  162. $attachment = $this->createAttachmentFromPath($file);
  163. return $this->prepAttachment($attachment, $options);
  164. }
  165. /**
  166. * Create a Swift Attachment instance.
  167. *
  168. * @param  string  $file
  169. * @return \Swift_Attachment
  170. */
  171. protected function createAttachmentFromPath($file)
  172. {
  173. return Swift_Attachment::fromPath($file);
  174. }
  175. /**
  176. * Attach in-memory data as an attachment.
  177. *
  178. * @param  string  $data
  179. * @param  string  $name
  180. * @param  array   $options
  181. * @return \qser\libraries\Mail\Message
  182. */
  183. public function attachData($data, $name, array $options = array())
  184. {
  185. $attachment = $this->createAttachmentFromData($data, $name);
  186. return $this->prepAttachment($attachment, $options);
  187. }
  188. /**
  189. * Create a Swift Attachment instance from data.
  190. *
  191. * @param  string  $data
  192. * @param  string  $name
  193. * @return \Swift_Attachment
  194. */
  195. protected function createAttachmentFromData($data, $name)
  196. {
  197. return Swift_Attachment::newInstance($data, $name);
  198. }
  199. /**
  200. * Embed a file in the message and get the CID.
  201. *
  202. * @param  string  $file
  203. * @return string
  204. */
  205. public function embed($file)
  206. {
  207. return $this->swift->embed(Swift_Image::fromPath($file));
  208. }
  209. /**
  210. * Embed in-memory data in the message and get the CID.
  211. *
  212. * @param  string  $data
  213. * @param  string  $name
  214. * @param  string  $contentType
  215. * @return string
  216. */
  217. public function embedData($data, $name, $contentType = null)
  218. {
  219. $image = Swift_Image::newInstance($data, $name, $contentType);
  220. return $this->swift->embed($image);
  221. }
  222. /**
  223. * Prepare and attach the given attachment.
  224. *
  225. * @param  \Swift_Attachment  $attachment
  226. * @param  array  $options
  227. * @return \qser\libraries\Mail\Message
  228. */
  229. protected function prepAttachment($attachment, $options = array())
  230. {
  231. // First we will check for a MIME type on the message, which instructs the
  232. // mail client on what type of attachment the file is so that it may be
  233. // downloaded correctly by the user. The MIME option is not required.
  234. if (isset($options[‘mime‘]))
  235. {
  236. $attachment->setContentType($options[‘mime‘]);
  237. }
  238. // If an alternative name was given as an option, we will set that on this
  239. // attachment so that it will be downloaded with the desired names from
  240. // the developer, otherwise the default file names will get assigned.
  241. if (isset($options[‘as‘]))
  242. {
  243. $attachment->setFilename($options[‘as‘]);
  244. }
  245. $this->swift->attach($attachment);
  246. return $this;
  247. }
  248. /**
  249. * Get the underlying Swift Message instance.
  250. *
  251. * @return \Swift_Message
  252. */
  253. public function getSwiftMessage()
  254. {
  255. return $this->swift;
  256. }
  257. /**
  258. * Dynamically pass missing methods to the Swift instance.
  259. *
  260. * @param  string  $method
  261. * @param  array   $parameters
  262. * @return mixed
  263. */
  264. public function __call($method, $parameters)
  265. {
  266. $callable = array($this->swift, $method);
  267. return call_user_func_array($callable, $parameters);
  268. }
  269. }

-------- 配置信息如下所示

写道

# Tools 设置

‘app.tools‘ => array(

# mail 工具配置

‘mail‘ => array(

‘class‘ => ‘qser\\app\\tools\\MailTool‘,

‘driver‘ => ‘smtp‘, #Supported: "smtp", "mail", "sendmail"

‘host‘ => ‘smtp.qq.com‘,

‘port‘ => 4650,

‘encryption‘ => ‘ssl‘,

‘username‘ => "[email protected]",

‘password‘ =>"qwaszyss",

‘pretend‘ => false,#启用此选项,邮件不会真正发送,而是写到日志文件中

‘logger‘ => ‘test‘, #使用日志对象

‘from‘ => array(‘address‘ => ‘[email protected]‘, ‘name‘ => ‘易结网‘),

),

),

时间: 2024-10-15 00:30:24

qser-mailer: swiftmailer 的快捷助手的相关文章

uTools电脑软件快速启动工具

https://gitee.com/weiyunwps618/codes/6jv2qwnx9yukd0g8p74co70 https://www.cnblogs.com/delphixx/p/11804484.html 电脑软件的快捷方式管理我选用uTools软件https://u.tools/uTools的缺点是安装包太大,足足有40多MB,但是非常要用所以首选uToolsuTools的另一个缺点是打开窗口没有类似Executor的历史列表窗口uTools是一个极简.插件化.跨平台的现代桌面软

手机怎么多开微信等应用?双开助手一件搞定

在电脑上,一个应用多开实现多账号登陆是司空见惯的事. 需要软件加Q.Q.285430839,或者加微信:xiao_zhiyang 或者直接点击下载http://cdn.onekeyrom.com/BD/WxMultOpen_10029.apk 比如QQ,一般用户都有生活.工作两个账号,或者说网络游戏玩家,一般很多玩家都会同时养多个小号,在需要的时候将多个小号一同登录,这也是用户的基本需求,但是-- 在手机时代就没那么幸运了,几乎所有的手机品牌.软件应用至今都不能实现应用多开,需要登录一个账号,另

Yii2 advance swiftmailer 不能发送邮件

我用的是Yii2高级模板,在配置好邮箱后,并编写测试,测试结果表明是发送成功的,但我的邮箱就是接受不了邮件. 经过排查发现,是由 common/config/main-local.php 文件的 'useFileTransport' => true这条配置造成的.一般来说只要安装好了Yii2高级模板之后,并初始化为dev环境后,你的common目录下会生成main-local.php文件,这个文件是你开发项目的时候的配置文件,它会覆盖main.php文件的配置.所以我将 'userFileTra

ThinkPHP 3.2.3 使用 Swift Mailer 邮件系统发送邮件

SwiftMailer 下载地址:https://github.com/swiftmailer/swiftmailer 版本:swiftmailer-5.x 把压缩包解压到 /ThinkPHP/Library/Vendor 中. 配置文件 config.php <?php return array( //'配置项'=>'配置值' // 邮件配置 'SMTP' => 'smtp.XXX.cn', 'MAIL_PORT' => 25, 'MAIL_USER' => '[email

Android远程桌面助手(Build 0662)

ARDC Build 0662, Jul 19, 2017 OPT: 1440*2560及以下分辨率设备,帧速能稳定在20帧~25帧 FIX: 拖拽文件的路径中包含空格的处理 ADD: 支持Ctrl+C.Ctrl+V拷贝中文字符串到Android设备 ADD: 灭屏状态下,左键点击屏幕后自动亮屏 ADD: 增加了赞赏界面,https://www.paypal.me/hejb/2.56 下载:http://files.cnblogs.com/files/we-hjb/ARDC%2820170719

【程序员小助手】Emacs,最强编辑器,没有之一

内容简介 1.Emacs简介 2.Emacs三个平台的安装与配置 3.自动补全插件 4.小编的Emacs配置文件 5.常用快捷方式 6.和版本控制系统的配合(以SVN为例) [程序员小助手]系列 在这个系列文章中(不定期更新),小编会把这些年(也没几年)的编程学习和工作中使用到的个人感觉非常好的软件推荐给大家,希望能够共享美好资源,使大家提高编程和办事效率. Emacs,最强编辑器,没有之一 小编知道,此标题一出,肯定会遭受广大群众“诟病”,说不好还会被其他编辑器的粉丝暗地里“干掉”. 比如,V

个人小软件——稻米文档助手

一:稻米文档助手是什么? 稻米文档助手是一款用于管理各种小型文档的个人文档管理类工具,而不是个人知识管理类软件. 它用于高效的组织管理我们平时下载收集的各种资料,为我们解决了文档存放位置多.版本多.分类难的困扰. 内置便捷的星级评价功能,有效的提高了文档的使用率. 二:稻米文档助手有什么能耐? (1)多方案支持 DocBox支持同时管理3组方案,在一组方案中,您可以同时自由管理一系列的文档库,针对每一个文档库,可以方便快捷的管理分类及文档. (2)多级分类 DocBox的文档库支持无限级类,依照

WPF学习开发客户端软件-任务助手(下)

时光如梭,距离第一次写的 WPF学习开发客户端软件-任务助手(已上传源码)  已有三个多月,期间我断断续续地对该项目做了优化.完善等等工作,现在重新向大家介绍一下,希望各位可以使用,本软件以实用性为主,采用MVVM模式(有小部分没有修改过来),小巧.使用方便. 具体功能与更新如下: 计划助手:本软件由[email protected]开发与维护,免费使用,如有好的意见或建议,可发送邮件到[email protected],谢谢使用!注(功能与特色):1.本软件使用方便.操作简便:2.本软件可设置

网络小助手项目开发总结报告

网络小助手项目开发总结报告 1引言 1.1编写目的 通过一段时间后对网络小助手项目进行详细开发和测试,该项目已经基本完成.本报告旨在将项目开发过程中的经验和不足之处进行总结,为以后的团队开发活动积累经验.本报告经审核后,交由软件工程老师王老师审查. 1.2背景 说明: a.  软件项目名称:网络小助手 b.  开发者:兰梦,李金吉,马翔,赵天,胡佳奇 用户:学生 系统运行环境:windows XP/windows 7/windows 8下的通用PC 1.3参考资料 <软件工程--原理,方法与应用